从struts2.1 开始 ,struts2配置文件的DTD中增加了<unknown-handler-stack…/>和<unknown-handler-ref…/>,这个元素用于配置Struts2的未知处理器。
当用请求未知Action、或指定action里的未知方法、或action 处理结束之后返回一个未知result ,struts2允许使用处理器来处理这些方法。
未知处理器需要实现 UnknownHandler 接口,该接口里包含来了3个方法:
HandleUnknownAction:用户请求未知Action时,该方法见会被回调。
HandleUnknownActionMethod: 用户请求指定Action的未知方法时,该方法将会被回调。
HandleUnKnownResult: action处理结束之后返回一个位置Result时,该方法将会被回调。
代码如下:
package com.struts2.action; import org.apache.struts2.dispatcher.ServletDispatcherResult; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.Result; import com.opensymphony.xwork2.UnknownHandler; import com.opensymphony.xwork2.XWorkException; import com.opensymphony.xwork2.config.entities.ActionConfig; public class MyUnKnownHandler implements UnknownHandler{ /** * @param namespace 用户请求的action所在的命名空间 * @param actionName 用户请求的Action的名字 * @return 该Action最后生成的ActionConfig,可以返回null */ @Override public ActionConfig handleUnknownAction(String namespace, String actionName) throws XWorkException { // TODO Auto-generated method stub return null; } /** * @param action 用户请求的Action对象 * @param methodName 用户请求的Action 的方法名 * @return 该Action 的该方法处理后返回的Result。 */ @Override public Object handleUnknownActionMethod(Object action, String methodName) throws NoSuchMethodException { // TODO Auto-generated method stub return null; } /** * @param actionContext 该result所在ActionContext * @param actionName 该result所在的Action名 * @param actionCofig 该result所在ActionContext * @param resultCode 该result所对应的逻辑视图字符串 * @return 将要被处理的结果,可以返回null */ @Override public Result handleUnknownResult(ActionContext actionContext, String actionName, ActionConfig actionConfig, String resultCode) throws XWorkException { // TODO Auto-generated method stub actionContext.put("action", actionName); actionContext.put("result", resultCode); return new ServletDispatcherResult("/unknownResult.jsp"); } }
相关的配置:
<!-- 使用bean 定义一个UnknownHandler --> <bean name="yeekuHandler" type="com.opensymphony.xwork2.UnknownHandler" class="com.struts2.action.MyUnKnownHandler"></bean> //定义未值处理栈 <unknown-handler-stack> <unknown-handler-ref name="yeekuHandler"></unknown-handler-ref> </unknown-handler-stack>