struts2学习笔记之五(struts2的处理过程)
来源:互联网 发布:武汉软件开发工资 编辑:程序博客网 时间:2024/06/03 22:54
从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视频
- struts2学习笔记之五(struts2的处理过程)
- J2EE系列之Struts2学习笔记(五)---struts2处理传入多个数目不定的字符串
- Struts2学习笔记(五)之异常处理机制
- struts2学习笔记(五)
- Struts2学习笔记(五)
- Struts2学习笔记五
- 黑马程序员---struts2学习笔记之五(文件上传)
- Struts2.x学习笔记之 异常处理
- Struts2学习笔记(五):struts2通配符用法示例
- Struts2学习笔记五(拦截器)
- Struts2的学习之路(五)
- J2EE系列之Struts2学习笔记(六)---struts2处理传入多个数目不定的JavaBean对象
- Struts2.1笔记(五):Struts2的类型转换
- struts2学习笔记(6)------配置struts2中的异常处理
- struts2学习笔记--------struts2处理流程
- struts2学习之---配置struts2的异常处理
- 学习笔记之Struts2
- Struts2学习笔记(6)-异常处理
- cocos2dx -- 150505 学习笔记
- C# LINQ查询 类
- floyd算法求解最短路径
- [Leetcode 206, Easy] Reverse Linked List
- 5.19管理
- struts2学习笔记之五(struts2的处理过程)
- hdf5安装的时候遇到错误
- 差分约束系统【模板】
- 使用单文档视图结构把Word嵌入到VC程序中
- HTTP状态码:400\500 错误代码
- [POJ] 1008 -> 玛雅历
- NYOJ1208 水题系列(DP)
- hdu 1251 统计难题 字典树
- 引用类型(1)