3.9 未知处理器
从 Struts 2.1 开始,Struts 2 配置文件的 DTD 中增加了<unknown-handler-stack.../>和<unknown-handler-ref.../>,这两个元素用于配置Struts 2的未知处理器。
当用户请求未知Action,或指定Action里的未知方法,或Action处理结束后返回一个未知 Result 时,Struts 2 允许使用未知处理器来处理这些情况。未知处理器需要实现UnknownHandler接口,该接口里包含如下3个方法。
handleUnknownAction:用户请求未知Action时,该方法将会被回调。
handleUnknownActionMethod:用户请求指定Action的未知方法时,该方法将会被回调。
handleUnknownResult:Action处理结束后返回一个未知Result时,该方法将会被回调。
一旦实现了自定义的未知处理器,就可以在struts.xml文件中通过<bean.../>元素来配置该未知处理器,代码片段如下:
<!-- 使用Bean定义了一个UnknownHandler --> <bean type="com.opensymphony.xwork2.UnknownHandler" name="yeekuHandler" class="org.crazyit.struts2.action.MyUnknownHandler"/>
定义了上面的未知处理器之后,还应通过<unknown-handler-stack.../>和<unknown-handler-ref.../>两个元素来启用上面的未知处理器。
下面代码实现了一个简单的未知处理器。
程序清单:codes\03\3.9\UnknownHandler\WEB-INF\src\org\crazyit\struts2\action\MyUnknownHandler.java
public class MyUnknownHandler implements UnknownHandler { /** * @param namespace 用户请求的Action所在的命名空间 * @param actionName 用户请求的Action的名字 * @return 该Action最后生成的ActionConfig,可以返回null */ public ActionConfig handleUnknownAction(String namespace, String actionName) throws XWorkException { //...加入处理 return null; } /** * @param action 用户请求的Action对象。 * @param methodName 用户请求的Action的方法名 * @return 该Action的该方法处理后返回的Result */ public Object handleUnknownActionMethod(Object action, String methodName)throws NoSuchMethodException { //...加入处理 return ""; } /** * @param actionContext 该Result所在的ActionContext * @param actionName 该Result所在的Action名 * @param actionConfig 该Result所在的ActionConfig * @param resultCode 该Result所对应的逻辑视图字符串 * @return 将要被处理的结果,可以返回null */ public Result handleUnknownResult(ActionContext actionContext, String actionName, ActionConfig actionConfig, String resultCode) throws XWorkException { actionContext.put("action" , actionName); actionContext.put("result" , resultCode); //总是转入unknownResult.jsp页面 return new ServletDispatcherResult( "/WEB-INF/content/unknownResult.jsp"); } }
上面的未知处理器主要用于处理Action处理结束后返回一个未知Result的情况。下面为本应用配置一个简单的Action,本应用的struts.xml文件如下。
程序清单:codes\03\3.9\UnknownHandler\WEB-INF\src\struts.xml
<?xml version="1.0" encoding="GBK" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- 使用Bean定义一个UnknownHandler --> <bean type="com.opensymphony.xwork2.UnknownHandler" name="yeekuHandler" class="org.crazyit.struts.action.MyUnknownHandler"/> <!-- 配置一个包元素 --> <package name="lee" extends="struts-default"> <!-- 配置处理用户请求的 Action --> <action name="myAction"/> </package> <!-- 定义本系统的UnknownHandler栈 --> <unknown-handler-stack> <unknown-handler-ref name="yeekuHandler" /> </unknown-handler-stack> </struts>
上面的配置文件中配置了一个myAction,定义该Action时没有指定class属性,这表明该Action将使用ActionSupport作为处理类。而且配置该Action时未配置<result.../>子元素,这意味着当用户向该Action请求后将返回一个未知Result。向该myAction.action发送请求后,将看到如图3.32所示的结果。
图3.32 处理未知Result的结果
就笔者的实际经验来看,未知处理器主要在处理当Action返回未知Result时的情况下比较有用,因为Struts 2允许配置默认的Action——当用户请求的Action不存在时,默认的Action将会负责处理用户请求,因此出现请求未知Action的情况不太常见。