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实例,处理请求。

Struts2 运行流程的更多相关文章

  1. Struts2运行流程分析

    一.Struts2运行流程图: 二.运行流程分析: 1. 请求发送给StrutsPrepareAndExecuteFilter 2.StrutsPrepareAndExecuteFilter询问Act ...

  2. 8、Struts2 运行流程分析

    1.流程分析: 请求发送给 StrutsPrepareAndExecuteFilter StrutsPrepareAndExecuteFilter 询问 ActionMapper: 该请求是否是一个 ...

  3. Struts2运行流程-源码剖析

    本文为原创,如需转载,请标明出处:http://www.cnblogs.com/gudu1/p/7726172.html 首先说一下查看这些框架源码的感受,每一次深入探究 Spring.Struts ...

  4. Struts2 - 运行流程分析

    1. 请求发送给 StrutsPrepareAndExecuteFilter 2. StrutsPrepareAndExecuteFilter 询问 ActionMapper: 该请求是否是一个 St ...

  5. Struts2运行流程

    解释:首先浏览器发送一个请求.给/StrutsPrepareAndExecuteFilter调用doFilter()方法.创建/StrutsActionProxy执行execute()方法.有一个引用 ...

  6. [原创]java WEB学习笔记70:Struts2 学习之路-- struts2拦截器源码分析,运行流程

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  7. Struts2框架的运行流程

    Struts2的运行流程 1.浏览器发送请求到控制器(如Struts2中的核心控制器StrutsPrepareAndExecuteFilter): 2.控制器调用Action的execute方法: 3 ...

  8. Struts2的运行流程以及关键拦截器介绍

    Struts2的运行流程 1.ActionProxy是Action的一个代理类,也就是说Action的调用是通过ActionProxy实现的,其实就是调用了ActionProxy.execute()方 ...

  9. 【struts2】Struts2的运行流程

    1)前提条件 在讲解流程之前,假设我们已经建立了的一个名为strutsDeepen的web工程,该工程仅仅实现了简单的用户登陆与欢迎界面.具体的实现为: 在web.xml中配置了Struts2的过滤器 ...

随机推荐

  1. c语言的全排列

    在c语言中实现全排列,对于刚接触c语言,还没学习算法的人来说,比较困难了吧.估计大佬也不会看这种基础的东西,全排列实现的办法很多,在c++中有一个专门的函数可以使用,但是在c中实现就有点困难了.如果你 ...

  2. nginx 配置实例-负载均衡

    1.实现效果 (1)浏览器地址栏输入地址 http://www.123.com/edu/a.html,负载均衡效果,平均 8080 和 8081 端口中 2.准备工作 (1)准备两台 tomcat 服 ...

  3. 深入理解JavaScript中的作用域和上下文

    介绍 JavaScript中有一个被称为作用域(Scope)的特性.虽然对于许多新手开发者来说,作用域的概念并不是很容易理解,我会尽我所能用最简单的方式来解释作用域.理解作用域将使你的代码脱颖而出,减 ...

  4. 2、zabbix3.4的安装

    系统版本:centos7 数据库版本:mysql二进制安装5.7 zabbix:阿里云安装3.4 一.Zabbix的安装 Zabbix3.4版本官方安装手册链接:https://www.zabbix. ...

  5. c# WF 第8节 label控件

    本节内容: 1: 文本控件 2:实现label的你追我赶实例 1:文本控件 2:实现label的你追我赶实例 步骤1 : 步骤2 : 知识点:

  6. Maven中使用tomcat:run出现错误org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException

    配置是正常的.查阅资料以后说是jdk版本什么的问题.多方修改没有任何改观.换一个思路去查询tomcat:run怎么运行. 是因为他还是沿用了上一次的tomcat插件(默认是6)所以运行的时候使用 to ...

  7. Jupyter notebook and Octave kernel installation

    Jupyter notebook 安装 为了更加方便地写 Python 代码,还需要安装 Jupyter notebook. 利用 pip 安装 Jupyter notebook. 为什么要使用 Ju ...

  8. Luogu P3646 [APIO2015]巴厘岛的雕塑

    深夜写题解系列,话说这题暑假的时候就在LOJ上做掉了,然后今天看到Luogu上有就去交了一下,发现没写过题解,赶紧来补一下 说句题外话APIO2015的题目好水啊 首先考虑按位取或的过程,很显然要从二 ...

  9. windows上安装python和python开发工具

    一.python安装: 登录python官网,下载需要的安装包:https://www.python.org/downloads/windows/.,一般就下载 executable installe ...

  10. Spark SQL中出现 CROSS JOIN 问题解决

    Spark SQL中出现 CROSS JOIN 问题解决 1.问题显示如下所示:     Use the CROSS JOIN syntax to allow cartesian products b ...