3.3Result配置

Action里提供了五個默認的返回值:

String SUCCESS = "success";

String NONE    = "none";

String ERROR   = "error";

String INPUT   = "input";

String LOGIN   = "login";

 

默認的一些配置

package下有如下配置

<result-types>

<result-type name="dispatcher"

class="org.apache.struts2.dispatcher.ServletDispatcherResult"

    default="true" />

</result-types>

 

如果一個Resulttype沒有設定的話,默認為dispthcherDispatcher的意思是轉向一個JSP等的資源。

另外如果Resultname沒有設定的話,默認為SUCCESS

 

一個完整的Result的聲明如下:

<result name="success" type="dispatcher">

    <param name="location">/ThankYou.jsp</param>

</result>

考慮到默認值可以寫成:

<result>

    <param name="location">/ThankYou.jsp</param>

</result>

另外也可以簡寫為:

<result>/ThankYou.jsp</result>

 

另外為了方便,可以在package中設置一些全局的result,例如:

<global-results>

  <result name="error">/Error.jsp</result>

  <result name="invalid.token">/Error.jsp</result>

  <result name="login" type="redirect-action">Logon_input</result>

</global-results>

 

動態結果

有些時候,在Action執行完畢之后才知道Result的指向,可以使用如下的方法:

Action

private String nextAction;

public String getNextAction() {

    return nextAction;

}

public String execute() throws Exception {

  return “next”;

}

 

struts.xml

<action name="fragment" class="FragmentAction">

  <result name="next" type="redirect-action">${nextAction}</result>

</action>

 

 

3.4ActionSupport

Action類不一定非要實現Action接口或者集成ActionSupport類,也就是說Action可以是一個POJO對象,只不過提供一個返回String的方法。如果Action類不實現Action接口,也不從ActionSupport集成,則Struts框架通過Java的反射機制(Reflection)來調用Action類中的處理方法。

Action類的處理方法需要滿足以下要求

1 public

2 返回String,框架根據返回值決定遷移的目的

3 (可選)拋出Exception,讓Struts框架統一處理異常

 

 

3.5Exception Handling

Struts可以以聲明的方式處理Action類拋出的異常。以聲明的方式處理是指:所有的Action類的處理方法拋出的Exception會被框架統一處理,之后定向到預先定義的Result。處理這些異常的ActionResult等可以動態的配置。

Struts2自帶一個默認的配置:struts-default.xml,在這個文件中預先定義了一些基本的操作,其中Exception Handling也在其中,參看下述代碼:

 

...

<interceptors>

    ...

    <interceptor name="exception"

          class="com.opensymphony.xwork.interceptor.ExceptionMappingInterceptor"/>

    ...

</interceptors>

 

<interceptor-stack name="defaultStack">

    <interceptor-ref name="exception"/>

    <interceptor-ref name="alias"/>

    <interceptor-ref name="servlet-config"/>

    <interceptor-ref name="prepare"/>

    <interceptor-ref name="i18n"/>

    <interceptor-ref name="chain"/>

    <interceptor-ref name="debugging"/>

    <interceptor-ref name="profiling"/>

    <interceptor-ref name="scoped-model-driven"/>

    <interceptor-ref name="model-driven"/>

    <interceptor-ref name="fileUpload"/>

    <interceptor-ref name="checkbox"/>

    <interceptor-ref name="static-params"/>

    <interceptor-ref name="params"/>

    <interceptor-ref name="conversionError"/>

    <interceptor-ref name="validation">

        <param name="excludeMethods">input,back,cancel,browse</param>

    </interceptor-ref>

    <interceptor-ref name="workflow">

        <param name="excludeMethods">input,back,cancel,browse</param>

    </interceptor-ref>

</interceptor-stack>

...

 

要使用Struts2聲明式異常處理,只需要將異常映射到result就可以了,可以用兩種方法配置,一種方法是全局配置,針對所有的Action有效,另一種是針對具體的Action做配置,只針對具體的Action有效。

參看如下struts.xml 配置文件片段:

<package name="default">

      ...

      <global-results>

          <result name="login" type="redirect">/Login.action</result>

          <result name="Exception">/Exception.jsp</result>

      </global-results>

 

      <global-exception-mappings>

          <exception-mapping

exception="java.sql.SQLException" result="SQLException"/>

          <exception-mapping

exception="java.lang.Exception" result="Exception"/>

      </global-exception-mappings>

      ...

      <action name="DataAccess" class="com.company.DataAccess">

          <exception-mapping

exception="com.company.SecurityException" result="login"/>

          <result name="SQLException" type="chain">SQLExceptionAction</result>

          <result>/DataAccess.jsp</result>

      </action>

      ...

</package>

 

上述配置有如下結果

1 一個java.sql.SQLException異常將鏈接到SQLExceptionAction (上述文件中沒有說明)

2 一個com.company.SecurityException將重新定位到login.action

3 其他從java.lang.Exception繼承而來的Exception將會被定為到/Exception.jsp頁面

 

3.6 Intercepter攔截器

攔截器的運行時機在Action類運行之前和之后。攔截器使用Filter模式,將你需要執行的代碼放在Action類處理方法之前或者之后執行。攔截器在開發程序的時候功能非常強大,通過使用攔截器可以完成校驗,屬性設置,安全,日志,程序剖析等功能。

 

攔截器可以彼此鏈接構成一個攔截器的棧,每一個攔截器本質上是一個Java類,都有一個常常的類名,為了方便使用,可以在Struts2框架中注冊這些攔截器,例如:

<interceptor name="security" class="com.jpleasure.security.SecurityInterceptor"/>

  <interceptor-stack name="secureStack">

    <interceptor-ref name="security"/>

    <interceptor-ref name="defaultStack"/>

  </interceptor-stack>

</interceptors>

攔截器和攔截器棧可以混合使用來定義新的攔截器棧,在調用過程中,框架按照在攔截器棧中的順序逐個調用這些攔截器。

 

可以在Package中定義默認的攔截器棧,例如:

<default-interceptor-ref name="secureStack"/>

當然每一個Action類也可以定義自己的攔截器棧,例如:

<action name="VelocityCounter"

                         class="org.apache.struts2.example.counter.SimpleCounter">

    <result name="success">...</result>

    <interceptor-ref name="defaultComponentStack"/>

</action>

 

3.7節 分離配置文件

可以在struts.xml中使用include標記將配置文件分離成不同的部分。

例如:

<!DOCTYPE struts PUBLIC

  "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

  "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

    <include file="Home.xml"/>

    <include file="Hello.xml"/>

    <include file="Simple.xml"/>

    <include file="/util/POJO.xml"/>

</struts>

ExtJS教程- Hibernate教程-Struts2 教程-Lucene教程