知识大全 Struts2的整体流程(上)

Posted 控制器

篇首语:知识投资收益最大。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Struts2的整体流程(上)相关的知识,希望对你有一定的参考价值。

Struts2的整体流程(上)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

    Struts 框架本身大致可以分为 个部分 核心控制器FilterDispatcher 业务控制器Action和用户实现的企业业务逻辑组件         核心控制器FilterDispatcher        核心控制器 FilterDispatcher是Struts 框架的基础 包含了框架内部的控制流程和处理机制 业务控制器Action和业务逻辑组件是需要用户来自己实现的 用户在开发Action和业务逻辑组件的同时 还需要编写相关的配置文件 供核心控制器FilterDispatcher来使用         Struts 的工作流程相对于Struts 要简单 与WebWork框架基本相同 所以说Struts 是WebWork的升级版本 Struts 框架按照模块来划分 可以分为Servlet Filters Struts核心模块 拦截器和用户实现部分 Struts 框架结构图如图 所示    

  

     图 Struts 框架结构图        一个请求在Struts 框架中的处理大概分为以下几个步骤         客户端提交一个(HttpServletRequest)请求 如上文在浏览器中输入        就是提交一个(HttpServletRequest)请求         请求被提交到一系列(主要是 层)的过滤器(Filter) 如(ActionContextCleanUp 其他过滤器(SiteMesh等) FilterDispatcher) 注意 这里是有顺序的 先ActionContext CleanUp 再其他过滤器(Othter Filters SiteMesh等) 最后到FilterDispatcher         FilterDispatcher是控制器的核心 就是MVC的Struts 实现中控制层(Controller)的核心         FilterDispatcher询问ActionMapper是否需要调用某个Action来处理这个(HttpServlet Request)请求 如果ActionMapper决定需要调用某个Action FilterDispatcher则把请求的处理交给ActionProxy         ActionProxy通过Configuration Manager(struts xml)询问框架的配置文件 找到需要调用的Action类 例如 用户注册示例将找到UserReg类         ActionProxy创建一个ActionInvocation实例 同时ActionInvocation通过代理模式调用Action 但在调用之前 ActionInvocation会根据配置加载Action相关的所有Interceptor(拦截器)         一旦Action执行完毕 ActionInvocation负责根据struts xml中的配置找到对应的返回结果result         Struts 的核心控制器是FilterDispatcher 有 个重要的方法 destroy() doFilter()和Init() 可以在Struts 的下载文件夹中找到源代码 如代码 所示         代码 核心控制器FilterDispatcher        public class FilterDispatcher implements StrutsStatics Filter         /**        * 定义一个Log实例        */        private static final Log LOG = LogFactory getLog(FilterDispatcher class)         … …        /**        * 存放属性文件中的 STRUTS_I N_ENCODING值        */        private static String encoding;        /**        * 定义ActionMapper实例        */        private static ActionMapper actionMapper;        /**        * 定义FilterConfig实例        */        private FilterConfig filterConfig;        protected Dispatcher dispatcher;        /**        * 创建一个默认的dispatcher 初始化filter        * 设置默认的packages     *        */        public void init(FilterConfig filterConfig) throws ServletException         this filterConfig = filterConfig;        dispatcher = createDispatcher(filterConfig)         dispatcher init()         String param = filterConfig getInitParameter( packages )         String packages = apache struts static template apache struts interceptor debugging ;        if (param != null)         packages = param + + packages;                this pathPrefixes = parse(packages)                 //销毁filter方法        public void destroy()         if (dispatcher == null)         LOG warn( something is seriously wrong Dispatcher is not initialized (null) )         else         dispatcher cleanup()                         /**        * 处理一个Action或者资源请求        *        * filter尝试将请求同action mapping相匹配        * 如果找到 将执行dispatcher的serviceAction方法        * 如果Action处理失败 doFilter将建立一个异常         *        * 如果请求静态资源        * 资源将被直接复制给 response        *        * 如果找不到匹配Action 或者静态资源 则直接跳出        public void doFilter(ServletRequest req ServletResponse res FilterChain chain) throws IOException ServletException         HttpServletRequest request = (HttpServletRequest) req;        HttpServletResponse response = (HttpServletResponse) res;        ServletContext servletContext = getServletContext()         String timerKey = FilterDispatcher_doFilter: ;        try         UtilTimerStack push(timerKey)         request = prepareDispatcherAndWrapRequest(request response)         ActionMapping mapping;        try         mapping=actionMapper getMapping(request dispatcher getConfigurationManager())         catch (Exception ex)         LOG error( error getting ActionMapping ex)         dispatcher sendError(request response servletContext HttpServletResponse SC_INTERNAL_SERVER_ERROR ex)         return;                if (mapping == null)         String resourcePath = RequestUtils getServletPath(request)         if ( equals(resourcePath) && null != request getPathInfo())         resourcePath = request getPathInfo()                 if (serveStatic && resourcePath startsWith( /struts ))         String name = resourcePath substring( /struts length())         findStaticResource(name request response)         else         //为一个普通的request 则通过        chain doFilter(request response)                 return;                /**        *这个方法询问ActionMapper是否需要调用某个Action来处理这个(request)请求         *如果ActionMapper决定需要调用某个Action         *FilterDispatcher则把请求的处理交给ActionProxy        dispatcher serviceAction(request response servletContext mapping)         finally         try         ActionContextCleanUp cleanUp(req)         finally         UtilTimerStack pop(timerKey)                                 … …                在doFilter()方法中 将调用dispatcher serviceAction 该方法如果找到相应的Action 将把用户请求交给ActionProxy serviceAction()代码在Dispatcher java中 如代码 所示         代码 Dispatcher类        public class Dispatcher         …        /**        * 为mapping加载类 并调用相应的方法或者直接返回result        *        * 根据用户请求的参数 建立Action上下文        * 根据指定的Action 名称和包空间名称 加载一个Action代理 ActionProxy        * 然后Action的相应方法将被执行         */        public void serviceAction(HttpServletRequest request HttpServletResponse response ServletContext context ActionMapping mapping) throws ServletException         Map extraContext = createContextMap(request response mapping context)         //如果存在一个值栈 则建立一个新的并复制以备Action使用        ValueStack stack = (ValueStack) request getAttribute(ServletActionContext STRUTS_VALUESTACK_KEY)         if (stack!= null)         extraContext put(ActionContext VALUE_STACK ValueStackFactory getFactory() createValueStack(stack))                 String timerKey = Handling request from Dispatcher ;        try         UtilTimerStack push(timerKey)         String namespace = mapping getNamespace()         String name = mapping getName()         String method = mapping getMethod()         Configuration config = configurationManager getConfiguration()         //FilterDispatcher把请求的处理交给ActionProxy        ActionProxy proxy = config getContainer() getInstance(ActionProxyFactory class) createActionProxy(namespace name extraContext true false)         proxy setMethod(method)         request setAttribute(ServletActionContext STRUTS_VALUESTACK_KEY proxy getInvocation() getStack())         //ActionMapping 直接返回一个result        if (mapping getResult() != null)         Result result = mapping getResult()         result execute(proxy getInvocation())         else         proxy execute()                 if (stack != null)         request setAttribute(ServletActionContext STRUTS_VALUESTACK_KEY stack)                 catch (ConfigurationException e)         LOG error( Could not find action or result e)         sendError(request response context HttpServletResponse SC_NOT_FOUND e)         catch (Exception e)         throw new ServletException(e)         finally         UtilTimerStack pop(timerKey)                         …                从上面代码中可以看出来 Struts 用于处理用户请求的Action实例 并不是用户实现的业务控制器 而是Action代理 关于Action代理相关内容 读者可以参考拦截器章节的介绍 cha138/Article/program/Java/ky/201311/27932

相关参考

知识大全 Struts2请求处理流程及源码分析

Struts2请求处理流程及源码分析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Struts

知识大全 考汽车驾照的整体流程是怎样的

考汽车驾照的整体流程是怎样的?大神们帮帮忙呵呵,这个你问我就问对了哦,因为我可是刚刚才考完驾照。首先报完名后,去拍照片,然后体检,上文科的理论知识,文科考试(就是有关于驾驶方面的,你在上课的时候会有一

知识大全 Struts2初始配置的几点注意

Struts2初始配置的几点注意  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  按照教程上的方法

知识大全 struts2 更改默认resulttype

  最近碰到一个小要求想让一些action返回的resultType默认为freemarker开始是想在action上配置全局的result然后name用一个表达式然后type=freemarker 

知识大全 struts2文件上传的采用的三种方式解析

   文件上传几乎是每个项目实现的一个必须的模块  上传就是将信息从个人计算机(本地计算机)传递到中央计算机(远程计算机)系统上让网络上的人都能看到将制作好的网页文字图片等发布到互联网上去以

知识大全 从实例看struts2运行原理

  简单例子  先做一个最简单的struts的例子在浏览器中请求一个action然后返回一个字符串到jsp页面上显示出来  第一步把struts最低配置的jar包加入的项目中  monslogging

知识大全 struts2实现文件下载

  使用Struts控制文件下载可能很多人会觉得文件下载太简单直接在页面上给出一个超级链接该链接的href属性等于要下载文件的文件名不就可以实现文件下载了吗?大部分时候的确可以实现文件下载但如果该文件

知识大全 struts2项目性能调优三步曲(三)

  通过上两篇文章的研究影响Struts性能的原因在于Ognl的ValueStack的性能不佳那么如果解决呢我首先尝试使用JSF一开始选择JSF的原因主要是  1Stuts自己提供了JSF的Plugi

整体楼地面施工工艺包括哪些内容?

答:(1)安装工艺流程基层处理一弹线、找规矩一铺设水泥砂浆面层一养护。(2)施工要点1)基层处理。对于表面较光滑的基层应进行凿毛,并用清水冲洗干净,冲洗后的基层不要上人。在现浇混凝土或水泥砂浆垫层、找

涂装工艺流程设计的要求及步骤介绍

涂装工艺流程设计的要求及步骤介绍对工艺流程的设计要按以下步骤进行1、客户对涂装品质要求,一般要仔细分析客户给你的样品或样板的整体质量。2、被涂物的状况,要针对客户即将生产的白坯进行前期分析,如材质的性