实例分析

1.在浏览器中输入url地址后,会通过http协议发送给tomcat,tomacat收到请求后查看訪问的是哪个

webapplication(例如以下图的Struts2_0100_Introduction),tomcat把Struts2_0100_Introduction交给相应的

webapplication程序去处理。

2.之后会參考Struts2_0100_Introduction下的相应的web.xml文件,将请求交给Struts2Filter去处理

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

(“/*”为这个项目中的全部文件,全部的项目请求都会被捕捉)

    3.filter会调用dofilter。參考Struts.xml

(1)在參考Struts.xml时首先会參考namespace
(2)之后找相应的action
(3)找相应的result
(4)找到相应的result后会将相应的请求给jsp文件
(5)jsp文件将内容反馈给client

Struts2执行机制

从图中能够看出一个请求在Struts2中的处理步骤例如以下:

1、client初始化一个指向Servlet容器(比如Tomcat)的请求;

2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器。

这个过滤器对于Struts2和其它框架的集成非常有帮助,比如:SiteMesh Plugin)。

3、接着FilterDispatcher被调用。FilterDispatcher询问ActionMapper来决定这个请求是否须要调用某个

Action;

4、假设ActionMapper决定须要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy;

5、ActionProxy通过Configuration Manager询问框架的配置文件,找到须要调用的Action类;

6、ActionProxy创建一个ActionInvocation的实例。

7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)

的调用。

8、一旦Action运行完成,ActionInvocation负责依据struts.xml中的配置找到相应的返回结果。返回结果通常

是(但不总是,也可能是另外的一个Action链)一个须要被表示的JSP或者FreeMarker的模版。在表示的过程中能够

使用Struts2框架中继承的标签。在这个过程中须要涉及到ActionMapper。

核心控制器

FilterDispatcher是早期struts2的过滤器,后期的都用StrutsPrepareAndExecuteFilter了,如 2.1.6、

2.1.8。StrutsPrepareAndExecuteFilter名字已经非常能说明问题了,prepare与execute,前者表示准备,能够说是指

filter中的init方法,即配制的导入;后者表示进行过滤,指doFilter方法。即将request请求,转发给相应的

action去处理。能够把他拆分成StrutsPrepareFilter和StrutsExecuteFilter,能够在这两个过滤器之间加上我们自

己的过滤器.!StrutsPrepareAndExecuteFilter是控制器的核心。就是MVC的Struts 2实现中控制层(Controller)的

核心。

三个初始化參数:

1、config參数:指定要载入的配置文件。逗号切割。

2、actionPackages參数:指定Action类所在的包空间。逗号切割。

3、configProviders參数:自己定义配置文件提供者,须要实现ConfigurationProvider接口类。

逗号切割。

想想为什么这么麻烦。中间要经过一次中转?

将请求和拿到的结果(视图)分开,要想换成别的视图直接配一下result就能够了。更灵活。和我MVC非常像。

最新文章

  1. Handler(二)
  2. 高通AR和友盟SDK的AndroidManifest.xml合并
  3. java和C++在多态实现上的区别
  4. HDU 2489 Minimal Ratio Tree(dfs枚举+最小生成树)
  5. CSF 中的应用程序请求路由
  6. 红眼技术博客 » redis连接池红眼技术博客 » redis连接池
  7. Reason的介绍和搭建Reason开发环境
  8. laravel 错误提示Fatal Error: Class 'Pheanstalk\Pheanstalk' not found
  9. apue第九章之孤儿进程组
  10. mssql 一次向表中插入多条数据的方法分享 (转自:http://www.maomao365.com/?p=6058)
  11. [PHP] 数据结构-链表创建-插入-删除-查找的PHP实现
  12. Thinking-Bear magic (计算几何)
  13. 设计模式之开放-封闭原则(引申出Objective-C中继承、Category、Protocol三者的区别,这点面试常问)
  14. Servlet 简介
  15. 用jquery实现带左右按键的轮播图
  16. MySQL的五种日期和时间类型
  17. oracle忘记密码,修改密码
  18. tomcat无法登录
  19. excel提取汉字拼音首字母
  20. HTML5之转动的轮子

热门文章

  1. 1.5 (SQL学习笔记)事务处理
  2. Codeforces Round #341 (Div. 2) D. Rat Kwesh and Cheese 数学
  3. System.Object 基类
  4. FIS常用功能之资源压缩
  5. POI创建Excel使用的常见的属性
  6. Atom 有什么优秀插件?
  7. HDU 4886 TIANKENG’s restaurant(Ⅱ) hash+dfs
  8. iOS:分页控件UIPageControl的使用
  9. 转: codereview工具之 review board 选型与实践
  10. Deferred content load was not performed. To provide the content, subscribe to the View's QueryControl event