struts2的处理过程

从struts 2.1.3开始,FilterDispatcher变为StrutsPrepareAndExecuteFilter

学习的时候就一直纠结程序到底是怎么根据xml文件调用action类的,以及表单的值是怎么传到Action类里的。看书怎么也看不懂,此时有一个老师是非常重要的,看书要自己思考,有时候没学到一些技术,就会纠结是怎么实现的啊。好了,有打广告的嫌疑了。

OK,看过struts2的视频之后,知道这一切都是反射的结果,以前只是知道反射,而从来没有去了解它。其实很重要的。

<span style="font-size:18px;">import java.util.*;
import java.lang.reflect.*;
public class MockFilter{
	public static void main(String[] args) throws Exception{
		//模拟请求参数
		/*
			<action name="UserAction" class="UserAction" method="regist">
				<result name="success">
					view.jsp
				</result>
			</action>
		*/
		//假设filter收到UserAction.action的请求
		//1、filter获取请求参数
		//request.getParameterMap()
		//模拟获取request中的所有参数
		Map<String,String> paraMap = new HashMap<String,String>();
		paraMap.put("name","zhangsan");
		paraMap.put("pass","1234");

		//2、搜索struts.xml,根据name找到action,根据class属性创建action实例,调用method属性指定的函数
		String clazzProp = "UserAction";

		//反射:获取Action类对应的class对象
		Class actionClazz = Class.forName(clazzProp);

		//用反射创建Action实例
		Object actionInst = actionClazz.newInstance();//该语句说明Action类必须有一个无参的构造器

		for(String para : paraMap.keySet()){
			//获取setParameter()函数,获取参数名对应的set函数
			Method setter = actionClazz.getMethod("set" + para.substring(0,1).toUpperCase() + para.substring(1),String.class);
			//得到请求参数对应的参数值
			String value = paraMap.get(para);
			//以Action实例为调用者,调用setter方法
			setter.invoke(actionInst,value);//类实例和参数值

		}
		//3、再次根据反射调用method属性所指定的方法

		Method exec = actionClazz.getMethod("regist");//说明action的处理方法是无参函数
		String result = (String)exec.invoke(actionInst);
		if(result.equals("success")){
			System.out.println("模拟view page!!!");
		}
	}
}

class UserAction{
	private String name;
	private String pass;
	public void setName(String name){
		this.name=name;
	}
	public String getName(){
		return name;
	}
	public void setPass(String pass){
		this.pass=pass;
	}
	public String getPass(){
		return pass;
	}
	public String regist(){
		System.out.println("name----:"+name);
		System.out.println("pass----:"+pass);
		return "success";
	}
}</span>

上述程序就是一个基于反射的简单的控制器原理显示。

1、浏览器发送请求:abc.action。.action后缀可以保留,也可以省略

2、浏览器发送的请求被StrutsPrepareAndExecuteFilter拦截。

--------因为我们在web.xml中指定StrutsPrepareAndExecuteFilter来过滤所有的请求

3、StrutsPrepareAndExecuteFilter会去创建Action实例。

假如我们请求abc.action,strutsPrepareAndExecuteFilter会搜索struts.xml文件中name为abc的action配置,根据class属性“使用反射”来创建action实例

4、调用

Map<String,String> paraMap = request.getParameterMap();//返回请求参数

使用循环(String paraName:paramMap.keySet()){

Action类.getMethod("set"+paraName的首字母大写);

//得到请求参数的值

String paravalue = paramap .get(paraName);

//以Action实例为调用者,调用setter方法,把请求参数值作为参数值传入

setter.invoke(actionInst,paraValue);

}

5、再次“通过反射”调用method属性指定的方法

6、根据struts.xml的result元素的name属性以及物理视图资源,跳转到指定页面

通过上述过程,就可以理解这个过程了

来自:李刚struts2视频

时间: 2024-07-28 20:23:44

struts2的处理过程的相关文章

Struts2内部执行过程

首先是Struts2的流程图. 一.当有一个请求的时候.执行以下流程. 1 客户端初始化一个指向Servlet容器的请求: 2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin). 3 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action.(注:

java利用myeclipse自带三大框架搭建三大框架(Hibernate+Struts2+Spring)过程详解

搭建过程因人而异,我的搭建过程大致是这样的: 1.创建一个javaweb项目: 2.导入Spring框架,上图: 2.1: 2.2: 2.3: 3.导入struts2框架,上图: 3.1: 3.2: next: 3.3: 4.导入Hibernate框架,说明:由于hibernate属于持久层,和数据库密切相关,所以需要我们提前出创建好数据库对应视图,然后再开始下面的操做.上图: 4.1: 4.2: 4.3: 4.4: 4.5: 4.6: 4.7:利用数据库相关表和hibernate的orm生成实

struts2创建ActionProxy过程

首先new一个map Map<String, Object> extraContext 这个map有如下键值对 这些key都是在ActionContext类中定义 com.opensymphony.xwork2.ActionContext.parameters                    requestMap com.opensymphony.xwork2.ActionContext.session                          sessionMap com.op

Struts2学习总结(3)

本文包括以下五个部分: 值栈. Ognl表达式. struts2标签库. 国际化. 表单数据校验 拦截器. struts2的执行过程. 一.值栈 采用servlet和JSP开发时,servlet通过域对象保存数据,在JSP页面通过jstl标签+el表达式获取数据. 采用struts2和JSP框架进行开发时,Action通过值栈对象保存数据,在JSP页面通过struts标签+ognl表达式获取数据. 1.1 值栈(ValueStack)的概念 值栈就是存放action的堆栈,用来存储请求响应数据,

框架学习Struts2之HelloWord

一.概述 Struts2是基于MVC设计模式的web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts作为控制器(Controller)来建立模型与视图之间的数据交互.Struts2是Struts1的下一代产品,是在WebWork技术基础上进行合并的全新的框架,其全新的体系结构与Struts1差距很大.Struts2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全分离,所以Struts2可以理解为We

Struts2的搭建原理

记录下,struts2的搭建过程: 1核心jar包: struts-2.1.8\apps\struts2-blank-2.1.8.war 解压后 在struts2-blank-2.1.8\WEB-INF\lib下就是 2配置文件白板 web.xml在    struts2-blank-2.1.8\WEB-INF\web.xml struts.xml在    struts2-blank-2.1.8\WEB-INF\classes\struts.xml 3 struts.xml配置文件 <?xml

Struts1和Struts2的区别和对比(完整版)

Struts2其实并不是一个陌生的Web框架,Struts2是以Webwork的设计思想为核心,吸收了Struts1的优点,因此,可以认为Struts2是Struts1和Webwork结合的产物. 简单来说二者的区别是: 一个是Stuts1 ,一个是Stuts2,这是最大的区别,技术方面,Stuts1有个核心控制器,但是只提供了一个接口,也就是execute,还要配置actionform之类的,很麻烦,所以依赖性比较强:而Stuts2是针对拦截器开发的,也就是所谓的AOP思想,可以配置多个act

Struts2 简介

回顾Struts2的使用过程,网上搜的教程多多少少都会有点问题,重新记录下创建过程,方便查阅. 1.下载Struts2的jar包 下载地址:http://archive.apache.org/dist/struts/binaries/ 我用的是struts-2.3.14-all.zip这个版本 2.创建一个web project项目 下面给出所有文件均创建完成后的工程师图. 3.导入Struts2所需jar包 因为只是示例程序,只需要导入Struts 2支持最小的包就可以了,网上很多教程中添加的

Struts2详解

 struts2框架是SSH框架集中的框架之一,是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器层(Controller)来建立模型与视图的数据交互. 在使用struts2框架的过程中,需要两个配置文件,分别为web.xml和struts.xml,服务器一启动就加载web.xml的配置,web.xml启动时,在StrutsPrepareAndExecuteFilter的init()方法中将会读取类路径下默认的配置文件stru