架构与反射——Struts2开发过程与处理流程解析
来源:互联网 发布:js hidden input 赋值 编辑:程序博客网 时间:2024/06/06 09:15
架构与反射——Struts2开发过程与处理流程解析
一、struts2开发步骤:
(1)定义一个请求页面;
(2)开发Action类,只要求(区别Struts1无需与servlet耦合):
A. 为每个请求参数都提供Field,并为之提供相应的setter和getter方法
B. 该Action 类必须有无参的构造函数(后面介绍为什么必须是无参的)
(3)配置Action类
<action.../>元素包含如下属性
-name:指定该Action处理哪个请求
-class:指定该Action对应处理类
-method:指定Action的哪个方法来处理用户请求,也必须是无参的方法(后面介绍为什么必须是无参的)。默认值为execute()
二、struts2处理流程:
(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> paramMap = request.getParameterMap();//返回所有请求参数,这就是为什么开发Struts2的Action无需与Servlet耦合
使用循环for(String paramName: paramMap.keySet())
{
//得到请求参数名对应的setter方法
Method setter = actionClazz.getMethod("set"
+ paramName.substring(0,1).toUpperCase()
+ paramName.substring(1), string.class);
//得到请求参数对应的值
String paramValue = paramMap.get(paramName);
//以Action实例为调用者,调用setter方法,把请求参数值作为参数值传入,,这就是为什么开发Struts2的Action无需与Servlet耦合
setter.invoke(actionInst, paramValue);
}
(5)再次通过反射来调用method属性所指定的方法,返回一个字符串
(6)根据struts.xml文件中的<result.../>元素的name以及物理视图资源,跳转到实际的视图
三、模拟Struts2 底层实现:
public static void main(String[] args)
{
// 假如该Filter收到abc.action的请求,通过解析struts.xml,获知处理类为MyAction类,需要实现MyAction实例来处理
String clazzProp = "MyAction";
// 反射获取Action类所对应的class对象
Class actionClazz = class.forname(clazzProp);
// 用反射创建Action的实例
object actionInst = actionClazz.newInstance();//这就是为什么要求Action类必须有无参数的构造函数
// 用Map来模拟我们的请求参数
Map<String, String> paramMap = request.getParameterMap();//返回所有请求参数
for(String paramName: paramMap.keySet())
{
//得到请求参数名对应的setter方法
Method setter = actionClazz.getMethod("set"
+ paramName.substring(0,1).toUpperCase()
+ paramName.substring(1), string.class);
//得到请求参数对应的值
String paramValue = paramMap.get(paramName);
//以Action实例为调用者,调用setter方法,把请求参数值作为参数值传入
setter.invoke(actionInst, paramValue);
}
if(result.equals("某个result的name属性值"))
{
request.getRequestDispatch().foward(视图)
}
一、struts2开发步骤:
(1)定义一个请求页面;
(2)开发Action类,只要求(区别Struts1无需与servlet耦合):
A. 为每个请求参数都提供Field,并为之提供相应的setter和getter方法
B. 该Action 类必须有无参的构造函数(后面介绍为什么必须是无参的)
(3)配置Action类
<action.../>元素包含如下属性
-name:指定该Action处理哪个请求
-class:指定该Action对应处理类
-method:指定Action的哪个方法来处理用户请求,也必须是无参的方法(后面介绍为什么必须是无参的)。默认值为execute()
二、struts2处理流程:
(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> paramMap = request.getParameterMap();//返回所有请求参数,这就是为什么开发Struts2的Action无需与Servlet耦合
使用循环for(String paramName: paramMap.keySet())
{
//得到请求参数名对应的setter方法
Method setter = actionClazz.getMethod("set"
+ paramName.substring(0,1).toUpperCase()
+ paramName.substring(1), string.class);
//得到请求参数对应的值
String paramValue = paramMap.get(paramName);
//以Action实例为调用者,调用setter方法,把请求参数值作为参数值传入,,这就是为什么开发Struts2的Action无需与Servlet耦合
setter.invoke(actionInst, paramValue);
}
(5)再次通过反射来调用method属性所指定的方法,返回一个字符串
(6)根据struts.xml文件中的<result.../>元素的name以及物理视图资源,跳转到实际的视图
三、模拟Struts2 底层实现:
public static void main(String[] args)
{
// 假如该Filter收到abc.action的请求,通过解析struts.xml,获知处理类为MyAction类,需要实现MyAction实例来处理
String clazzProp = "MyAction";
// 反射获取Action类所对应的class对象
Class actionClazz = class.forname(clazzProp);
// 用反射创建Action的实例
object actionInst = actionClazz.newInstance();//这就是为什么要求Action类必须有无参数的构造函数
// 用Map来模拟我们的请求参数
Map<String, String> paramMap = request.getParameterMap();//返回所有请求参数
for(String paramName: paramMap.keySet())
{
//得到请求参数名对应的setter方法
Method setter = actionClazz.getMethod("set"
+ paramName.substring(0,1).toUpperCase()
+ paramName.substring(1), string.class);
//得到请求参数对应的值
String paramValue = paramMap.get(paramName);
//以Action实例为调用者,调用setter方法,把请求参数值作为参数值传入
setter.invoke(actionInst, paramValue);
}
Method targetMethod = actionClazz.getMethod("regist");//这就是为什么要求指定Action的哪个方法来处理用户请求也必须是无参的方法
String result = (String)targetMethod.invoke(actionInst);if(result.equals("某个result的name属性值"))
{
request.getRequestDispatch().foward(视图)
}
}
转自:http://blog.csdn.net/dreamcode/article/details/23121047
0 0
- 架构与反射——Struts2开发过程与处理流程解析
- 架构与反射——Struts2开发过程与处理流程解析
- 架构与反射——Struts2开发过程与处理流程解析
- 流程管理过程与架构
- LinkedIn 架构与开发过程
- IIS架构与HTTP请求处理流程
- IIS架构与HTTP请求处理流程
- IIS架构与HTTP请求处理流程
- [Django架构流程分析]请求处理机制其三:view层与模板解析
- [读书笔记]深入解析MapReduce架构设计与实现原理——CH4 Java反射机制与动态代理
- 架构与耦合——Struts2与Servlet API
- struts2 入门实例原理与流程 过程理解
- IIS架构与HTTP请求处理流程(1)
- IIS架构与HTTP请求处理流程(2)
- IIS架构与HTTP请求处理流程(3)
- IIS架构与HTTP请求处理流程(1)
- IIS架构与HTTP请求处理流程(2)
- IIS架构与HTTP请求处理流程(3)
- HDU1718 Rank【水题】
- HDU_1010 Tempter of the Bone[DFS]
- Java EE HTML5 WebSocket 示例【转自http://www.oschina.net/translate/java-ee-html5-websocket-example】
- 判断一个字符串是否是由字母组成
- 算法导论学习笔记(3)-习题2.3-7-排序+二分
- 架构与反射——Struts2开发过程与处理流程解析
- CentOS-6.3安装Mysql-5.5.29
- 【剑指Offer面试编程题】题目1372:最大子向量和--九度OJ
- Excel表格传送至AS400时乱码问题
- UINavigationController
- GRUB4DOS资源索引帖,欢迎跟帖补充
- Redis基础之消息通知
- xxxxxxxxxxxxxxxxxxx
- skip white space and check toks