您的位置:首页 > 编程语言 > Java开发

架构与反射——Struts2开发过程与处理流程解析

2014-12-22 23:04 651 查看
架构与反射——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);

}

Method targetMethod = actionClazz.getMethod("regist");//这就是为什么要求指定Action的哪个方法来处理用户请求也必须是无参的方法
String result = (String)targetMethod.invoke(actionInst);

if(result.equals("某个result的name属性值"))

{

request.getRequestDispatch().foward(视图)

}

}

转自:/article/1438521.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: