深入解析struts.xml配置的实现原理

---struts2配置深入解析

在struts2中,主要是通过web.xml和struts.xml配置文件来控制action的具体操作。其原理都是通过反射来完成的。

总结来说,可以分成如下几部:

1.浏览器发送action请求,如abc, 此action可以写成abc.action或者不带后缀的abc
2.浏览器发送的abc action请求被web.xml配置中的过滤器StrutsPrepareAndExecuteFilter拦截.

StrutsPrepareAndExecuteFilter的doFilter核心代码如下:

prepare.setEncodingAndLocale(request, response);  //设置request的编码方式  
            prepare.createActionContext(request, response);   //  
            prepare.assignDispatcherToThread();  
            request = prepare.wrapRequest(request);   //包装request  
//它将根据request请求的uri地址来解析出相应的namesapce和action,然后根据action名  
//查找struts.xml,来获取到此action相应的配置信息  
            ActionMapping mapping = prepare.findActionMapping(request, response, true);  

此时StrutsPrepareAndExecuteFilter将查找struts.xml文件中name为abc的action配置,并根据class属性"使用反射"来创建Action实例。核心代码如下:
config = configuration.getRuntimeConfiguration().getActionConfig(namespace, actionName);  
//config包含此action对应的class类及method方法  
Class clazz = getClassInstance(className);  
Object obj = clazz.newInstance();  
return obj;  
3.获取到了action实例后,将调用Map<String, String>paramMap = request.getParameterMap();来返回所有请求参数。
4. 使用循环(String paramName: paramMap.keySet()) 

{  
//得到请求参数对应的setter方法。  
Action类.getMethod("set"+paramName的首字母大写);  
//得到请求参数对应的值  
String paramValue = paramMap.get(paramName);  
//以Action实例为调用者,调用set方法,把请求参数值作为参数值传入  
setter.invoke(actionInst, paramValue);  
}  

5. 再次使用"反射技术"调用method属性所指定的方法,它将返回一个字符串。获取method值的核心代码如下: 

if (StringUtils.isEmpty(this.method)) {  
            this.method = config.getMethodName();  
            if (StringUtils.isEmpty(this.method)) {  
                this.method = ActionConfig.DEFAULT_METHOD; //要是没有配置,使用默认的方法,即execute方法  
            }  
            methodSpecified = false;  
        }  

6. 最后根据struts.xml文件中的<result.../>元素的name以及物理视图资源,调转到 实际的视图资源。

request.getRequestDispatch(....).forward(request, response);

下面是一副简单流程示意图:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值