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

4 篇文章 1 订阅
2 篇文章 0 订阅
架构与反射——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(视图)
    }

}



转自:http://blog.csdn.net/dreamcode/article/details/23121047

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值