struts2学习笔记之五(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视频


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值