`
499490717
  • 浏览: 40200 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

struts2默认拦截器之alias

阅读更多

 

            在struts2的struts-default.xml中定义了一个name为alias拦截器,实现类是com.opensymphony.xwork2.interceptor.AliasInterceptor,它的作用是给参数起一个别名,可用于在action链中以不同的名字共享同一个参数,也可用于把http请求参数以不同的名字映射到action里。拦截器有一个参数:aliasesKey,可通过在struts.xml中定义该拦截器时指定其值,默认值是aliases,表示一个别名的map。

            以下以实现在action链中username参数共享name参数为例:

 

<package name="test_Alias" extends="struts-default" namespace="/alias"> 
     <action name="name" class="com.warning.interceptor.action.AliasAction1" method="_name"> 
          <result name="success" type="chain">username</result> 
     </action> 
     <action name="username" class="com.warning.interceptor.action.AliasAction2" method="_username"> 
          <param name="aliases">#{'name':'username'}</param> 
          <result name="success">/jsp/alias/index.jsp</result> 
     </action> 
</package>

 

         名称为username的action中有param标签,其中name属性值应该和alias拦截器参数aliasesKey的值一样,而param标签的值是一个定义map对象的OGNL表达式。

         com.opensymphony.xwork2.interceptor.AliasInterceptor的intercept方法代码如下

 

 

public String intercept(ActionInvocation invocation) throws Exception {

        ActionConfig config = invocation.getProxy().getConfig();
        ActionContext ac = invocation.getInvocationContext();
        Object action = invocation.getAction();
        // get the action's parameters
         //获取action配置中的参数(就是param标签)
        final Map<String, String> parameters = config.getParams();
         //查看参数列表中是否有aliasesKey对应的参数,如果没有,直接执行action
        if (parameters.containsKey(aliasesKey)) {
             //获取出aliasesKey值参数对象的值。
            String aliasExpression = parameters.get(aliasesKey);
            ValueStack stack = ac.getValueStack();
             //利用OGNL表达式,获取参数值对应的对象
            Object obj = stack.findValue(aliasExpression);
            //如果获取到的对象为空,或者不是Map对象,将直接执行action
            if (obj != null && obj instanceof Map) {
                //get secure stack
                //构建新的值栈
                ValueStack newStack = valueStackFactory.createValueStack(stack);
                boolean clearableStack = newStack instanceof ClearableValueStack;
                if (clearableStack) {
                    //if the stack's context can be cleared, do that to prevent OGNL
                    //from having access to objects in the stack, see XW-641
                    ((ClearableValueStack)newStack).clearContextValues();
                    Map<String, Object> context = newStack.getContext();
                    ReflectionContextState.setCreatingNullObjects(context, true);
                    ReflectionContextState.setDenyMethodExecution(context, true);
                    ReflectionContextState.setReportingConversionErrors(context, true);
                    //keep locale from original context
                    context.put(ActionContext.LOCALE, stack.getContext().get(ActionContext.LOCALE));
                }
                // override
                Map aliases = (Map) obj;
                //遍历Map中的数据
                for (Object o : aliases.entrySet()) {
                    Map.Entry entry = (Map.Entry) o;
                    String name = entry.getKey().toString();
                    String alias = (String) entry.getValue();
                    //从值栈中获取name(原参数名)对应的值
                    Object value = stack.findValue(name);
                    if (null == value) {
                        // workaround
                        Map<String, Object> contextParameters = ActionContext.getContext().getParameters();
                        //如果获取到的值为null,则从request中获取参数值
                        if (null != contextParameters) {
                            value = contextParameters.get(name);
                        }
                    }
                    if (null != value) {
                        try {
                            //将值栈中alias对应的值设置为value
                            newStack.setValue(alias, value);
                        } catch (RuntimeException e) {
                            if (devMode) {
                                String developerNotification = LocalizedTextUtil.findText(ParametersInterceptor.class, "devmode.notification", ActionContext.getContext().getLocale(), "Developer Notification:\n{0}", new Object[]{
                                        "Unexpected Exception caught setting '" + entry.getKey() + "' on '" + action.getClass() + ": " + e.getMessage()
                                });
                                LOG.error(developerNotification);
                                if (action instanceof ValidationAware) {
                                    ((ValidationAware) action).addActionMessage(developerNotification);
                                }
                            }
                        }
                    }
                }

                if (clearableStack && (stack.getContext() != null) && (newStack.getContext() != null))
                    stack.getContext().put(ActionContext.CONVERSION_ERRORS, newStack.getContext().get(ActionContext.CONVERSION_ERRORS));
            } else {
                LOG.debug("invalid alias expression:" + aliasesKey);
            }
        }
        
        return invocation.invoke();
    }

         该拦截器已经被包含于默认拦截器栈中,无需再指定。

 

            如果访问http://127.0.0.1:8080/test/alias/name?name=this_is_name或者http://127.0.0.1:8080/test/alias/username?name=this_is_name,结果页面中都会显示出username=this_is_name,表明alias拦截器已经将name参数的值赋给了username

            注:上述例子的com.warning.interceptor.action.AliasAction1类中若存在属性username,而通过http://127.0.0.1:8080/test/alias/name?name=this_is_name访问,会导致结果页面的username为null,如果通过http://127.0.0.1:8080/test/alias/name?name=this_is_name&username=this_is_username 访问结果页面的username的值为this_is_username,而不是this_is_name,这是因为在默认拦截器栈中存在一个名为chain的拦截器(该拦截器是为result的type='chain'设计的),chain拦截器会将上一个action中的属性值复制到当前action中,而在默认拦截器栈中chain拦截器位于alias拦截器之后,因此导致名为username的action中的username属性值变成了上一个action中的username值。

 

版权所有,转载请表明出处:http://blogwarning.iteye.com/blog/1332201

分享到:
评论

相关推荐

    Struts2默认拦截器解析.pdf

    Struts2是一个流行的Java web框架...总的来说,Struts2的默认拦截器提供了全面的功能支持,使得开发者能够构建安全、高效且易于维护的Web应用程序。理解并熟练掌握这些拦截器的使用,将有助于提升开发效率和应用质量。

    Struts2的拦截器

    Struts2默认提供了一系列内置拦截器,每种拦截器都有其特定的功能: 1. **alias**:别名拦截器,主要用于简化不同Action间参数的共享,特别是当需要在不同Action间传递同名但不同作用域的参数时,可以通过`aliases`...

    Java实训教程 Java软件开发实战 Java开发框架介绍 struts2_9_拦截器 共32页.pptx

    - **默认拦截器栈**: 当继承`struts-default`包时,所有Action都会调用默认的拦截器栈——`defaultStack`。 - **覆盖默认拦截器栈**: 在Action配置中加入`&lt;interceptor-ref name="xx" /&gt;`可以覆盖`defaultStack`。 ...

    struts-default中拦截器介绍.pdf

    Struts 2 框架中的拦截器是其核心组件之一,主要负责在Action执行前后进行额外的操作,如参数绑定、验证、权限控制等。...在实际应用中,可以根据项目需求自定义拦截器,或调整默认拦截器的顺序,以实现更精细的控制。

    拦截器应用

    `defaultStack`是Struts2的默认拦截器栈,包含了多个基础的拦截器,如异常处理、别名、准备、Servlet配置、国际化等。在`&lt;action&gt;`标签中不指定拦截器时,就会使用这个默认拦截器栈。 通过自定义拦截器和拦截器栈,...

    java拦截器

    1. **默认配置**:Struts2提供了丰富的内置拦截器,它们的默认配置可以在`struts-default.xml`文件中找到。这些拦截器覆盖了常见的需求,如参数转换、错误处理、会话管理等。 2. **自定义配置**:在项目级的配置...

    struts2学习笔记二

    在`struts-default.xml`配置文件中,定义了一个名为`defaultStack`的默认拦截器栈,包含了多个预设的拦截器,如`exception`、`alias`、`servletConfig`等。这些拦截器按照声明的顺序依次执行,其中`params`拦截器...

    Java详解ModelDriven和Preparable拦截器.doc

    defaultStack是Struts2中的默认拦截器栈,它包含了多个拦截器,例如exception、alias、servletConfig、i18n、prepare、chain、scopedModelDriven、modelDriven等。 六、params拦截器 params拦截器是Struts2中的一个...

    struts学习笔记

    `&lt;default-interceptor-ref/&gt;`标签用于在`&lt;package&gt;`中指定所有Action的默认拦截器,简化了配置,提高了开发效率。 #### 六、拦截器生命周期 拦截器的生命周期包括`init()`, `destroy()`, 和`intercept()`三个方法...

    struts2 零配置

    Struts2的插件机制使得开发者可以通过添加第三方插件实现特定功能,如拦截器、结果类型等,而无需在XML中配置。许多插件已经集成了注解支持,使得零配置变得更加容易。 **4. 自动扫描** 开启自动扫描功能,Struts2...

    拦截器,实用型

    一般情况下,可以为包含多个需要登录检查的Action的包设置默认拦截器,而对个别不需要检查的Action单独处理。 ##### 示例代码 ```java public class LoginInterceptor implements Interceptor { private String ...

    Struts2.0框架技术详解

    拦截器是Struts2的核心功能之一,用于在Action执行前后进行拦截处理。 **10.1 记录拦截器和execute方法的执行时间** 通过自定义拦截器来记录Action执行的时间。 **示例代码**: ```java public class ...

    对Struts 2.0中的struts.xml配置文件详细说明 2

    这里定义了一个自定义的拦截器`myInterceptor`和一个拦截器栈`myStack`,`myStack`在默认拦截器栈的基础上添加了`myInterceptor`。 7. **全局结果(Global Results)和全局异常(Global Exceptions)** 全局结果...

    SSI框架搭建

    结合Spring框架,可以在`struts.xml`中配置Spring的拦截器,实现Action类的依赖注入。Spring配置文件中需要定义Bean,以便Struts2能通过Spring获取Action实例。 6. **Spring+iBATIS框架配置**: 在Spring配置文件...

    SSI框架 部署手册

    在这个例子中,`RegisterAction`使用了验证拦截器(`validation`),并通过`excludeMethods`属性指定了不需要验证的方法。 **1.3 Struts2国际化** 国际化是Struts2框架的一项重要特性,它允许应用程序根据用户的...

    SSM框架面试题.pdf

    - 需要在SpringMVC的配置文件中定义相关的配置信息,如视图解析器、拦截器等。 64. **在SSM架构中,如何配置和使用事务管理** - 通常通过Spring的`PlatformTransactionManager`接口来配置事务管理。可以通过`@...

Global site tag (gtag.js) - Google Analytics