Struts2运行流程

1、在web.xml中使用Struts的核心过滤器拦截所有请求。

<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

2、核心过滤器根据struts.xml中配置的action的name找到对应的action的class,调用此action的拦截器、拦截器栈对请求进行预处理。

<package name="action" namespace="/" extends="struts-default">
<action name="loginAction" class="action.LoginAction"> </action>
</package>

有2种配置action的方式,一种是在struts.xml中配置,另一种是使用约定,约定xxx.action对应XxxAction类,约定需要插件支持。

Servlet是使用Filter(过滤器)对请求进行预处理,Action是使用Interceptor(拦截器)对请求进行预处理。一组拦截器组成一个拦截器栈。

<package>有必需属性 extends="struts-default",即此<package>的配置继承struts-default.xml中 <package name="struts-default"></package> 的配置。

缺省拦截器配置时,会自动调用struts-default包中的默认拦截器栈来处理。

3、利用反射创建此action的实例(调用空参的构造器),再调用此action的setter方法将请求参数赋给成员变量。

4、调用指定的方法来处理请求,并返回一个String类型的值。

<package name="action" namespace="/action" extends="struts-default">
<action name="loginAction" class="action.LoginAction" method="">
<result name=""></result>
<result name=""></result>
</action>
</package>

先找这个action有没有设置method属性,如果有method属性,且action类中有指定的方法,就调用指定的方法;

缺省method属性时,默认调用execute()。

5、按照<action>里配置的<result>,根据返回的字符串,确定要调用的页面。

6、根据struts.xml中配置的页面调用方式,调用页面,作为响应,返回给浏览器。

<action name="loginAction" class="action.LoginAction">
<result name="teacher" type="redirect">/teacher.jsp</result>
<result name="student" type="dispatcher">/student.jsp</result>
<result name="error">/error.jsp</result>
</action>

可以在<result>中配置逐个配置,也可以在<package>下统一配置。

<package name="action" namespace="/" extends="struts-default">
<result-types>
<result-type name="redirect" class="org.apache.struts2.result.ServletRedirectResult" default="true"/>
</result-types>
<action name="loginAction" class="action.LoginAction">
<result name="teacher">/teacher.jsp</result>
<result name="student">/student.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>

这种配置需要设置为默认值才有效 default="true" 。

注意:<package>对子元素的顺序是有要求的。

如果没有配置方式,会调用继承的struts-default中的配置(默认为dispatcher,转发)。


核心过滤器 StrutsPrepareAndExecuteFilter

MVC提倡所有请求都交给Servlet来处理,Struts2提倡所有请求都交给Action处理。由Servlet|Action调用相应页面来显示。

web.xml中会使用核心过滤器拦截所有请求。

核心过滤器,是一个过滤器,过滤器可以拦截所有请求,拦截器只能拦截对action的请求。

见名思义,prepare and execute。

核心过滤器在init()中会加载所有配置文件,初始化WebAPP,将struts.xml中的配置的action的name、class映射为一个Map。

在doFilter()中,按照Map中action的映射关系,根据action的name找到对应的class,创建Action实例,处理请求。

最新文章

  1. 安装完成后在命令行运行bash时报错0x80070057
  2. jeecg单步调试
  3. pdf转成图片
  4. IOS基础之 (八) Foundation框架
  5. Magento修改邮件模板内容
  6. SecureCRT issue &quot;Could not open clipboard: Assess is denied&quot; (无法打开粘贴板:访问被拒绝)
  7. void (*fun)(void);什么意思?
  8. Vim键盘图与命令图解
  9. java中String s=&quot;abc&quot;及String s=new String(&quot;abc&quot;)详解
  10. HTML5 骨架
  11. 摇滚吧HTML5!有声前端交互!(Hello, Jsonic!)
  12. [译]终极塔防——运用HTML5从头创建一个塔防游戏
  13. POJ 2411
  14. 【LeetCode从零单排】No15 3Sum
  15. Win10安裝weblogic12C
  16. 【推荐】免费,19 款仿 Bootstrap 后台管理主题下载
  17. 在Postman中使用不受信任的SSL证书
  18. Spring mvc下载文件java代码
  19. (转)CS0016: 未能写入输出文件
  20. Java之路(二) 操作符

热门文章

  1. apicloud如何实现优雅的下拉刷新与加载更多
  2. Maven 跳过Junit单元测试
  3. Node.js—学习
  4. 分析-flag被盗
  5. 【未完成】【oracle】存储过程按日期循环
  6. FileSystemResource 和 ClassPathResource 有何区别
  7. 转:xcode项目打不开:incompatible project version问题
  8. 大话设计模式Python实现-备忘录模式
  9. 大话设计模式Python实现-模板方法模式
  10. BIM软件Revit的优点