Struts2 运行流程
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 运行流程的更多相关文章
- Struts2运行流程分析
一.Struts2运行流程图: 二.运行流程分析: 1. 请求发送给StrutsPrepareAndExecuteFilter 2.StrutsPrepareAndExecuteFilter询问Act ...
- 8、Struts2 运行流程分析
1.流程分析: 请求发送给 StrutsPrepareAndExecuteFilter StrutsPrepareAndExecuteFilter 询问 ActionMapper: 该请求是否是一个 ...
- Struts2运行流程-源码剖析
本文为原创,如需转载,请标明出处:http://www.cnblogs.com/gudu1/p/7726172.html 首先说一下查看这些框架源码的感受,每一次深入探究 Spring.Struts ...
- Struts2 - 运行流程分析
1. 请求发送给 StrutsPrepareAndExecuteFilter 2. StrutsPrepareAndExecuteFilter 询问 ActionMapper: 该请求是否是一个 St ...
- Struts2运行流程
解释:首先浏览器发送一个请求.给/StrutsPrepareAndExecuteFilter调用doFilter()方法.创建/StrutsActionProxy执行execute()方法.有一个引用 ...
- [原创]java WEB学习笔记70:Struts2 学习之路-- struts2拦截器源码分析,运行流程
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Struts2框架的运行流程
Struts2的运行流程 1.浏览器发送请求到控制器(如Struts2中的核心控制器StrutsPrepareAndExecuteFilter): 2.控制器调用Action的execute方法: 3 ...
- Struts2的运行流程以及关键拦截器介绍
Struts2的运行流程 1.ActionProxy是Action的一个代理类,也就是说Action的调用是通过ActionProxy实现的,其实就是调用了ActionProxy.execute()方 ...
- 【struts2】Struts2的运行流程
1)前提条件 在讲解流程之前,假设我们已经建立了的一个名为strutsDeepen的web工程,该工程仅仅实现了简单的用户登陆与欢迎界面.具体的实现为: 在web.xml中配置了Struts2的过滤器 ...
随机推荐
- laravel 数据库操作之 DB facade & 查询构造器 & Eloquent ORM
<?php namespace App\Http\Controllers; use App\Student; use Illuminate\Support\Facades\DB; class S ...
- centOS7安装mysql8.0完美教程!!只要按照步骤,无脑操作,一次成功!
查看防火墙systemctl status firewalld重启防火墙systemctl start firewalld 1.mysql 首先关闭防火墙 systemctl stop firewal ...
- centos下载安装libgcc 和 libtiff
1. 查看libtiff 可安装列表: [root@e952aff59318 lib]# yum list | grep "libtiff" libtiff.i686 4.0.9- ...
- selenium的web自动化实战
selenium自动化原理: 1.通过各种语言(python,java,ruby等)调用接口库 2.通过浏览器驱动(web driver)来驱动浏览器 利用Python自动化的环境安装: 1.pyth ...
- windows系统下mount创建的.vhd
自己无聊时候分出了几个磁盘用来练习,存放个人东西,cdef盘除了c盘都是随便乱存的(粗心-_-),于是分出了两个20G的vhd文件,但是每次开机都要去d盘点击挂载太麻烦,现在分享自己的方法. 创建mo ...
- c# 第31节 构造函数与析构函数、new关键字作用
本节内容: 1:构造和析构的简介 2:构造函数的定义和使用 3:new关键字的作用 4:析构函数的定义和使用 1:构造和析构的简介 2:构造函数的定义和使用 构造函数: 当实例化的一个对象,就默认执行 ...
- 1【西北师大-2108Java】第一次作业成绩汇总
[西北师大-2108Java]第一次作业成绩汇总 经过本次作业的练习,了解了Java最基本的知识和Java的发展:了解了Java到底是一门怎样的语言,也知道了学习Java的乐趣,懂得了去选择Java开 ...
- goroutine使用
Goroutine是建立在线程之上的轻量级的抽象.它允许我们以非常低的代价在同一个地址空间中并行地执行多个函数或者方法.相比于线程,它的创建和销毁的代价要小很多,并且它的调度是独立于线程的.在gola ...
- git 关联vs code
{ "window.zoomLevel": 1, "editor.fontSize": 15, "gitlens.advanc ...
- 【CF280D】k-Maximum Subsequence Sum(大码量多细节线段树)
点此看题面 大致题意: 给你一个序列,让你支持单点修改以及询问给定区间内选出至多\(k\)个不相交子区间和的最大值. 题意转换 这道题看似很不可做,实际上可以通过一个简单转换让其变可做. 考虑每次选出 ...