Struts 2.x权威指南
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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的情况不太常见。