正如前面提到的,
經(jīng)常有一些附帶結(jié)果的導(dǎo)航規(guī)則。例如,如果一個(gè)動(dòng)作方法是對(duì)用戶進(jìn)行驗(yàn)證,那么有三種可能的結(jié)果。
(a)成功的登錄;
(b)不成功的登錄-用戶名或密碼錯(cuò)誤;
(c)帳戶被鎖定。
在這種情況下,這個(gè)動(dòng)作方法將使用三種可能的結(jié)果字符串被配置,并且有三個(gè)不同的視圖呈現(xiàn)的結(jié)果。我們已經(jīng)在前面的例子中看到了這個(gè)。
但是,Struts 2 沒有阻礙你使用 JSP 作為視圖技術(shù)。畢竟 MVC 范例的整個(gè)目的是保持層是獨(dú)立和高度可配置的。例如,對(duì)于一個(gè) Web2.0 的客戶端,你可能想要返回 XML 或 JSON 作為輸出。在這種情況下,你可以為 XML 或 JSON 創(chuàng)建一個(gè)新的結(jié)果類型,并且實(shí)現(xiàn)它。
Struts 自帶一些預(yù)定義的結(jié)果類型,無論什么我們已經(jīng)看到的都是默認(rèn)的結(jié)果類型 dispatcher,它是用來調(diào)度 JSP 頁面的。Struts 允許你為了視圖技術(shù)使用其它標(biāo)記語言來呈現(xiàn)結(jié)果和流行的選擇,包括 Velocity,Freemaker,XSLT 和 Tiles。
調(diào)度 結(jié)果類型是默認(rèn)的類型,如果沒有其他的結(jié)果類型被指定,則使用它。它被用來在服務(wù)器上轉(zhuǎn)發(fā)到一個(gè) servlet,JSP,HTML 頁面,等等。它使用 RequestDispatcher.forward() 方法。
在我們前面的例子中,我們看到了 “shorthand” 版本,其中我們提供了 JSP 路徑作為結(jié)果標(biāo)簽的主體。
<result name="success">
/HelloWorld.jsp
</result>
我們也可以在
<result name="success" type="dispatcher">
<param name="location">
/HelloWorld.jsp
</param >
</result>
我們也可以提供一個(gè) parse 參數(shù),默認(rèn)為 true。解析參數(shù)決定位置參數(shù)是否將被解析為 OGNL 表達(dá)式。
在這個(gè)例子中,我們將看到如何使用 FreeMaker 作為視圖技術(shù)。Freemaker 是一種流行的模板引擎,用于使用預(yù)定義的模板來生成輸出。讓我們創(chuàng)建一個(gè)稱為 hello.fm 的 Freemaker 模板一個(gè)文件,它的內(nèi)容如下所示:
Hello World ${name}
在這里,上述文件是一個(gè)模板,其中 name 是使用已定義的動(dòng)作從外部傳遞的一個(gè)參數(shù)。你將會(huì)在 CLASSPATH 中保留這個(gè)文件。接下來,讓我們修改 struts.xml 來指定結(jié)果,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="helloworld" extends="struts-default">
<action name="hello" class="com.tutorialspoint.Struts 2.HelloWorldAction"
method="execute">
<result name="success" type="freemarker">
<param name="location">/hello.fm</param>
</result>
</action>
</package>
</struts>
讓我們保留 HelloWorldAction.java,HelloWorldAction.jsp 和 index.jsp 文件,因?yàn)槲覀冊(cè)?examples 章節(jié)中已經(jīng)創(chuàng)建了他們?,F(xiàn)在,在項(xiàng)目名稱上點(diǎn)擊右鍵,并且單擊 Export > WAR File 來創(chuàng)建一個(gè) War 文件。然后在 Tomcat 的 webapps 目錄下部署這個(gè) WAR。最后,啟動(dòng) Tomcat 服務(wù)器和嘗試訪問 URL http://localhost:8080/HelloWorldStruts 2/index.jsp
. 將會(huì)給出下面的畫面:
http://wiki.jikexueyuan.com/project/struts-2/images/helloworldstruts4.jpg" alt="" />
輸入一個(gè)值 “Struts 2”,并提交該頁面,你應(yīng)該看到下一個(gè)頁面:
http://wiki.jikexueyuan.com/project/struts-2/images/helloworldstruts5.jpg" alt="" />
正如你所看到的,這是與 JSP 視圖完全一樣的,除了我們不依賴于使用 JSP 作為視圖技術(shù)。在這個(gè)例子中,我們已經(jīng)使用 Freemaker。
重定向的結(jié)果類型調(diào)用標(biāo)準(zhǔn)的 response.sendRedirect() 方法,使瀏覽器給指定的位置創(chuàng)建一個(gè)新的請(qǐng)求。
我們可以在
<action name="hello"
class="com.tutorialspoint.Struts 2.HelloWorldAction"
method="execute">
<result name="success" type="redirect">
<param name="location">
/NewWorld.jsp
</param >
</result>
</action>
因此,僅僅修改你的 struts.xml 文件來定義如上所提及的重定向類型,并且創(chuàng)建一個(gè)新的文件 NewWorld.jpg,無論何時(shí) hello 動(dòng)作返回 success,你將會(huì)重定向到那里。