struts2 18拦截器详解(三)
AliasInterceptor
该拦截器位于defaultStack第二的位置,其功能比较简单,主要就是为我们传递的请求参数取别名映射到多个命名的参数上,这样可以让多个Action以不同的参数名共享同一个请求参数,特别是在Result类型为chain的时候。下面举个例子讲一下如何配置这个拦截器:
@Override public String intercept(ActionInvocation invocation) throws Exception { ActionConfig config = invocation.getProxy().getConfig();//获取Action配置 ActionContext ac = invocation.getInvocationContext();//获取ActionContext Object action = invocation.getAction();//获取当前执行的Action // get the action's parameters 获取Action的参数,注意这里的参数不是request请求参数而是 //在struts2配置文件中通过<param>节点配置的参数 final Map<String, String> parameters = config.getParams();//aliasesKey就是<param name="aliases">节点的name属性值 if (parameters.containsKey(aliasesKey)) {//如果配置了aliases String aliasExpression = parameters.get(aliasesKey);//获取我们传递的表达式 ValueStack stack = ac.getValueStack(); Object obj = stack.findValue(aliasExpression);//去值栈中查找表达式代表的值 if (obj != null && obj instanceof Map) { //get secure stack ValueStack newStack = valueStackFactory.createValueStack(stack); boolean clearableStack = newStack instanceof ClearableValueStack; if (clearableStack) { //省略... } // override Map aliases = (Map) obj;//强转为Map,因为返回的就是LinkedHashMap对象,用LinkedHashMap才能保证配置参数有序 for (Object o : aliases.entrySet()) {//迭代 Map.Entry entry = (Map.Entry) o; String name = entry.getKey().toString();//原名,上面的例子中就是'un' String alias = (String) entry.getValue();//别名,上面的例子中就是'username' Object value = stack.findValue(name);//去值栈中查找,一般来说是找不到的 if (null == value) { // workaround 获取request请求参数Map Map<String, Object> contextParameters = ActionContext.getContext().getParameters(); if (null != contextParameters) { value = contextParameters.get(name);//把请求参数中相应的值获取出来,上面的例子中值就是'zhangsan' } } if (null != value) { try { newStack.setValue(alias, value);//把请求参数中相应的值获取来以别名为key再赋给值栈 } 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); } } } } }//省略... } else { LOG.debug("invalid alias expression:" + aliasesKey); } } return invocation.invoke(); }