在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是一个流行的Java web框架...总的来说,Struts2的默认拦截器提供了全面的功能支持,使得开发者能够构建安全、高效且易于维护的Web应用程序。理解并熟练掌握这些拦截器的使用,将有助于提升开发效率和应用质量。
Struts2默认提供了一系列内置拦截器,每种拦截器都有其特定的功能: 1. **alias**:别名拦截器,主要用于简化不同Action间参数的共享,特别是当需要在不同Action间传递同名但不同作用域的参数时,可以通过`aliases`...
- **默认拦截器栈**: 当继承`struts-default`包时,所有Action都会调用默认的拦截器栈——`defaultStack`。 - **覆盖默认拦截器栈**: 在Action配置中加入`<interceptor-ref name="xx" />`可以覆盖`defaultStack`。 ...
Struts 2 框架中的拦截器是其核心组件之一,主要负责在Action执行前后进行额外的操作,如参数绑定、验证、权限控制等。...在实际应用中,可以根据项目需求自定义拦截器,或调整默认拦截器的顺序,以实现更精细的控制。
`defaultStack`是Struts2的默认拦截器栈,包含了多个基础的拦截器,如异常处理、别名、准备、Servlet配置、国际化等。在`<action>`标签中不指定拦截器时,就会使用这个默认拦截器栈。 通过自定义拦截器和拦截器栈,...
1. **默认配置**:Struts2提供了丰富的内置拦截器,它们的默认配置可以在`struts-default.xml`文件中找到。这些拦截器覆盖了常见的需求,如参数转换、错误处理、会话管理等。 2. **自定义配置**:在项目级的配置...
在`struts-default.xml`配置文件中,定义了一个名为`defaultStack`的默认拦截器栈,包含了多个预设的拦截器,如`exception`、`alias`、`servletConfig`等。这些拦截器按照声明的顺序依次执行,其中`params`拦截器...
defaultStack是Struts2中的默认拦截器栈,它包含了多个拦截器,例如exception、alias、servletConfig、i18n、prepare、chain、scopedModelDriven、modelDriven等。 六、params拦截器 params拦截器是Struts2中的一个...
`<default-interceptor-ref/>`标签用于在`<package>`中指定所有Action的默认拦截器,简化了配置,提高了开发效率。 #### 六、拦截器生命周期 拦截器的生命周期包括`init()`, `destroy()`, 和`intercept()`三个方法...
Struts2的插件机制使得开发者可以通过添加第三方插件实现特定功能,如拦截器、结果类型等,而无需在XML中配置。许多插件已经集成了注解支持,使得零配置变得更加容易。 **4. 自动扫描** 开启自动扫描功能,Struts2...
一般情况下,可以为包含多个需要登录检查的Action的包设置默认拦截器,而对个别不需要检查的Action单独处理。 ##### 示例代码 ```java public class LoginInterceptor implements Interceptor { private String ...
拦截器是Struts2的核心功能之一,用于在Action执行前后进行拦截处理。 **10.1 记录拦截器和execute方法的执行时间** 通过自定义拦截器来记录Action执行的时间。 **示例代码**: ```java public class ...
这里定义了一个自定义的拦截器`myInterceptor`和一个拦截器栈`myStack`,`myStack`在默认拦截器栈的基础上添加了`myInterceptor`。 7. **全局结果(Global Results)和全局异常(Global Exceptions)** 全局结果...
结合Spring框架,可以在`struts.xml`中配置Spring的拦截器,实现Action类的依赖注入。Spring配置文件中需要定义Bean,以便Struts2能通过Spring获取Action实例。 6. **Spring+iBATIS框架配置**: 在Spring配置文件...
- **src**目录:包含所有的源代码文件,其中包括Struts2的默认拦截器、日志配置文件、Struts配置文件等。 - **com.struts2.filter**包:存放Struts2的默认拦截器。 - **Log4j.properties**:配置整个工程的日志...
在这个例子中,`RegisterAction`使用了验证拦截器(`validation`),并通过`excludeMethods`属性指定了不需要验证的方法。 **1.3 Struts2国际化** 国际化是Struts2框架的一项重要特性,它允许应用程序根据用户的...
- 需要在SpringMVC的配置文件中定义相关的配置信息,如视图解析器、拦截器等。 64. **在SSM架构中,如何配置和使用事务管理** - 通常通过Spring的`PlatformTransactionManager`接口来配置事务管理。可以通过`@...