Struts2教學
Struts2快速入門
Struts2 MVC架構
Struts2 是什麼?
Struts2 環境配置
Struts2 體系結構
Struts2 Hello World 實例
Struts2 配置文件
Struts2 Action/動作
Struts2 攔截器
Struts2 結果和結果類型
Struts2 值棧/OGNL
Struts2 文件上傳
Struts2 MySQL數據庫訪問
Struts2 發送郵件Email
Struts2 驗證框架
Struts2 基於XML校驗
Struts2 本地化/國際化(i18n)
Struts2 類型轉換
Struts2 主題和模板
Struts2 異常處理
Struts2 註釋
Struts2 註釋類型
Struts2 控件標籤
Struts2 iterator標籤
Struts2 if/else標籤
Struts2 merge標籤
Struts2 append標籤
Struts2 generator標籤
Struts2 數據標籤
Struts2 action標籤
Struts2 include標籤
Struts2 bean 標籤
Struts2 date 標籤
Struts2 param 標籤
Struts2 property 標籤
Struts2 set 標籤
Struts2 text 標籤
Struts2 url標籤
Struts2 表單標籤
Struts2 Ajax 標籤
Struts2和Spring集成
Struts2和Tiles集成
Struts2和Hibernate集成
Struts 2 hello world (XML版本)
Struts2註解示例
Struts2 @ResultPath註釋示例
Struts2 include(包含)多個配置文件
Struts2命名空間配置和解釋
Struts2開發者模式
如何刪除Struts2動作的後綴擴展名
使用Struts2動作
Struts2的ActionError&ActionMessage示例
Struts2模型驅動實例
Struts2映射攔截動作
Struts2重寫攔截器參數
Struts2攔截器棧的例子
Struts2 execAndWait攔截器例子
Struts2 <s:textfield>文本示例
Struts2 <s:password>密碼示例
Struts2 <s:hidden>隱藏值例子
Struts2 <s:textarea>文本域實例
Struts2 <s:radio>單選按鈕例子
Struts2單選預選按鈕值
Struts2 <s:checkbox>複選框例子
Struts2設置多個複選框缺省值
Struts2 <s:checkboxlist>多個複選框例子
Struts2 <s:select>下拉框例子
Struts2自動選擇下拉框的值
Struts2 <s:combobox>組合框的例子
Struts2 <s:head>示例
Struts2文件上傳例子
Struts2上傳多個文件例子
Struts2 <s:doubleselect>示例
Struts2 <s:updownselect>示例
Struts2 <s:optiontransferselect>示例
Struts2 <sx:datetimepicker>示例
Struts2 <sx:autocompleter>自動提示例子
Struts2 autocompleter+JSON例子
Struts2 <s:iterator>迭代器標籤示例
Struts2 if,elseif,else標籤示例
struts2 <s:append>標籤示例
Struts2 <s:generator>標籤示例
Struts2 <s:merge>標籤示例
Struts2 <s:sort>標籤示例
Struts2 <s:subset>標籤示例
Struts2 <s:a>標籤示例
Struts2 <s:action>標籤示例
Struts2 <s:bean>標籤示例
Struts2 <s:date>標籤示例
Struts2 <s:debug>標籤示例
Struts2 <s:include>標籤示例
Struts2 <s:i18n>標籤示例
Struts2 <s:param>標籤示例
Struts2 <s:property>標籤實例
Struts2 <s:push>標籤示例
Struts2 <s:set>標籤示例
Struts2 <s:texttag>標籤示例
Struts2 <s:url>標籤示例
Struts2資源包使用示例
Struts2本地化和國際化
Struts2 key鍵屬性示例
Struts2中文本地化問題
如何配置Struts2全局資源包
Struts2+Spring集成實例
Struts2+Quartz2調度集成實例
Struts2+Hibernate使用Full Hibernate Plugin集成
Struts2+Hibernate集成實例
Struts2+Spring+Hibernate集成實例
Struts2+Log4j集成
Struts2的FilterDispatcher和StrutsPrepareAndExecuteFilter有什麼不同?
Struts2獲取HttpServletRequest實例
Struts2獲取HttpServletResponse實例
如何獲取ServletContext對象
Struts2配置Action類的靜態參數
Struts2下載文件實例
Struts2和JSON實例

Struts2 <s:action>標籤示例

Struts2 的「action」標籤是用來直接從JSP頁面中調用Action類。如果「executeResult」屬性設置爲true,則結果頁的內容將直接在當前網頁渲染。

這是用一個完整的例子很好地說明:

1. 動作

Action類有幾個方法用來轉發不同結果的結果頁面。

ParamTagAction.java

package com.yiibai.common.action;

import com.opensymphony.xwork2.ActionSupport;

public class ActionTagAction extends ActionSupport{

public String execute() {
    return SUCCESS;
}

public String sayHello(){
    return "sayHello";
}

public String sayStruts2(){
    return "sayStruts2";
}

public String saySysOut(){
    System.out.println("SysOut SysOut SysOut");
    return "saySysOut";
}

}

2. <s:action>標籤示例

下面的JSP頁面顯示如何使用「action」標籤。如果 executeResult=」true」,動作標籤被指定方法執行且結果頁面將直接顯示; 否則,它只是執行的方法,結果頁面不會顯示出來。

action.jsp

<%@ taglib prefix="s" uri="/struts-tags" %>

struts2 action標籤示例<title> </head> <body> <h1>Struts2 action標籤示例</h1> <ol> <li> Execute the action's result, render the page here. <s:action name="sayHelloAction" executeResult="true"/> </li> <li> Doing the same as above, but call action's sayStruts2() method. <s:action name="sayHelloAction!sayStruts2" executeResult="true"/> </li> <li> Call the action's saySysOut() method only, no result will be rendered, By defautlt, executeResult="false". <s:action name="sayHelloAction!saySysOut" /> </li> </ol> </body> </html> <p><strong>sayHello.jsp</strong></p> <html> <head> </head> <body> <div><div class="ads-in-post hide\_if\_width\_less\_800"> <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <!-- 728x90 - After2ndH4 --> <ins class="adsbygoogle hide\_if\_width\_less\_800" style="display:inline-block;width:728px;height:90px" data-ad-client="ca-pub-2836379775501347" data-ad-slot="3642936086" data-ad-region="yiibairegion"></ins> <script> (adsbygoogle = window.adsbygoogle || \[\]).push({}); </script> </div></div><h2>Hello Hello Hello ~ from sayHello.jsp</h2> </body> </html> <p><strong>sayStruts2.jsp</strong></p> <html> <head> </head> <body> <h2>Struts 2 Struts 2 Struts 2 ~ from sayStruts2.jsp</h2> </body> </html> <p><strong>saySysOut.jsp</strong></p> <html> <head> </head> <body> <h2>SysOut SysOut SysOut ~ from saySysOut.jsp</h2> </body> </html> <h2 id="3-strutsxml">3. struts.xml</h2> <p>聲明一些結果名稱來演示 ExecuteReuslt 的效果。</p> <?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="default" namespace="/" extends="struts-default"> <pre><code><action name="actionTagAction" class="com.yiibai.common.action.ActionTagAction" > <result name="success">pages/action.jsp</result> </action> <action name="sayHelloAction" class="com.yiibai.common.action.ActionTagAction" method="sayHello"> <result name="sayHello">sayHello.jsp</result> <result name="sayStruts2">sayStruts2.jsp</result> <result name="saySysOut">saySysOut.jsp</result> </action></code></pre> </package> </struts> <h2 id="4-示例">4. 示例</h2> <p><a target="_blank" rel="nofollow noreferrer" href="http://localhost:8080/struts2actiontag/actionTagAction.action">http://localhost:8080/struts2actiontag/actionTagAction.action</a></p> <p>在瀏覽器中打開上面的URL,顯示結果如下圖:</p> <p> <img src=https://asset.1ju.org/cmsstatic/action-1.png loading='lazy' alt=Struts2 <s:action>標籤示例 class='my-8 w-full relative rounded-sm object-cover shadow-lg' /> </p> <h2 id="參考">參考</h2> <ol> <li> <a target="_blank" rel="nofollow noreferrer" href="http://struts.apache.org/2.0.14/docs/action.html">Struts2 <s:action>標籤文檔</a></li> </ol> <p>代碼下載 - <a target="_blank" rel="nofollow noreferrer" href="http://pan.baidu.com/s/1kT8NTUf">http://pan.baidu.com/s/1kT8NTUf</a></p> </div></div></div><div class="functional-area-bottom"><div class="text-center"><div class="d-inline-block dropdown"><button type="button" id="dropdown-basic" aria-expanded="false" class="dropdown-toggle btn btn-outline-secondary btn-lg"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="share-nodes" class="svg-inline--fa fa-share-nodes " role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path fill="currentColor" d="M352 224c53 0 96-43 96-96s-43-96-96-96s-96 43-96 96c0 4 .2 8 .7 11.9l-94.1 47C145.4 170.2 121.9 160 96 160c-53 0-96 43-96 96s43 96 96 96c25.9 0 49.4-10.2 66.6-26.9l94.1 47c-.5 3.9-.7 7.8-.7 11.9c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-25.9 0-49.4 10.2-66.6 26.9l-94.1-47c.5-3.9 .7-7.8 .7-11.9s-.2-8-.7-11.9l94.1-47C302.6 213.8 326.1 224 352 224z"></path></svg><span class="ml-1 show-row">Share</span></button></div></div></div></article></div><div class="card-footer"><div class="row"><div class="col"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="arrow-left" class="svg-inline--fa fa-arrow-left " role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path fill="currentColor" d="M9.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.2 288 416 288c17.7 0 32-14.3 32-32s-14.3-32-32-32l-306.7 0L214.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"></path></svg><a href="/struts-2/struts-2-a-tag-example">Struts2 <s:a>標籤示例</a></div><div class="col text-md-end"><a href="/struts-2/struts-2-bean-tag-example"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="arrow-right" class="svg-inline--fa fa-arrow-right " role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path fill="currentColor" d="M438.6 278.6c12.5-12.5 12.5-32.8 0-45.3l-160-160c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L338.8 224 32 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l306.7 0L233.4 393.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l160-160z"></path></svg>Struts2 <s:bean>標籤示例</a></div></div></div></div></div></div></div></div><footer class="bg-white py-5 font-size-14" id="footer"><div class="container"><div class="row"><dl class="col-6 col-md-3 d-none d-sm-block"><dt class="h6">鏈接</dt><dd class="my-1"><a class="text-secondary" href="https://www.ecool.shop/" title="Ecool Shop">Ecool Shop</a></dd></dl></div><hr class="mt-2 mb-4"/><div class="row"><div class="col-md-12"><div class="text-secondary text-center"> Copyright © 2015-2023 億聚網.</div></div></div></div></footer><script src="/_next/static/chunks/webpack-546743ddf7e8cb4f.js" async=""></script><script src="/_next/static/chunks/bce60fc1-3d5ef5c4572453f6.js" async=""></script><script src="/_next/static/chunks/698-b4ee1b293f5fb4bc.js" async=""></script><script src="/_next/static/chunks/main-app-a5eb339177c85de1.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:HL[\"/_next/static/css/1c4d07c82cde5388.css\",{\"as\":\"style\"}]\n0:\"$L2\"\n"])</script><script>self.__next_f.push([1,"3:I{\"id\":2353,\"chunks\":[\"272:static/chunks/webpack-546743ddf7e8cb4f.js\",\"253:static/chunks/bce60fc1-3d5ef5c4572453f6.js\",\"698:static/chunks/698-b4ee1b293f5fb4bc.js\"],\"name\":\"default\",\"async\":false}\n5:I{\"id\":43012,\"chunks\":[\"470:static/chunks/app/global-error-2d20c7d510a72141.js\"],\"name\":\"\",\"async\":false}\n6:I{\"id\":67676,\"chunks\":[\"957:static/chunks/59925f94-6302db480f248368.js\",\"210:static/chunks/ce69f5c4-ada3b84c9854a250.js\",\"703:static/chunks/703-ad7f7a9d88b70895.js\",\"652:static/chunks/652-2922f1746919c870"])</script><script>self.__next_f.push([1,".js\",\"814:static/chunks/814-8c170bd1a2e2c86e.js\",\"928:static/chunks/928-e2c979bb342b0445.js\",\"285:static/chunks/285-4809214f326cf011.js\",\"185:static/chunks/app/layout-491b43680903f5ac.js\"],\"name\":\"\",\"async\":false}\n7:I{\"id\":29099,\"chunks\":[\"957:static/chunks/59925f94-6302db480f248368.js\",\"210:static/chunks/ce69f5c4-ada3b84c9854a250.js\",\"703:static/chunks/703-ad7f7a9d88b70895.js\",\"652:static/chunks/652-2922f1746919c870.js\",\"814:static/chunks/814-8c170bd1a2e2c86e.js\",\"928:static/chunks/928-e2c979bb342b0445.js\""])</script><script>self.__next_f.push([1,",\"285:static/chunks/285-4809214f326cf011.js\",\"185:static/chunks/app/layout-491b43680903f5ac.js\"],\"name\":\"\",\"async\":false}\nb:I{\"id\":49180,\"chunks\":[\"272:static/chunks/webpack-546743ddf7e8cb4f.js\",\"253:static/chunks/bce60fc1-3d5ef5c4572453f6.js\",\"698:static/chunks/698-b4ee1b293f5fb4bc.js\"],\"name\":\"default\",\"async\":false}\nc:I{\"id\":92306,\"chunks\":[\"272:static/chunks/webpack-546743ddf7e8cb4f.js\",\"253:static/chunks/bce60fc1-3d5ef5c4572453f6.js\",\"698:static/chunks/698-b4ee1b293f5fb4bc.js\"],\"name\":\"default\",\"async\""])</script><script>self.__next_f.push([1,":false}\n"])</script><script>self.__next_f.push([1,"2:[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/1c4d07c82cde5388.css\",\"precedence\":\"next\"}]],[\"$\",\"$L3\",null,{\"buildId\":\"PeSdcBxKDNQIZlulyUEdm\",\"assetPrefix\":\"\",\"initialCanonicalUrl\":\"/struts-2/struts-2-action-tag-example\",\"initialTree\":[\"\",{\"children\":[[\"slug\",\"struts-2\",\"d\"],{\"children\":[[\"post\",\"struts-2-action-tag-example\",\"d\"],{\"children\":[\"__PAGE__\",{}]}]}]},\"$undefined\",\"$undefined\",true],\"initialHead\":[\"$L4\",null],\"globalErrorComponent\":\"$5\",\"notFound\":[\"$\",\"html\",null,{\"lang\":\"zh-Hant-TW\",\"children\":[[\"$\",\"meta\",null,{\"name\":\"viewport\",\"content\":\"minimum-scale=1, initial-scale=1, width=device-width, shrink-to-fit=no, user-scalable=no, viewport-fit=cover\"}],[\"$\",\"meta\",null,{\"charSet\":\"utf-8\"}],[\"$\",\"link\",null,{\"rel\":\"icon\",\"href\":\"/favicon.png\"}],[\"$\",\"$L6\",null,{\"async\":true,\"src\":\"https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-1574283203161704\"}],[\"$\",\"body\",null,{\"children\":[\"$\",\"$L7\",null,{\"children\":[\"$L8\",[\"$L9\",[],[\"$\",\"div\",null,{\"className\":\"page-content\",\"children\":[\"$\",\"div\",null,{\"className\":\"container\",\"children\":[\"$\",\"div\",null,{\"className\":\"box-404-wrap\",\"children\":[\"$\",\"div\",null,{\"className\":\"box\",\"children\":[\"$\",\"div\",null,{\"className\":\"d-flex flex-column align-items-center\",\"children\":[[\"$\",\"div\",null,{\"className\":\"text-wrap\",\"children\":[\"$\",\"h1\",null,{\"data-t\":\"404\",\"className\":\"h1\",\"children\":\"404\"}]}],[\"$\",\"div\",null,{\"className\":\"text-center mt-2\",\"children\":\"很抱歉,找不到此頁面! \"}],[\"$\",\"div\",null,{\"className\":\"mt-4\",\"children\":[\"$\",\"a\",null,{\"role\":\"button\",\"tabindex\":\"0\",\"href\":\"/\",\"className\":\"btn btn-primary\",\"children\":\"可前往首頁重新尋找頁面\"}]}]]}]}]}]}]}]],[\"$\",\"footer\",null,{\"className\":\"bg-white py-5 font-size-14\",\"id\":\"footer\",\"children\":[\"$\",\"div\",null,{\"className\":\"container\",\"children\":[[\"$\",\"div\",null,{\"className\":\"row\",\"children\":[\"$\",\"dl\",null,{\"className\":\"col-6 col-md-3 d-none d-sm-block\",\"children\":[[\"$\",\"dt\",null,{\"className\":\"h6\",\"children\":\"鏈接\"}],[\"$\",\"dd\",null,{\"className\":\"my-1\",\"children\":[\"$\",\"a\",null,{\"className\":\"text-secondary\",\"href\":\"https://www.ecool.shop/\",\"title\":\"Ecool Shop\",\"children\":\"Ecool Shop\"}]}]]}]}],[\"$\",\"hr\",null,{\"className\":\"mt-2 mb-4\"}],[\"$\",\"div\",null,{\"className\":\"row\",\"children\":[\"$\",\"div\",null,{\"className\":\"col-md-12\",\"children\":[\"$\",\"div\",null,{\"className\":\"text-secondary text-center\",\"children\":\" Copyright © 2015-2023 億聚網.\"}]}]}]]}]}]]}]}]]}],\"asNotFound\":false,\"children\":[[\"$\",\"html\",null,{\"lang\":\"zh-Hant-TW\",\"children\":[[\"$\",\"meta\",null,{\"name\":\"viewport\",\"content\":\"minimum-scale=1, initial-scale=1, width=device-width, shrink-to-fit=no, user-scalable=no, viewport-fit=cover\"}],[\"$\",\"meta\",null,{\"charSet\":\"utf-8\"}],[\"$\",\"link\",null,{\"rel\":\"icon\",\"href\":\"/favicon.png\"}],[\"$\",\"$L6\",null,{\"async\":true,\"src\":\"https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-1574283203161704\"}],[\"$\",\"body\",null,{\"children\":[\"$\",\"$L7\",null,{\"children\":[\"$La\",[\"$\",\"$Lb\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"loading\":\"$undefined\",\"loadingStyles\":\"$undefined\",\"hasLoading\":false,\"template\":[\"$\",\"$Lc\",null,{}],\"templateStyles\":\"$undefined\",\"notFound\":[\"$\",\"div\",null,{\"className\":\"page-content\",\"children\":[\"$\",\"div\",null,{\"className\":\"container\",\"children\":[\"$\",\"div\",null,{\"className\":\"box-404-wrap\",\"children\":[\"$\",\"div\",null,{\"className\":\"box\",\"children\":[\"$\",\"div\",null,{\"className\":\"d-flex flex-column align-items-center\",\"children\":[[\"$\",\"div\",null,{\"className\":\"text-wrap\",\"children\":[\"$\",\"h1\",null,{\"data-t\":\"404\",\"className\":\"h1\",\"children\":\"404\"}]}],[\"$\",\"div\",null,{\"className\":\"text-center mt-2\",\"children\":\"很抱歉,找不到此頁面! \"}],[\"$\",\"div\",null,{\"className\":\"mt-4\",\"children\":[\"$\",\"a\",null,{\"role\":\"button\",\"tabindex\":\"0\",\"href\":\"/\",\"className\":\"btn btn-primary\",\"children\":\"可前往首頁重新尋找頁面\"}]}]]}]}]}]}]}],\"notFoundStyles\":[],\"childProp\":{\"current\":[\"$\",\"$Lb\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",[\"slug\",\"struts-2\",\"d\"],\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"loading\":\"$undefined\",\"loadingStyles\":\"$undefined\",\"hasLoading\":false,\"template\":[\"$\",\"$Lc\",null,{}],\"templateStyles\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\",\"childProp\":{\"current\":[\"$\",\"$Lb\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",[\"slug\",\"struts-2\",\"d\"],\"children\",[\"post\",\"struts-2-action-tag-example\",\"d\"],\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"loading\":\"$undefined\",\"loadingStyles\":\"$undefined\",\"hasLoading\":false,\"template\":[\"$\",\"$Lc\",null,{}],\"templateStyles\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\",\"childProp\":{\"current\":[\"$Ld\",null],\"segment\":\"__PAGE__\"},\"styles\":[]}],\"segment\":[\"post\",\"struts-2-action-tag-example\",\"d\"]},\"styles\":[]}],\"segment\":[\"slug\",\"struts-2\",\"d\"]},\"styles\":[]}],[\"$\",\"footer\",null,{\"className\":\"bg-white py-5 font-size-14\",\"id\":\"footer\",\"children\":[\"$\",\"div\",null,{\"className\":\"container\",\"children\":[[\"$\",\"div\",null,{\"className\":\"row\",\"children\":[\"$\",\"dl\",null,{\"className\":\"col-6 col-md-3 d-none d-sm-block\",\"children\":[[\"$\",\"dt\",null,{\"className\":\"h6\",\"children\":\"鏈接\"}],[\"$\",\"dd\",null,{\"className\":\"my-1\",\"children\":[\"$\",\"a\",null,{\"className\":\"text-secondary\",\"href\":\"https://www.ecool.shop/\",\"title\":\"Ecool Shop\",\"children\":\"Ecool Shop\"}]}]]}]}],[\"$\",\"hr\",null,{\"className\":\"mt-2 mb-4\"}],[\"$\",\"div\",null,{\"className\":\"row\",\"children\":[\"$\",\"div\",null,{\"className\":\"col-md-12\",\"children\":[\"$\",\"div\",null,{\"className\":\"text-secondary text-center\",\"children\":\" Copyright © 2015-2023 億聚網.\"}]}]}]]}]}]]}]}]]}],null]}]]\n"])</script><script>self.__next_f.push([1,"e:I{\"id\":43817,\"chunks\":[\"957:static/chunks/59925f94-6302db480f248368.js\",\"210:static/chunks/ce69f5c4-ada3b84c9854a250.js\",\"703:static/chunks/703-ad7f7a9d88b70895.js\",\"652:static/chunks/652-2922f1746919c870.js\",\"814:static/chunks/814-8c170bd1a2e2c86e.js\",\"928:static/chunks/928-e2c979bb342b0445.js\",\"285:static/chunks/285-4809214f326cf011.js\",\"185:static/chunks/app/layout-491b43680903f5ac.js\"],\"name\":\"\",\"async\":false}\nf:I{\"id\":77095,\"chunks\":[\"703:static/chunks/703-ad7f7a9d88b70895.js\",\"91:static/chunks/app/c"])</script><script>self.__next_f.push([1,"ategory/[slug]/page-bbf4c946a9f81329.js\"],\"name\":\"\",\"async\":false}\n9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"8:[\"$\",\"div\",null,{\"className\":\"shadow-sm\",\"id\":\"sf-header\",\"children\":[[\"$\",\"$Le\",null,{}],[\"$\",\"div\",null,{\"className\":\"sub-head d-lg-flex bg-white\",\"children\":[\"$\",\"div\",null,{\"className\":\"container\",\"children\":[\"$\",\"div\",null,{\"className\":\"tag-container-outer\",\"children\":[[\"$\",\"div\",null,{\"className\":\"tag-container\",\"children\":[[\"$\",\"span\",\"java\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/java\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"Java技術\"}]}],[\"$\",\"span\",\"web\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/web\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"Web開發\"}]}],[\"$\",\"span\",\"hightlang\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/hightlang\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"高級語言\"}]}],[\"$\",\"span\",\"misc\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/misc\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"其他技術\"}]}],[\"$\",\"span\",\"script\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/script\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"腳本語言\"}]}],[\"$\",\"span\",\"database\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/database\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"數據庫\"}]}],[\"$\",\"span\",\"bigdata\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/bigdata\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"大數據教程\"}]}],[\"$\",\"span\",\"xml\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/xml\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"XML技術\"}]}],[\"$\",\"span\",\"zhuanyejiaoyu\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/zhuanyejiaoyu\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"專業教育\"}]}],[\"$\",\"span\",\"framework\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/framework\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"框架\"}]}],[\"$\",\"span\",\"software\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/software\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"軟件工具教程\"}]}],[\"$\",\"span\",\"telecom\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/telecom\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"通信技術\"}]}],[\"$\",\"span\",\"5f75e0e8c632ea000650d41e\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/microsoft-technology\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"微軟技術\"}]}],[\"$\",\"span\",\"quality\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/quality\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"軟件測試\"}]}],[\"$\",\"span\",\"mobile-dev\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/mobile-dev\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"手機開發\"}]}],[\"$\",\"span\",\"frontend\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/frontend\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"前端技術\"}]}],[\"$\",\"span\",\"5f75e2d9c632ea000650d488\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/artificial-intelligence\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"人工智能\"}]}],[\"$\",\"span\",\"how2code\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/how2code\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"實例代碼\"}]}]]}],[\"$\",\"div\",null,{\"className\":\"gradient-block\"}]]}]}]}]]}]\n"])</script><script>self.__next_f.push([1,"a:[\"$\",\"div\",null,{\"className\":\"shadow-sm\",\"id\":\"sf-header\",\"children\":[[\"$\",\"$Le\",null,{}],[\"$\",\"div\",null,{\"className\":\"sub-head d-lg-flex bg-white\",\"children\":[\"$\",\"div\",null,{\"className\":\"container\",\"children\":[\"$\",\"div\",null,{\"className\":\"tag-container-outer\",\"children\":[[\"$\",\"div\",null,{\"className\":\"tag-container\",\"children\":[[\"$\",\"span\",\"java\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/java\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"Java技術\"}]}],[\"$\",\"span\",\"web\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/web\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"Web開發\"}]}],[\"$\",\"span\",\"hightlang\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/hightlang\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"高級語言\"}]}],[\"$\",\"span\",\"misc\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/misc\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"其他技術\"}]}],[\"$\",\"span\",\"script\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/script\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"腳本語言\"}]}],[\"$\",\"span\",\"database\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/database\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"數據庫\"}]}],[\"$\",\"span\",\"bigdata\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/bigdata\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"大數據教程\"}]}],[\"$\",\"span\",\"xml\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/xml\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"XML技術\"}]}],[\"$\",\"span\",\"zhuanyejiaoyu\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/zhuanyejiaoyu\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"專業教育\"}]}],[\"$\",\"span\",\"framework\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/framework\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"框架\"}]}],[\"$\",\"span\",\"software\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/software\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"軟件工具教程\"}]}],[\"$\",\"span\",\"telecom\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/telecom\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"通信技術\"}]}],[\"$\",\"span\",\"5f75e0e8c632ea000650d41e\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/microsoft-technology\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"微軟技術\"}]}],[\"$\",\"span\",\"quality\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/quality\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"軟件測試\"}]}],[\"$\",\"span\",\"mobile-dev\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/mobile-dev\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"手機開發\"}]}],[\"$\",\"span\",\"frontend\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/frontend\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"前端技術\"}]}],[\"$\",\"span\",\"5f75e2d9c632ea000650d488\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/artificial-intelligence\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"人工智能\"}]}],[\"$\",\"span\",\"how2code\",{\"className\":\"tag-nav__item me-3\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/category/how2code\",\"className\":\"text-secondNav\",\"prefetch\":false,\"children\":\"實例代碼\"}]}]]}],[\"$\",\"div\",null,{\"className\":\"gradient-block\"}]]}]}]}]]}]\n"])</script><script>self.__next_f.push([1,"10:I{\"id\":48364,\"chunks\":[\"957:static/chunks/59925f94-6302db480f248368.js\",\"703:static/chunks/703-ad7f7a9d88b70895.js\",\"652:static/chunks/652-2922f1746919c870.js\",\"814:static/chunks/814-8c170bd1a2e2c86e.js\",\"507:static/chunks/507-b7b248284dd3c803.js\",\"928:static/chunks/928-e2c979bb342b0445.js\",\"27:static/chunks/app/[slug]/[post]/page-f1024873a96f4ead.js\"],\"name\":\"\",\"async\":false}\n87:I{\"id\":84010,\"chunks\":[\"703:static/chunks/703-ad7f7a9d88b70895.js\",\"91:static/chunks/app/category/[slug]/page-bbf4c946a9f81329"])</script><script>self.__next_f.push([1,".js\"],\"name\":\"\",\"async\":false}\n88:I{\"id\":9362,\"chunks\":[\"957:static/chunks/59925f94-6302db480f248368.js\",\"703:static/chunks/703-ad7f7a9d88b70895.js\",\"652:static/chunks/652-2922f1746919c870.js\",\"814:static/chunks/814-8c170bd1a2e2c86e.js\",\"507:static/chunks/507-b7b248284dd3c803.js\",\"190:static/chunks/app/article/[slug]/page-8819d505c1df94c3.js\"],\"name\":\"\",\"async\":false}\n8a:I{\"id\":91947,\"chunks\":[\"957:static/chunks/59925f94-6302db480f248368.js\",\"703:static/chunks/703-ad7f7a9d88b70895.js\",\"652:static/chunks/652"])</script><script>self.__next_f.push([1,"-2922f1746919c870.js\",\"814:static/chunks/814-8c170bd1a2e2c86e.js\",\"507:static/chunks/507-b7b248284dd3c803.js\",\"928:static/chunks/928-e2c979bb342b0445.js\",\"27:static/chunks/app/[slug]/[post]/page-f1024873a96f4ead.js\"],\"name\":\"\",\"async\":false}\n11:T3186,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cp\u003e Apache\u0026nbsp;\u003ca href=\"http://struts.apache.org/2.x/\"\u003eStruts 2\u003c/a\u003e\u0026nbsp;是一種流行的 Java模型 - 視圖 - 控制器(MVC)框架,成功地結合了\u0026nbsp;WebWork和Struts1.x 兩種 web 框架。 \u003c/p\u003e \n \u003cp\u003e Apache Struts2與Struts1完全不同,它的核心功能都是使用攔截實現「值棧」的概念,OGNL表達式和Struts2標籤來解決應用程序數據,很多註解和約定,使這個框架更加易於使用。 在本教程中,它提供了許多使用Struts2的MVC框架的實例和解釋。 \u003c/p\u003e \n \u003cp\u003e 歡迎來到易百教程學習Struts2。 \u003c/p\u003e \n \u003ch2\u003e Struts2 快速入門 \u003c/h2\u003e \n \u003cp\u003e Struts2快速入門的例子。 \u003c/p\u003e \n \u003cul\u003e \n \u003cli\u003e Struts 2 hello world (XML版本)\u003cbr\u003e 使用XML文件的Struts 2 Hello World 示例 \u003c/li\u003e \n \u003cli\u003e Struts 2 Hello World (註解版本)\u003cbr\u003e 使用註釋的Struts 2 Hello World 示例 \u003c/li\u003e \n \u003cli\u003e @ResultPath 註釋示例\u003cbr\u003e @ResultPath 註釋說明和示例 \u003c/li\u003e \n \u003c/ul\u003e \n \u003ch2\u003e Struts2 配置 \u003c/h2\u003e \n \u003cp\u003e 任何關於 Struts2 的配置文件。 \u003c/p\u003e \n \u003cul\u003e \n \u003cli\u003e 多個Struts配置文件示例\u003cbr\u003e 拆分大的Struts配置文件分成多個小的配置文件。 \u003c/li\u003e \n \u003cli\u003e Struts2 命名空間配置和解釋 \u003cbr\u003e \n \u003cdiv\u003e\n Struts2命名空間是一個新的概念,用來處理多個模塊,由下式給出一個命名空間對應的每個模塊。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e Struts2開發模式\u003cbr\u003e \n \u003cdiv\u003e\n 啓用了Struts2開發模式將會使調試變得更容易。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 如何刪除Struts2動作的後綴擴展名 \n \u003c/div\u003e \u003cbr\u003e \n \u003cdiv\u003e\n 默認的「.action」擴展名是醜陋的,並不是用戶友好的,可以刪除或用另一個擴展名來取代它。 \n \u003c/div\u003e \u003c/li\u003e \n \u003c/ul\u003e \n \u003ch2\u003e Struts2 動作和表單 \u003c/h2\u003e \n \u003cdiv\u003e\n Struts\u0026nbsp;2的動作和表單數據管理。 \n \u003c/div\u003e \n \u003cul\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 使用Struts2動作 \n \u003c/div\u003e \n \u003cdiv\u003e\n Struts\u0026nbsp;2的動作說明和示例。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e Struts 2 ActionError \u0026amp; ActionMessage Example\u003cbr\u003e \n \u003cdiv\u003e\n Struts\u0026nbsp;2的ActionError和ActionMessage的解釋和例子。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e Struts 2 ModelDriven example\u003cbr\u003e \n \u003cdiv\u003e\n 自動將的表單數據傳輸到對象。 \n \u003c/div\u003e \u003c/li\u003e \n \u003c/ul\u003e \n \u003ch2\u003e Struts2 攔截器 \u003c/h2\u003e \n \u003cdiv\u003e\n 關於Struts\u0026nbsp;2的攔截器。 \n \u003c/div\u003e \n \u003cul\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 映射攔截動作 \n \u003c/div\u003e \n \u003cdiv\u003e\n 配置攔截器動作。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 重寫攔截器參數 \n \u003c/div\u003e \n \u003cdiv\u003e\n 幾種方法來覆蓋攔截器的參數。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 攔截器棧的例子 \n \u003c/div\u003e \n \u003cdiv\u003e\n 攔截器堆棧用於建立一組的攔截器,以再利用。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 創建自己的攔截器 \n \u003c/div\u003e \n \u003cdiv\u003e\n 創建自己的攔截器指南,以滿足您的需求。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n execAndWait攔截器例子 \n \u003c/div\u003e \n \u003cdiv\u003e\n 一個非常方便的攔截器長時間運行動作在後臺,顯示用戶的自定義的等待頁面。 \n \u003c/div\u003e \u003c/li\u003e \n \u003c/ul\u003e \n \u003ch2\u003e Struts 2 UI標籤 \u003c/h2\u003e \n \u003cdiv\u003e\n Struts\u0026nbsp;2的UI標籤,來渲染HTML表單和非表單組件。 \n \u003c/div\u003e \n \u003cul\u003e \n \u003cli\u003e TextBox文檔示例\u003cbr\u003e Struts2 \u0026lt;s:textfield\u0026gt; 文本實例. \u003c/li\u003e \n \u003cli\u003e Password 示例\u003cbr\u003e Struts2 \u0026lt;s:password\u0026gt; 密碼實例. \u003c/li\u003e \n \u003cli\u003e Hidden隱藏值示例\u003cbr\u003e Struts2 \u0026lt;s:hidden\u0026gt;\u0026nbsp;隱藏值例子 \u003c/li\u003e \n \u003cli\u003e Textarea - 文本域\u003cbr\u003e Struts2 \u0026lt;s:textarea\u0026gt;\u0026nbsp;textarea例子 \u003c/li\u003e \n \u003cli\u003e Radio 單選按鍵示例\u003cbr\u003e Struts2 \u0026lt;s:radio\u0026gt; radio單選按鈕例子 \u003c/li\u003e \n \u003cli\u003e \u0026nbsp;預選單選按鈕\u003cbr\u003e \n \u003cdiv\u003e\n 預選單選按鈕值示例 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e 複選框heckbox 示例\u003cbr\u003e Struts2 \u0026lt;s:checkbox\u0026gt; 複選框示例 \u003c/li\u003e \n \u003cli\u003e 複選框checkboxes 示例\u003cbr\u003e Struts2 \u0026lt;s:checkboxlist\u0026gt;\u0026nbsp;多發覆選框的例子 \u003c/li\u003e \n \u003cli\u003e 設置複選框的默認值\u003cbr\u003e \n \u003cdiv\u003e\n 設置多個複選框的默認值 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e 下拉框示例\u003cbr\u003e Struts2 \u0026lt;s:select\u0026gt;\u0026nbsp;下拉框例子 \u003c/li\u003e \n \u003cli\u003e 自動選擇下拉框示例\u003cbr\u003e \n \u003cdiv\u003e\n 自動選擇下拉框值指南 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e 組合框示例\u003cbr\u003e Struts2 \u0026lt;s:combobox\u0026gt;\u0026nbsp;組合框的例子 \u003c/li\u003e \n \u003cli\u003e head 示例\u003cbr\u003e Struts2 \u0026lt;s:head\u0026gt;,\u0026nbsp;呈現一個HTML頭組件 \u003c/li\u003e \n \u003cli\u003e 文件上傳示例\u003cbr\u003e Struts2 \u0026lt;s:file\u0026gt; 文件上傳示例 \u003c/li\u003e \n \u003cli\u003e 多文件上傳示例\u003cbr\u003e Struts2 \u0026lt;s:file\u0026gt; 多文件上傳示例 \u003c/li\u003e \n \u003cli\u003e 級聯選擇示例\u003cbr\u003e Struts2 \u0026lt;s:doubleselect\u0026gt;,\u0026nbsp;創建兩個HTML下拉框,當第一下拉列表中選擇,第二下拉列表將相應地改變 \u003c/li\u003e \n \u003cli\u003e updownselect 示例\u003cbr\u003e Struts2 \u0026lt;s:updownselect\u0026gt;,\u0026nbsp;創建一個帶有按鈕,向上或向下移動在選擇組件的選項選擇HTML組件。 \u003c/li\u003e \n \u003cli\u003e optiontransferselect 示例\u003cbr\u003e Struts2 \u0026lt;s:optiontransferselect\u0026gt;,\u0026nbsp;兩個「updownselect」選擇組件排列在左側和右側,在它們中間包含有按鈕來移動自己的選擇選項。 \u003c/li\u003e \n \u003cli\u003e datetimepicker 日期選擇\u003cbr\u003e Struts2 \u0026lt;s:datetimepicker\u0026gt;,\u0026nbsp;將呈現一個文本框和追加後面的日曆圖標,單擊日曆圖標上會提示的日期時間選擇器組件。 \u003c/li\u003e \n \u003cli\u003e autocompleter自動完成示例\u003cbr\u003e Struts2 \u0026lt;s:autocompleter\u0026gt;,\u0026nbsp;一個組合框,會自動提示下拉的提示菜單,在用戶輸入文本框時。 \u003c/li\u003e \n \u003cli\u003e autocompleter + JSON 示例\u003cbr\u003e \n \u003cdiv\u003e\n 舉個例子,使用JSON數據填充到autocompleter組件。 \n \u003c/div\u003e \u003c/li\u003e \n \u003c/ul\u003e \n \u003ch2\u003e Struts 2 控制標籤 \u003c/h2\u003e \n \u003cdiv\u003e\n 在 Struts2 中的控制標籤或邏輯標籤,用來做條件處理,迭代,處理和顯示數據。 \n \u003c/div\u003e \n \u003cul\u003e \n \u003cli\u003e \u0026lt;s:iterator\u0026gt;標籤迭代示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts2迭代器標籤用來迭代一個值,它可以是任何的 java.util.Collection 或 java.util.Iterator \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u0026lt;s:if\u0026gt;, \u0026lt;s:elseIf\u0026gt;, \u0026lt;s:else\u0026gt; 標籤示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts2\u0026nbsp;if,elseif和else標籤被用來執行基本條件檢查。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u0026lt;s:append\u0026gt;標籤示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts2\u0026nbsp;\u0026lt;s:append\u0026gt;標籤用來組合幾個迭代器(由列表或映射創建)到一個迭代器 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u0026lt;s:generator\u0026gt; 標籤示例\u003cbr\u003e \n \u003cdiv\u003e\n struts2\u0026nbsp;\u0026lt;s:generator\u0026gt;標記用於基於在頁中提供「val」屬性,以產生一個迭代。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u0026lt;s:merge\u0026gt;標籤示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts2\u0026nbsp;\u0026lt;s:merge\u0026gt;標籤用來合併幾個迭代器(以列表或映射創建)成一個迭代器。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u0026lt;s:sort\u0026gt;標籤示例\u003cbr\u003e Struts2 \u0026lt;s:sort\u0026gt;是用於排序一個列表,它通過使用 java.util.Comparator 來實現。 \u003c/li\u003e \n \u003cli\u003e subset tag example\u003cbr\u003e Struts2 \u0026lt;s:subset\u0026gt;標記用於輸出一個迭代元素的子集或部分。 \u003c/li\u003e \n \u003c/ul\u003e \n \u003ch2\u003e Struts2 數據標籤 \u003c/h2\u003e \n \u003cdiv\u003e\n Struts2數據標籤,從ValueStack中獲取數據,或將數據放入ValusStack。 \n \u003c/div\u003e \n \u003cul\u003e \n \u003cli\u003e \u0026lt;s:a\u0026gt;標籤示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts2的\u0026lt;s:a\u0026gt;標籤被用於渲染HTML的「\u0026lt;a\u0026gt;」標籤。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u0026lt;s:action\u0026gt;標籤示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts2的\u0026lt;s:action\u0026gt;標籤用來直接在一個JSP頁面中調用Action類 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u0026lt;s:bean\u0026gt;標籤示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts2的\u0026lt;s:bean\u0026gt;標籤用來在JSP頁面中實例化一個類 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u0026lt;s:date\u0026gt;標籤示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts2的\u0026lt;s:date\u0026gt;標籤用來在JSP頁面格式Date對象。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u0026lt;s:debug\u0026gt;標籤示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts\u0026nbsp;2的\u0026lt;s:debug\u0026gt;標籤是一個非常有用的調試標記,用於輸出「值棧」的內容,並在JSP頁面中輸出「堆棧上下文」的詳細信息。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u0026lt;s:include\u0026gt;標籤示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts\u0026nbsp;2的\u0026lt;s:include\u0026gt;標籤用來直接包含JSP或HTML頁面到當前頁面。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u0026lt;s:i18n\u0026gt;標籤示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts\u0026nbsp;2的\u0026lt;s:i18n\u0026gt;標籤用來獲取聲明的資源包,而不僅僅是資源包,也可獲取當前操作相關聯的消息。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u0026lt;s:param\u0026gt;標籤示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts2的\u0026lt;s:param\u0026gt;標籤用來參數化其他標籤。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u0026lt;s:property\u0026gt;標籤示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts2的\u0026lt;s:property\u0026gt;標籤用來從一個類獲取當前默認Action類的屬性值。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u0026lt;s:push\u0026gt;標籤示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts2的\u0026lt;s:push\u0026gt;標籤用來推值到堆棧的頂部,以便它可以容易訪問或參考。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u0026lt;s:set\u0026gt;標籤示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts2的\u0026lt;s:set\u0026gt;標籤用來在指定的範圍內(應用,會話,請求,頁面,或動作)賦值給一個變量 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u0026lt;s:text\u0026gt;標籤示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts2的\u0026lt;s:text\u0026gt;標籤用於從操作類取出資源包消息 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u0026lt;s:url\u0026gt;標籤示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts2的\u0026nbsp;\u0026lt;s:url\u0026gt;\u0026nbsp;標籤用來創建一個URL,並輸出作爲文本格式 \n \u003c/div\u003e \u003c/li\u003e \n \u003c/ul\u003e \n \u003ch2\u003e Struts2 資源包和本地化 \u003c/h2\u003e \n \u003cdiv\u003e\n Struts2的資源包來支持網絡定位功能(多語言) \n \u003c/div\u003e \n \u003cul\u003e \n \u003cli\u003e 資源包使用示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts2的資源包的解釋和例子 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e i18n 或本地化示例\u003cbr\u003e \n \u003cdiv\u003e\n 一個Struts\u0026nbsp;2的國際化和多語言的例子來說明如何使用資源包來顯示不同語言的消息 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e key 屬性示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts\u0026nbsp;2\u0026nbsp;key屬性在UI組件是處理本地化的常用方法,也UI標籤編碼的一個非常有效的方法 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e Chinese 本地化問題\u003cbr\u003e \n \u003cdiv\u003e\n 一個常見的中國本地化的問題 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e 配置全局資源包\u003cbr\u003e \n \u003cdiv\u003e\n 配置Struts2的全局資源包指南 \n \u003c/div\u003e \u003c/li\u003e \n \u003c/ul\u003e \n \u003ch2\u003e Struts2主題 \u003c/h2\u003e \n \u003cdiv\u003e\n Struts2 的佈局是由「XHTML」主題設計的,所以瞭解 Struts2 主題概念是必須的。 \n \u003c/div\u003e \n \u003cul\u003e \n \u003cli\u003e Struts2 主題和模板\u003cbr\u003e \n \u003cdiv\u003e\n Struts\u0026nbsp;2主題和模板的說明和示例 \n \u003c/div\u003e \u003c/li\u003e \n \u003c/ul\u003e \n \u003ch2\u003e Struts2集成其它框架 \u003c/h2\u003e \n \u003cdiv\u003e\n Struts2與任何他人框架的整合\u0026nbsp;-\u0026nbsp;Spring,\u0026nbsp;Hibernate,\u0026nbsp;Quartz,\u0026nbsp;Log4j… \n \u003c/div\u003e \n \u003cul\u003e \n \u003cli\u003e Struts2 + Spring集成實例\u003cbr\u003e \n \u003cdiv\u003e\n Struts2和Spring框架集成。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e Struts2 + Quartz調度集成實例\u003cbr\u003e \n \u003cdiv\u003e\n Struts2和Quartz調度框架集成。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e Struts2 + Hibernate 集成實例\u003cbr\u003e \n \u003cdiv\u003e\n 集成 Struts2 和 Hibernate 框架。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e Struts2 + Hibernate使用「Full Hibernate Plugin\"插件集成\u003cbr\u003e 使用 「Full Hibernate Plugin」集成Struts2 和Hibernate3 \u003c/li\u003e \n \u003cli\u003e Struts2 + Spring + Hibernate集成實例\u003cbr\u003e \n \u003cdiv\u003e\n 集成Struts2,Spring和Hibernate三個框架。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e Struts 2 + Log4j 集成實例\u003cbr\u003e 集成Struts 2 和Log4j 框架. \u003c/li\u003e \n \u003c/ul\u003e \n \u003ch2\u003e Struts2 FAQ \u003c/h2\u003e \n \u003cul\u003e \n \u003cli\u003e FilterDispatcher 和 StrutsPrepareAndExecuteFilter區別?\u003cbr\u003e \n \u003cdiv\u003e\n 關於開發問\u0026nbsp;filterdispatcher\u0026nbsp;和\u0026nbsp;strutsprepareandexecutefilter\u0026nbsp;之間的差異。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e 在Struts2中獲取 HttpServletRequest\u003cbr\u003e \n \u003cdiv\u003e\n 獲取\u0026nbsp;Struts2\u0026nbsp;HttpServletRequest對象的實例。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e 在Struts2獲取HttpServletResponse對象\u003cbr\u003e 在Struts2中如何獲取 HttpServletResponse 對象實例 \u003c/li\u003e \n \u003cli\u003e 在Struts2中如何獲取ServletContext對象\u003cbr\u003e 在Struts2獲取ServletContext對象實例 \u003c/li\u003e \n \u003cli\u003e 在Struts2中配置靜態參數(有示例代碼)\u003cbr\u003e \n \u003cdiv\u003e\n 在Struts2配置靜態參數實例 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e Struts2下載文件實例(有實例代碼)\u003cbr\u003e \n \u003cdiv\u003e\n Struts2實現下載文件實例 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e Struts2 和 JSON 實例(有實例代碼)\u003cbr\u003e \n \u003cdiv\u003e\n 舉個例子來說明Struts2集成JSON數據。 \n \u003c/div\u003e \u003c/li\u003e \n \u003c/ul\u003e \n \u003ch2\u003e Struts2 參考 \u003c/h2\u003e \n \u003cul\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.x/\"\u003eStruts2 官方文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/generic-tag-reference.html\"\u003eStruts2 通用標籤\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://en.wikipedia.org/wiki/Apache_Struts\"\u003ehttp://en.wikipedia.org/wiki/Apache_Struts\u003c/a\u003e \u003c/li\u003e \n \u003c/ul\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"12:T11bfb,"])</script><script>self.__next_f.push([1,"\u003cp\u003e Struts2是基於MVC設計模式的流行和成熟的Web應用程序框架。Struts2並不只是\u003cspan\u003eStruts 1\u003c/span\u003e下一個版本,但它是一個完全重寫的Struts架構。 \u003c/p\u003e \n\u003cp\u003e WebWork框架開始了與Struts框架爲基礎,其目標是建立在Struts的Web開發更容易爲開發人員提供了加強和改進的框架。 \u003c/p\u003e \n\u003cp\u003e 一段時間後,WebWork框架和Struts社區聯手打造著名的Struts2框架。 \u003c/p\u003e \n\u003ch2\u003e Struts 2 框架特性: \u003c/h2\u003e \n\u003cp\u003e 這裏有一些偉大的特性,可能會迫使你考慮使用Struts2: \u003c/p\u003e \n\u003col\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003ePOJO形式和POJO動作\u003c/span\u003e\u0026nbsp;- 已經擺脫了Struts2的動作表單的Struts框架的一個組成部分。Struts2可以使用任何的POJO接收的形式輸入。同樣的,你現在可以看到任何POJO的Action類。 \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003eTag支持\u003c/span\u003e\u0026nbsp;- Struts2的形式提高了標籤的新標籤讓開發人員寫更少的代碼。 \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003eAJAX支持\u003c/span\u003e- Struts2中已經認識到了Web2.0技術,並整合到產品中AJAX支持創建AJAX的標籤,該功能非常相似的標準Struts2的標籤。 \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003e容易整合\u003c/span\u003e\u0026nbsp;- 與其他框架如Spring,Tiles和SiteMesh的整合是現在更容易與各種集成Struts2。 \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003e模板支持\u003c/span\u003e\u0026nbsp;- 支持生成使用模板。 \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003e插件支持\u003c/span\u003e\u0026nbsp;- 核心Struts2行爲,可以加強和擴大使用插件。大量的插件可供Struts2。 \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003e概要分析\u003c/span\u003e- Struts2的提供集成的配置,調試和分析應用程序。此外,Struts還提供了內置調試工具的幫助下,集成調試。 \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003e標籤修改容易\u003c/span\u003e\u0026nbsp;- 在Struts2標籤標記,可以調整使用FreeMarker模板。這並不需要JSP或Java知識。基本的HTML,XML和CSS知識是不夠的修改的標籤。 \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003e提升更少的配置\u003c/span\u003e\u0026nbsp;- Struts2的促進更少的配置與用於各種設置的幫助下,使用默認值。你沒有的東西,除非它偏離由Struts2的默認設置的配置。 \u003c/p\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003ch1\u003e Struts 2 環境配置: \u003c/h1\u003e \n\u003cp\u003e 我們的首要任務是要得到一個最小的Struts2中運行的應用程序。本章將指導您如何使用\u003cspan\u003eStruts2\u003c/span\u003e編寫一個應用程序。我假設你已經在你的機器上安裝JDK(5+),Tomcat和Eclipse。如果你沒有安裝這些組件,請執行以下步驟: \u003c/p\u003e \n\u003ch2\u003e Step 1 - 設置JAVA開發工具包 (JDK): \u003c/h2\u003e \n\u003cp\u003e \u003cbr\u003e 從Oracle的Java站點:Java SE下載,您可以\u003ca href=\"http://www.oracle.com/technetwork/java/javase/downloads/index.html\"\u003e下載最新版本的SDK\u003c/a\u003e。您會發現說明安裝JDK下載的文件,按照給定的說明來安裝和配置的設置。最後,設置PATH和JAVA_HOME環境變量指向的目錄,其中包含java和javac,通常\u003cspan\u003e分別爲:\u003c/span\u003ejava_install_dir/bin和java_install_dir。 \u003c/p\u003e \n\u003cp\u003e 如果運行的是Windows SDK安裝在c:\\jdk1.5.0_20,你就必須把你的C:\\autoexec.bat文件中的以下行。 \u003c/p\u003e \n\u003cpre\u003eset PATH=C:\\jdk1.5.0_20\\bin;%PATH%\r\nset JAVA_HOME=C:\\jdk1.5.0_20\r\u003c/pre\u003e \n\u003cp\u003e 另外,在Windows NT/2000/XP中,您也可以右鍵單擊「我的電腦」,選擇「屬性」,再先進,環境變量。然後,您會更新PATH的值,然後按「確定」按鈕。\u003cbr\u003e 在Unix(Solaris和Linux等),如果SDK安裝在/usr/local/jdk1.5.0_20,你使用的是C shell,把下面的到.cshrc文件寫入。 \u003c/p\u003e \n\u003cpre\u003esetenv PATH /usr/local/jdk1.5.0_20/bin:$PATH\r\nsetenv JAVA_HOME /usr/local/jdk1.5.0_20\r\u003c/pre\u003e \n\u003cp\u003e 另外,如果你使用像Borland的JBuilder,Eclipse的IntelliJ IDEA或Sun ONE Studio集成開發環境(IDE),編譯並運行一個簡單的程序,以確認該IDE知道在哪裏安裝Java,否則不正確的設置爲給定的文檔IDE。 \u003c/p\u003e \n\u003ch2\u003e Step 2 - 安裝Apache Tomcat: \u003c/h2\u003e \n\u003cp\u003e \u003cbr\u003e 您可以下載最新版本Tomcat\u0026nbsp;\u003ca href=\"http://tomcat.apache.org/\"\u003ehttp://tomcat.apache.org/\u003c/a\u003e。一旦下載安裝,解壓縮的二進制分發到一個方便的位置。例如,Window下在C:\\Apache或/usr/local/apache-tomcat-6.0.33 tomcat-6.0.33 Linux/Unix和創建CATALINA_HOME環境變量指向這些位置上。\u003cspan\u003eTomcat可以開始執行下面的命令在Windows機器上,可以簡單地雙擊的startup.bat\u003c/span\u003e \u003c/p\u003e \n\u003cpre\u003e %CATALINA_HOME%\\bin\\startup.bat\r\n or\r\n C:\\apache-tomcat-6.0.33\\bin\\startup.bat\r\u003c/pre\u003e \n\u003cp\u003e Tomcat可以開始UNIX(Solaris和Linux等)的機器上執行下面的命令: \u003c/p\u003e \n\u003cpre\u003e$CATALINA_HOME/bin/startup.sh\r\nor\r\n/usr/local/apache-tomcat-6.0.33/bin/startup.sh\r\u003c/pre\u003e \n\u003cp\u003e 成功啓動後,默認包含在Tomcat中的Web應用程序將可以通過訪問輸入http://localhost:8080/。如果一切順利,那麼它應該顯示以下結果: \u003c/p\u003e \n\u003cimg alt=\"Struts2快速入門\" src=\"https://asset.1ju.org/cmsstatic/struts2-1.jpg\"\u003e \n\u003cp\u003e 有關配置和運行Tomcat的進一步信息包含在文檔中,可以找到這裏,以及在Tomcat Web站點:http://tomcat.apache.org\u003cbr\u003e 停止Tomcat既可以通過Windows機器上執行下面的命令: \u003c/p\u003e \n\u003cpre\u003e%CATALINA_HOME%\\bin\\shutdown\r\nor\r\n\r\nC:\\apache-tomcat-5.5.29\\bin\\shutdown\r\u003c/pre\u003e \n\u003cp\u003e Tomcat可以停止執行下面命令在Unix(Solaris和Linux等)機器: \u003c/p\u003e \n\u003cpre\u003e$CATALINA_HOME/bin/shutdown.sh\r\nor\r\n/usr/local/apache-tomcat-5.5.29/bin/shutdown.sh\r\u003c/pre\u003e \n\u003ch2\u003e Step 3 - 安裝Eclipse (IDE) \u003c/h2\u003e \n\u003cp\u003e 在本教程中所有的例子已經寫入使用Eclipse IDE。所以,我建議你有你的機器上安裝最新版本Eclipse。 \u003c/p\u003e \n\u003cp\u003e 要安裝Eclipse的dDownload的最新的Eclipse二進制文件\u003ca href=\"http://www.eclipse.org/downloads/\"\u003ehttp://www.eclipse.org/downloads/\u003c/a\u003e。一旦你下載安裝,解壓縮的二進制分發到一個方便的位置。例如,在\u003cspan\u003eC:\\eclipse\u003c/span\u003e上Eclipse,或\u003cspan\u003e/usr/local/eclipse\u003c/span\u003e在Linux/Unix終於適當設置PATH變量。 \u003c/p\u003e \n\u003cp\u003e Eclipse可以啓動Windows機器上執行下面的命令,或者你可以簡單地雙擊的eclipse.exe \u003c/p\u003e \n\u003cpre\u003e %C:\\eclipse\\eclipse.exe\r\u003c/pre\u003e \n\u003cp\u003e Eclipse可以啓動UNIX(Solaris和Linux等)的機器上執行下面的命令: \u003c/p\u003e \n\u003cpre\u003e$/usr/local/eclipse/eclipse\r\u003c/pre\u003e \n\u003cp\u003e 成功啓動後,如果一切正常,那麼它應顯示以下結果: \u003c/p\u003e \n\u003cimg alt=\"Struts2快速入門\" src=\"https://asset.1ju.org/cmsstatic/struts2-2.jpg\"\u003e \n\u003ch2\u003e Step 4 - 安裝Struts2 類庫 \u003c/h2\u003e \n\u003cp\u003e 現在,如果一切正常,那麼你可以繼續設置您的Struts 2框架。以下是簡單的步驟,下載並安裝在機器上Struts2。 \u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e 請選擇是否要安裝Hibernate在Windows或Unix,然後繼續進行下一個步驟下載.zip文件窗口.tz文件爲Unix。 \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 下載最新版本的Struts2的二進制文件:\u0026nbsp;\u003ca href=\"http://struts.apache.org/download.cgi\"\u003ehttp://struts.apache.org/download.cgi\u003c/a\u003e. \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 在寫這篇教程的時候,我下載的是struts-2.0.14-all.zip,當解壓下載的文件時,它有C:\\struts-2.2.3如下的目錄結構內。 \u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cimg alt=\"Struts2快速入門\" src=\"https://asset.1ju.org/cmsstatic/struts2-3.jpg\"\u003e \n\u003cp\u003e 第二個步驟是解壓zip文件中的任何位置,我下載和提取struts-2.2.3-all.zip在c:\\文件夾中,我的Windows 7機器上的所有jar文件複製到c:\\struts-2.20.3\\lib中。確保正確設置CLASSPATH變量,否則將出現錯誤問題,同時運行您的應用程序。 \u003c/p\u003e \n\u003ch1\u003e Struts 2 體系結構: \u003c/h1\u003e \n\u003cp\u003e 從高層次來看,Struts2是一個上拉MVC(MVC2)框架。在Struts2的Model-View-Controller模式實現以下五個核心組件: \u003c/p\u003e \n\u003col\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003eActions\u003c/span\u003e \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003eInterceptors\u003c/span\u003e \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003eValue Stack / OGNL\u003c/span\u003e \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003eResults / Result types\u003c/span\u003e \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003eView technologies\u003c/span\u003e \u003c/p\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e Struts 2的是從傳統的MVC框架,在該框架中的作用的模式,而不是控制器的作用略有不同,雖然有一些重疊。 \u003c/p\u003e \n\u003cimg alt=\"Struts2快速入門\" src=\"https://asset.1ju.org/cmsstatic/struts2-1.gif\"\u003e \n\u003cp\u003e 上圖描述了Struts2的高層體系結構模型,視圖和控制器。一個Struts2的調度Servlet過濾器和攔截器與控制器實現,該模型實現的動作和視圖的組合的結果類型和結果。值棧和OGNL提供了共同點,其他部件之間的連接和集成。 \u003c/p\u003e \n\u003cp\u003e 除了從上述組分中,將有一個特定的信息涉及到配置。爲Web應用程序的配置以及配置動作,攔截器,結果等。\u003cbr\u003e 這是Struts的MVC模式的體系結構概述。我們將在隨後的章節中通過每個組件\u003cspan\u003e更詳細地熟悉和理解\u003c/span\u003e。 \u003c/p\u003e \n\u003ch2\u003e 請求生命週期: \u003c/h2\u003e \n\u003cp\u003e 基於上述數據圖,可以解釋用戶的請求的生命週期在Struts 2如下所示: \u003c/p\u003e \n\u003col\u003e \n \u003cli\u003e \u003cp\u003e 用戶發送請求到服務器,用於請求對某些資源(即頁). \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e FilterDispatcher排着眼於該請求,然後確定適當的Action. \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 配置攔截器的功能適用於如驗證,文件上傳等。 \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 選擇的動作執行,執行所請求的操作。 \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 同樣,配置攔截器做任何後期處理,如果需要的話。 \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 最後的結果是由視圖準備,並且將結果返回給用戶。 \u003c/p\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003ch1\u003e Struts 2 Hello World 實例: \u003c/h1\u003e \n\u003cp\u003e 從中學到了Struts 2的架構,當你點擊一個超鏈接或提交一個Struts2的Web應用程序的HTML表單中,輸入被髮送到一個Java類操作的控制器,收集。執行該操作後,結果選擇了一個資源來呈現的響應。資源通常是一個JSP,但它也可以是一個PDF文件,Excel電子表格,或Java小應用程序窗口。 \u003c/p\u003e \n\u003cp\u003e 假設你已經建立您的開發環境。現在,讓我們繼續建立我們的第一個Hello World struts2的項目。這個項目的目的是建立一個Web應用程序,收集用戶的username,並顯示「Hello World」,後面的用戶名。我們將創建任何Struts2項目的四個組成部分: \u003c/p\u003e \n\u003ctable width=\"100%\"\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003cth width=\"5\"\u003e SN \u003c/th\u003e \n \u003cth\u003e 組件\u0026amp;描述 \u003c/th\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 1 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eAction\u003c/span\u003e\u003cbr\u003e Create an action class which will contain complete business logic and conrol the interaction between the user, the model, and the view. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 2 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eInterceptors\u003c/span\u003e\u003cbr\u003e Create interceptors if required, or use existing interceptors. This is part of Controller. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 3 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eView\u003c/span\u003e\u003cbr\u003e Create a JSPs to interact with the user to take input and to present the final messages. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 4 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eConfiguration Files\u003c/span\u003e\u003cbr\u003e Create configuration files to couple the Action, View and Controllers. These files are struts.xml, web.xml, struts.properties. \u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n\u003c/table\u003e \n\u003cp\u003e 我要使用Eclipse IDE,所以下創建一個動態Web項目所需的所有組件。因此,讓我們開始創建動態Web項目。 \u003c/p\u003e \n\u003ch2\u003e 創建一個動態Web項目: \u003c/h2\u003e \n\u003cp\u003e 開始你的Eclipse,然後進入「文件」\u0026gt;「新建」\u0026gt;「動態Web項目,然後輸入項目名稱爲HelloWorldStruts2和設置其他的選項,在下面的屏幕: \u003c/p\u003e \n\u003cimg alt=\"Struts2快速入門\" src=\"https://asset.1ju.org/cmsstatic/struts2-4.jpg\"\u003e \n\u003cp\u003e 選擇在屏幕上的所有默認選項,最後檢查生成的web.xml部署描述符選項。這將創建一個動態Web項目在Eclipse中。現在去窗口\u0026gt;顯示視圖\u0026gt;項目資源管理器,你會看到你的項目窗口中的東西如下: \u003c/p\u003e \n\u003cimg alt=\"Struts2快速入門\" height=\"425\" src=\"https://asset.1ju.org/cmsstatic/struts2-5.jpg\" width=\"560\"\u003e \n\u003cp\u003e 現在複製以下文件從Struts 2的lib文件夾C:\\struts-2.2.3\\lib添加到我們的工程WEB-INF\\lib文件夾中。所以這個可以簡單地拖動和丟棄所有的WEB-INF\\lib文件夾中的下列文件到。 \u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e commons-fileupload-x.y.z.jar \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e commons-io-x.y.z.jar \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e commons-lang-x.y.jar \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e commons-logging-x.y.z.jar \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e commons-logging-api-x.y.jar \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e freemarker-x.y.z.jar \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e javassist-.xy.z.GA \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e ognl-x.y.z.jar \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e struts2-core-x.y.z.jar \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e xwork-core.x.y.z.jar \u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003ch2\u003e 創建動作action類: \u003c/h2\u003e \n\u003cp\u003e Action類是Struts 2應用程序的關鍵,我們實現了大部分Action類中的業務邏輯。因此,讓我們創建一個Java文件HelloWorldAction.java的Java資源\u0026gt; SRC下一個的包名com.yiibai.struts2並有下面的內容。 \u003c/p\u003e \n\u003cp\u003e Action類來響應用戶的操作,當用戶點擊一個URL。 Action類中的一個或多個方法被執行,並返回一個字符串結果。基於結果的價值,一個特定的JSP頁面的呈現方式。 \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.struts2;\r\n\r\npublic class HelloWorldAction{\r\n private String name;\r\n\r\n public String execute() throws Exception {\r\n return \"success\";\r\n }\r\n \r\n public String getName() {\r\n return name;\r\n }\r\n\r\n public void setName(String name) {\r\n this.name = name;\r\n }\r\n}\r\u003c/pre\u003e \n\u003cp\u003e 這是一個非常簡單的類,一個名爲「name」屬性。我們有標準「名稱」屬性getter和setter方法,返回字符串「SUCCESS」執行方法。\u003cbr\u003e Struts2框架的HelloWorldAction類將創建一個對象並調用execute方法在響應用戶的操作。你把業務邏輯裏面execute方法,並最終返回的字符串常量。簡單地說爲每個URL執行一個動作類,或者你可以直接使用這個類的名稱作爲操作名,也可以映射到一些其他的名稱使用struts.xml文件,如下圖所示。 \u003c/p\u003e \n\u003cp\u003e \u0026nbsp; \u003c/p\u003e \n\u003ch2\u003e 創建一個視圖 \u003c/h2\u003e \n\u003cp\u003e 我們需要一個JSP提交最後的消息,這個頁面會被稱爲Struts 2框架中預定義的動作時,會發生此映射將在struts.xml文件中定義的。所以,讓我們創建下面的JSP文件的helloWorld.jsp,在WebContent文件夾在您的Eclipse項目。要做到這一點,右鍵單擊WebContent文件夾中的項目資源管理器,然後選擇「新建」\u0026gt;「JSP文件。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ page contentType=\"text/html; charset=UTF-8\" %\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;title\u0026gt;Hello World\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n Hello World, \u0026lt;s:property value=\"name\"/\u0026gt;\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e taglib指令告訴Servlet容器中,這個頁面將使用Struts2標籤,這些標籤之前,將通過s:property標籤中顯示的動作類的屬性名稱\u0026gt;HelloWorldAction類的getName()方法返回的值。 \u003c/p\u003e \n\u003ch2\u003e 創建主頁面: \u003c/h2\u003e \n\u003cp\u003e 我們還需要在WebContent文件夾中創建的index.jsp。該文件將作爲初始動作URL,用戶可以直接點擊告訴Struts 2框架調用的HelloWorldAction類定義的方法,使HelloWorld.jsp視圖。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ page language=\"java\" contentType=\"text/html; charset=ISO-8859-1\"\r\n pageEncoding=\"ISO-8859-1\"%\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\"%\u0026gt;\r\n \u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;title\u0026gt;Hello World\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n \u0026lt;h1\u0026gt;Hello World From Struts2\u0026lt;/h1\u0026gt;\r\n \u0026lt;form action=\"hello\"\u0026gt;\r\n \u0026lt;label for=\"name\"\u0026gt;Please enter your name\u0026lt;/label\u0026gt;\u0026lt;br/\u0026gt;\r\n \u0026lt;input type=\"text\" name=\"name\"/\u0026gt;\r\n \u0026lt;input type=\"submit\" value=\"Say Hello\"/\u0026gt;\r\n \u0026lt;/form\u0026gt;\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e hello操作定義在上面的視圖文件將被映射到的HelloWorldAction類和它的執行方法使用struts.xml文件。當用戶點擊「提交」按鈕,它會導致Struts2框架運行執行方法定義在其中,HelloWorldAction類和方法的返回值的基礎上,將相應的視圖選擇和呈現的一種反應。 \u003c/p\u003e \n\u003ch2\u003e 配置文件 \u003c/h2\u003e \n\u003cp\u003e 我們需要一個映射,以配合URL,HelloWorldAction類(模型),HelloWorld.jsp(圖)。映射告訴Struts 2框架的類將響應用戶的操作(URL),這一類的方法將被執行,什麼視圖來顯示字符串結果的基礎上,該方法返回。 \u003c/p\u003e \n\u003cp\u003e 因此,讓我們創建一個名爲struts.xml中。由於Struts2要求struts.xml中存在的類文件夾中。因此,創建的WebContent/WEB-INF/classes文件夾下struts.xml文件。Eclipse不會創建「類」文件夾下,所以你需要自己做。要做到這一點,在項目瀏覽器和WEB-INF文件夾上點擊右鍵,選擇「新建」\u0026gt;「文件夾」。你的struts.xml中應該是這樣的: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\"?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n\u0026lt;struts\u0026gt;\r\n\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \u0026lt;package name=\"helloworld\" extends=\"struts-default\"\u0026gt;\r\n \r\n \u0026lt;action name=\"hello\" \r\n class=\"com.yiibai.struts2.HelloWorldAction\" \r\n method=\"execute\"\u0026gt;\r\n \u0026lt;result name=\"success\"\u0026gt;/HelloWorld.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 上面的配置文件的幾句話。在這裏,我們設置常數struts.devModeto爲true,因爲我們需要看到一些有用的日誌消息。我們再定義一個名爲HelloWorld包。創建一個包是有用的,當你想要創建新的動作。在我們的例子中,我們的行動命名爲「hello」相應的URL/hello.action和備份HelloWorldAction.class。執行方法HelloWorldAction.class方法被調用時運行URL/hello.action。如果結果execute方法返回「success」,那麼我們就用戶HelloWorld.jsp。 \u003c/p\u003e \n\u003cp\u003e 下一步是創建一個web.xml文件,該文件的任何請求的入口點到Struts2。Struts2的應用程序的入口點,將是一個部署描述符(web.xml)中定義的過濾器。因此,我們將定義在web.xml中一個條目oforg.apache.struts2.dispatcher.FilterDispatcher類。WebContent下WEB-INF文件夾下\u003cspan\u003e需要創建\u003c/span\u003eweb.xml文件。 Eclipse已經在\u003cspan\u003e創建項目\u003cspan\u003e時\u003c/span\u003e\u003c/span\u003e創建了\u003cspan\u003e\u003cspan\u003e一個\u003c/span\u003e\u003c/span\u003eweb.xml文件。但是我們還需要修改如下: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\"?\u0026gt;\r\n\u0026lt;web-app xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n xmlns=\"http://java.sun.com/xml/ns/javaee\" \r\n xmlns:web=\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\r\n xsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\r\n id=\"WebApp_ID\" version=\"3.0\"\u0026gt;\r\n \r\n \u0026lt;display-name\u0026gt;Struts 2\u0026lt;/display-name\u0026gt;\r\n \u0026lt;welcome-file-list\u0026gt;\r\n \u0026lt;welcome-file\u0026gt;index.jsp\u0026lt;/welcome-file\u0026gt;\r\n \u0026lt;/welcome-file-list\u0026gt;\r\n \u0026lt;filter\u0026gt;\r\n \u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n \u0026lt;filter-class\u0026gt;\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u0026lt;/filter-class\u0026gt;\r\n \u0026lt;/filter\u0026gt;\r\n\r\n \u0026lt;filter-mapping\u0026gt;\r\n \u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n \u0026lt;url-pattern\u0026gt;/*\u0026lt;/url-pattern\u0026gt;\r\n \u0026lt;/filter-mapping\u0026gt;\r\n\u0026lt;/web-app\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 我們已經指定index.jsp是我們歡迎(welcome)文件。我們已經配置Struts2過濾器上運行的所有URL(即,任何URL匹配模式/*) \u003c/p\u003e \n\u003ch2\u003e 啓用詳細的日誌: \u003c/h2\u003e \n\u003cp\u003e 可以啓用日誌記錄功能齊全,工作時用Struts 2的WEB-INF/classes文件夾下創建logging.properties文件。請在屬性文件中的以下兩行: \u003c/p\u003e \n\u003cpre\u003e \r\norg.apache.catalina.core.ContainerBase.[Catalina].level = INFO\r\norg.apache.catalina.core.ContainerBase.[Catalina].handlers = \\\r\n java.util.logging.ConsoleHandler\r\u003c/pre\u003e \n\u003cp\u003e 默認logging.properties指定ConsoleHandler的路由記錄到stdout或FileHandler。一個處理程序的日誌級別閾值可以設置使用ERROR,WARNING,INFO,CONFIG,FINE,FINER,FINEST或全部。\u003cbr\u003e 就是這樣。我們已經準備好來運行我們的Hello World應用程序使用Struts 2框架。 \u003c/p\u003e \n\u003cp\u003e \u0026nbsp; \u003c/p\u003e \n\u003ch2\u003e 執行應用程序 \u003c/h2\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊「導出」\u0026gt; WAR文件創建一個WAR文件。然後,這WAR部署在Tomcat的webapps目錄下。最後,啓動Tomcat服務器,並嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給你以下畫面: \u003c/p\u003e \n\u003cimg alt=\"Struts2快速入門\" src=\"https://asset.1ju.org/cmsstatic/struts2-6.jpg\"\u003e \n\u003cp\u003e 輸入值爲\"Struts2\",並提交頁面。您應該看到下一頁 \u003c/p\u003e \n\u003cimg alt=\"Struts2快速入門\" src=\"https://asset.1ju.org/cmsstatic/struts2-7.jpg\"\u003e \n\u003cp\u003e 請注意,您可以定義索引動作在struts.xml文件,在這種情況下,你可以調用索引頁http://localhost:8080/HelloWorldStruts2/index.action。檢查下面你可以定義索引的行動: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\"?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n\u0026lt;struts\u0026gt;\r\n\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \u0026lt;package name=\"helloworld\" extends=\"struts-default\"\u0026gt;\r\n\r\n \u0026lt;action name=\"index\"\u0026gt;\r\n \u0026lt;result \u0026gt;/index.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\r\n \u0026lt;action name=\"hello\" \r\n class=\"com.yiibai.struts2.HelloWorldAction\" \r\n method=\"execute\"\u0026gt;\r\n \u0026lt;result name=\"success\"\u0026gt;/HelloWorld.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\r\n \u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\r\u003c/pre\u003e \n\u003ch1\u003e Struts 2 配置文件 \u003c/h1\u003e \n\u003cp\u003e 本章將帶你通過一個Struts2應用程序所需的基本配置。在這裏,我們將看到在一些重要的配置文件,將配置文件:web.xml,struts.xml中,struts-config.xml和struts.properties\u003cbr\u003e 老實說你能活下來使用web.xml和struts.xml中的配置文件,並在前面的章節中,你已經看到我們的例子中使用這兩個文件的工作,但讓我解釋一下其他文件,以及你的知識。 \u003c/p\u003e \n\u003cp\u003e \u0026nbsp; \u003c/p\u003e \n\u003ch2\u003e web.xml文件: \u003c/h2\u003e \n\u003cp\u003e 在web.xml配置文件是一個的J2EE配置文件,決定如何處理HTTP請求servlet容器的元素。它不是嚴格意義上的Struts2的配置文件,但它是一個文件,需要配置Struts2的工作。 \u003c/p\u003e \n\u003cp\u003e 正如前面所討論的,此文件提供任何Web應用程序的入口點。Struts2的應用程序的入口點,將是一個部署描述符(web.xml)中定義的過濾器。因此,我們將FilterDispatcher排類在web.xml中定義一個條目。需要創建文件夾的WebContent/ WEB-INF下的web.xml文件。 \u003c/p\u003e \n\u003cp\u003e 這是第一個配置文件,您將需要配置,如果你開始沒有產生它(例如Eclipse或者Maven2的)模板或工具的幫助下。以下是web.xml文件中的內容,我們在我們的最後一個例子。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\"?\u0026gt;\r\n\u0026lt;web-app xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n xmlns=\"http://java.sun.com/xml/ns/javaee\" \r\n xmlns:web=\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\r\n xsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\r\n id=\"WebApp_ID\" version=\"3.0\"\u0026gt;\r\n \r\n \u0026lt;display-name\u0026gt;Struts 2\u0026lt;/display-name\u0026gt;\r\n \u0026lt;welcome-file-list\u0026gt;\r\n \u0026lt;welcome-file\u0026gt;index.jsp\u0026lt;/welcome-file\u0026gt;\r\n \u0026lt;/welcome-file-list\u0026gt;\r\n \r\n \u0026lt;filter\u0026gt;\r\n \u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n \u0026lt;filter-class\u0026gt;\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u0026lt;/filter-class\u0026gt;\r\n \u0026lt;/filter\u0026gt;\r\n\r\n \u0026lt;filter-mapping\u0026gt;\r\n \u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n \u0026lt;url-pattern\u0026gt;/*\u0026lt;/url-pattern\u0026gt;\r\n \u0026lt;/filter-mapping\u0026gt;\r\n\r\n\u0026lt;/web-app\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 需要注意的是,我們的Struts 2的過濾器映射到/*/*。行動,而不是這意味着所有的URL將被解析的支柱過濾器。我們將介紹時,我們會通過的「註解」一章。 \u003c/p\u003e \n\u003ch2\u003e struts.xml文件: \u003c/h2\u003e \n\u003cp\u003e struts.xml文件中包含的配置信息,你將修改所採取的措施的開發。這個文件可以被用來覆蓋默認設置的應用程序,例如struts.devMode=false和其他設置中定義的屬性文件。這個文件可以創建文件夾下的WEB-INF/classes。 \u003c/p\u003e \n\u003cp\u003e 讓我們一起來看看我們在struts.xml文件中創建Hello World的例子在前面的章節中解釋。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\"?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n\u0026lt;struts\u0026gt;\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \u0026lt;package name=\"helloworld\" extends=\"struts-default\"\u0026gt;\r\n \r\n \u0026lt;action name=\"hello\" \r\n class=\"com.yiibai.struts2.HelloWorldAction\" \r\n method=\"execute\"\u0026gt;\r\n \u0026lt;result name=\"success\"\u0026gt;/HelloWorld.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n \u0026lt;-- more actions can be listed here --\u0026gt;\r\n\r\n \u0026lt;/package\u0026gt;\r\n \u0026lt;-- more packages can be listed here --\u0026gt;\r\n\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 首先要注意的是DOCTYPE。所有的Struts配置文件中需要有正確的DOCTYPE,在我們的小例子所示。\u0026lt;struts\u0026gt;是根標記的元素,我們聲明使用不同的包\u0026lt;package\u0026gt;標籤。其中,\u0026lt;\u003cspan\u003epackage\u003c/span\u003e\u0026gt;允許分離和模塊化的配置。這是非常有用的,當你有一個大的項目,項目被劃分成不同的模塊。 \u003c/p\u003e \n\u003cp\u003e 再說了,如果項目有三個域名 - business_applicaiton,customer_application和staff_application,可以創建三個包,在適當的包裝和存儲相關的行動。包裝標籤具有以下屬性: \u003c/p\u003e \n\u003ctable width=\"100%\"\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003cth width=\"25%\"\u003e 屬性 \u003c/th\u003e \n \u003cth\u003e 描述 \u003c/th\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e name (required) \u003c/td\u003e \n \u003ctd\u003e The unique identifier for the package \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e extends \u003c/td\u003e \n \u003ctd\u003e Which package does this package extend from? By default, we use struts-default as the base package. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e abstract \u003c/td\u003e \n \u003ctd\u003e If marked true, the package is not available for end user consumption. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e namesapce \u003c/td\u003e \n \u003ctd\u003e Unique namespace for the actions \u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n\u003c/table\u003e \n\u003cp\u003e 常量標籤name和value屬性將被用來覆蓋default.properties中定義的屬性,就像我們剛剛成立struts.devModeproperty。設置struts.devMode屬性,讓我們看到了更多的調試信息,日誌文件中。 \u003c/p\u003e \n\u003cp\u003e 我們定義動作標記對應的每一個URL,我們想訪問我們定義了一個類的execute()方法,將訪問時,我們將訪問相應的URL。\u003cbr\u003e 結果確定什麼被返回到瀏覽器的一個動作後執行。從操作返回的字符串應該是一個結果的名稱。結果如上配置的每次動作,或作爲一個「全局」的結果,在包中的每一個動作可。結果有可選的名稱和類型的屬性。默認名稱值是「成功」。 \u003c/p\u003e \n\u003cp\u003e \u0026nbsp; \u003c/p\u003e \n\u003cp\u003e 隨着時間的推移,struts.xml文件可以做大,打破它包的模塊化是一種方式,但Struts提供了另一種模塊化的struts.xml文件。你可以將檔案分割成多個XML文件,並將其導入以下方式。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\"?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n\u0026lt;struts\u0026gt;\r\n \u0026lt;include file=\"my-struts1.xml\"/\u0026gt;\r\n \u0026lt;include file=\"my-struts2.xml\"/\u0026gt;\r\n\u0026lt;/struts\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 我們還沒有涉及到的其他配置文件是struts-default.xml中。這個文件包含了Struts標準配置設置,在\u003cspan\u003e你的項目的99.99%\u003c/span\u003e就不會碰這些設置。出於這個原因,我們不打算在這個文件太多的細節。如果有興趣,不妨看看在default.properties文件中struts2的核心-2.2.3.jar文件。 \u003c/p\u003e \n\u003ch2\u003e struts-config.xml 文件: \u003c/h2\u003e \n\u003cp\u003e struts-config.xml配置文件是一個在Web客戶端組件的視圖和模型之間的聯繫,但\u003cspan\u003e你的項目的99.99\u003c/span\u003e就不會碰這些設置%。基本的配置文件包含以下主要內容: \u003c/p\u003e \n\u003ctable width=\"100%\"\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003cth width=\"5\"\u003e SN \u003c/th\u003e \n \u003cth\u003e Interceptor \u0026amp; 描述 \u003c/th\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 1 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003estruts-config\u003c/span\u003e\u003cbr\u003e This is the root node of the configuration file. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 2 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eform-beans\u003c/span\u003e\u003cbr\u003e This is where you map your ActionForm subclass to a name. You use this name as an alias for your ActionForm throughout the rest of the struts-config.xml file, and even on your JSP pages. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 3 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eglobal forwards\u003c/span\u003e\u003cbr\u003e This section maps a page on your webapp to a name. You can use this name to refer to the actual page. This avoids hardcoding URLs on your web pages. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 4 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eaction-mappings\u003c/span\u003e\u003cbr\u003e This is where you declare form handlers and they are also known as\u0026nbsp;\u003cspan\u003eaction mappings\u003c/span\u003e. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 5 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003econtroller\u003c/span\u003e\u003cbr\u003e This section configures Struts internals and rarely used in practical situations. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 6 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eplug-in\u003c/span\u003e\u003cbr\u003e This section tells Struts where to find your properties files, which contain prompts and error messages \u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n\u003c/table\u003e \n\u003cp\u003e 下面是示例struts-config.xml文件: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts-config PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 1.0//EN\"\r\n\"http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd\"\u0026gt;\r\n\r\n\u0026lt;struts-config\u0026gt;\r\n\r\n \u0026lt;!-- ========== Form Bean Definitions ============ --\u0026gt;\r\n \u0026lt;form-beans\u0026gt;\r\n \u0026lt;form-bean name=\"login\" type=\"test.struts.LoginForm\" /\u0026gt;\r\n \u0026lt;/form-beans\u0026gt;\r\n\r\n \u0026lt;!-- ========== Global Forward Definitions ========= --\u0026gt;\r\n \u0026lt;global-forwards\u0026gt;\r\n \u0026lt;/global-forwards\u0026gt;\r\n\r\n \u0026lt;!-- ========== Action Mapping Definitions ======== --\u0026gt;\r\n \u0026lt;action-mappings\u0026gt;\r\n \u0026lt;action\r\n path=\"/login\"\r\n type=\"test.struts.LoginAction\" \u0026gt;\r\n\r\n \u0026lt;forward name=\"valid\" path=\"/jsp/MainMenu.jsp\" /\u0026gt;\r\n \u0026lt;forward name=\"invalid\" path=\"/jsp/LoginView.jsp\" /\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n \u0026lt;/action-mappings\u0026gt;\r\n\r\n \u0026lt;!-- ========== Controller Definitions ======== --\u0026gt;\r\n \u0026lt;controller \r\n contentType=\"text/html;charset=UTF-8\"\r\n debug=\"3\"\r\n maxFileSize=\"1.618M\"\r\n locale=\"true\"\r\n nocache=\"true\"/\u0026gt;\r\n\r\n\u0026lt;/struts-config\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e struts-config.xml文件的更多詳細信息,請檢查你的Struts文檔。 \u003c/p\u003e \n\u003ch2\u003e struts.properties文件 \u003c/h2\u003e \n\u003cp\u003e 此配置文件提供了一種機制來更改默認行爲的框架。其實所有的struts.propertiesconfiguration文件中包含的屬性也可以被配置在web.xml中使用的init-param,以及在struts.xml中的配置文件中使用恆定的標籤。你可以創建此文件下folderWEB-INF/classes。 \u003c/p\u003e \n\u003cp\u003e 在這個文件中配置的值將覆蓋默認值配置在default.properties這是包含在Struts2-core-xyzjar分佈。有幾個可能會考慮改變使用struts.properties文件的屬性: \u003c/p\u003e \n\u003cpre\u003e### When set to true, Struts will act much more friendly for developers\r\nstruts.devMode = true\r\n\r\n### Enables reloading of internationalization files\r\nstruts.i18n.reload = true\r\n\r\n### Enables reloading of XML configuration files\r\nstruts.configuration.xml.reload = true\r\n\r\n### Sets the port that the server is run on\r\nstruts.url.http.port = 8080\r\u003c/pre\u003e \n\u003cp\u003e 任何與井號(#)開頭的行會被假定爲註釋和由Struts2將被忽略。 \u003c/p\u003e \n\u003ch1\u003e Struts 2 動作Actions: \u003c/h1\u003e \n\u003cp\u003e 動作是Struts2框架的核心,因爲它們是任何MVC(模型 - 視圖 - 控制器)框架。每一個URL映射到一個具體的行動,它提供了處理用戶的請求提供服務所需的邏輯。\u003cbr\u003e 但動作也用來在另外兩個重要的能力。首先,動作從請求中的數據的傳輸,通過到視圖中起着重要的作用,無論是其一個JSP的或其它類型的結果。二,行動要協助的框架中確定的結果應該渲染視圖將返回響應的要求。 \u003c/p\u003e \n\u003cp\u003e \u0026nbsp; \u003c/p\u003e \n\u003ch2\u003e 創建動作-Action: \u003c/h2\u003e \n\u003cp\u003e 在Struts2的行動,唯一的要求是,必須有一個無參數的方法,該方法返回一個字符串或結果的對象,必須是一個POJO。如果不帶參數的方法不指定,則默認行爲是使用execute()方法。 \u003c/p\u003e \n\u003cp\u003e 您也可以選擇擴展ActionSupport類實現接口,包括操作界面。操作界面如下: \u003c/p\u003e \n\u003cpre\u003epublic interface Action {\r\n public static final String SUCCESS = \"success\";\r\n public static final String NONE = \"none\";\r\n public static final String ERROR = \"error\";\r\n public static final String INPUT = \"input\";\r\n public static final String LOGIN = \"login\";\r\n public String execute() throws Exception;\r\n}\r\u003c/pre\u003e \n\u003cp\u003e 讓我們一起來看看在動作方法中的Hello World示例: \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.struts2;\r\n\r\npublic class HelloWorldAction{\r\n private String name;\r\n\r\n public String execute() throws Exception {\r\n return \"success\";\r\n }\r\n \r\n public String getName() {\r\n return name;\r\n }\r\n\r\n public void setName(String name) {\r\n this.name = name;\r\n }\r\n}\r\u003c/pre\u003e \n\u003cp\u003e 爲了說明這一點的操作方法控制視圖,讓我們作出以下更改execute()方法和擴展的類ActionSupport如下: \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.struts2;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class HelloWorldAction extends ActionSupport{\r\n private String name;\r\n\r\n public String execute() throws Exception {\r\n if (\"SECRET\".equals(name))\r\n {\r\n return SUCCESS;\r\n }else{\r\n return ERROR; \r\n }\r\n }\r\n \r\n public String getName() {\r\n return name;\r\n }\r\n\r\n public void setName(String name) {\r\n this.name = name;\r\n }\r\n}\r\u003c/pre\u003e \n\u003cp\u003e 在這個例子中,我們在execute方法中有一些邏輯,看的name屬性。如果屬性等於「不能說的祕密」的字符串,返回成功的結果,否則返回錯誤的結果。因爲我們已經擴展了ActionSupport,所以我們可以使用字符串常量的成功和錯誤。現在,讓我們修改我們的struts.xml文件如下: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\"?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \u0026lt;struts\u0026gt;\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \u0026lt;package name=\"helloworld\" extends=\"struts-default\"\u0026gt;\r\n \u0026lt;action name=\"hello\" \r\n class=\"com.yiibai.struts2.HelloWorldAction\"\r\n method=\"execute\"\u0026gt;\r\n \u0026lt;result name=\"success\"\u0026gt;/HelloWorld.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;result name=\"error\"\u0026gt;/AccessDenied.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\r\u003c/pre\u003e \n\u003ch2\u003e 創建一個視圖 \u003c/h2\u003e \n\u003cp\u003e 讓我們創建下面的JSP文件的helloWorld.jsp,在WebContent文件夾在你的eclipse項目。要做到這一點,右鍵單擊WebContent文件夾中的項目資源管理器,然後選擇「新建」\u0026gt;「JSP文件。該文件將被要求的情況下,返回的結果是success,這是一個字符串常量「成功」的定義在Action接口: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ page contentType=\"text/html; charset=UTF-8\" %\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;title\u0026gt;Hello World\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n Hello World, \u0026lt;s:property value=\"name\"/\u0026gt;\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 以下是文件,該文件將被調用的框架的情況下作用的結果是等於字符串常量「ERROR」的錯誤,這是。以下內容的AccessDenied.jsp的 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ page contentType=\"text/html; charset=UTF-8\" %\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;title\u0026gt;Access Denied\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n You are not authorized to view this page.\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 我們還需要在WebContent文件夾中創建的index.jsp。該文件將作爲初始動作URL,用戶可以直接點擊告訴Struts 2框架,以調用execute方法HelloWorldAction類,並呈現HelloWorld.jsp視圖。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ page language=\"java\" contentType=\"text/html; charset=ISO-8859-1\"\r\n pageEncoding=\"ISO-8859-1\"%\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\"%\u0026gt;\r\n \u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;title\u0026gt;Hello World\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n \u0026lt;h1\u0026gt;Hello World From Struts2\u0026lt;/h1\u0026gt;\r\n \u0026lt;form action=\"hello\"\u0026gt;\r\n \u0026lt;label for=\"name\"\u0026gt;Please enter your name\u0026lt;/label\u0026gt;\u0026lt;br/\u0026gt;\r\n \u0026lt;input type=\"text\" name=\"name\"/\u0026gt;\r\n \u0026lt;input type=\"submit\" value=\"Say Hello\"/\u0026gt;\r\n \u0026lt;/form\u0026gt;\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 就是這樣,有沒有需要改變的web.xml文件,讓我們使用同一個web.xml舉例章節,我們已經創建了。現在,我們已經準備好來運行我們的Hello World應用程序使用Struts 2框架。 \u003c/p\u003e \n\u003ch2\u003e 執行應用程序 \u003c/h2\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊「導出」\u0026gt; WAR文件創建一個WAR文件。然後這WAR部署在Tomcat的webapps目錄下。最後啓動Tomcat服務器,並嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給你以下畫面: \u003c/p\u003e \n\u003cimg alt=\"Struts2快速入門\" src=\"https://asset.1ju.org/cmsstatic/struts2-6.jpg\"\u003e \n\u003cp\u003e 讓我們一起進入一個「\u003cspan\u003eSECRET\u003c/span\u003e」的話,你應該看到下面的頁面: \u003c/p\u003e \n\u003cimg alt=\"Struts2快速入門\" src=\"https://asset.1ju.org/cmsstatic/struts2-8.jpg\"\u003e \n\u003cp\u003e 現在輸入任何文字以外的「\u003cspan\u003eSECRET\u003c/span\u003e」,你應該看到下面的頁面: \u003c/p\u003e \n\u003cimg alt=\"Struts2快速入門\" src=\"https://asset.1ju.org/cmsstatic/struts2-9.jpg\"\u003e \n\u003ch2\u003e 創建多個動作: \u003c/h2\u003e \n\u003cp\u003e 我們通常會定義一個以上的行動,以處理不同的請求,向用戶提供不同的URL,因此,你可以定義不同的類定義如下: \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.struts2;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\n class MyAction extends ActionSupport{\r\n public static String GOOD = SUCCESS;\r\n public static String BAD = ERROR;\r\n }\r\n\r\n public class HelloWorld extends ActionSupport{\r\n ...\r\n public String execute()\r\n {\r\n if (\"SECRET\".equals(name)) return MyAction.GOOD;\r\n return MyAction.BAD;\r\n }\r\n ...\r\n }\r\n\r\n public class SomeOtherClass extends ActionSupport{\r\n ...\r\n public String execute()\r\n {\r\n return MyAction.GOOD;\r\n }\r\n ...\r\n }\r\u003c/pre\u003e \n\u003cp\u003e 您將在struts.xml文件中配置這些操作如下: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\"?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\nstruts\u0026gt;\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \u0026lt;package name=\"helloworld\" extends=\"struts-default\"\u0026gt;\r\n \u0026lt;action name=\"hello\" \r\n class=\"com.yiibai.struts2.HelloWorld\" \r\n method=\"execute\"\u0026gt;\r\n \u0026lt;result name=\"success\"\u0026gt;/HelloWorld.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;result name=\"error\"\u0026gt;/AccessDenied.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n \u0026lt;action name=\"something\" \r\n class=\"com.yiibai.struts2.SomeOtherClass\" \r\n method=\"execute\"\u0026gt;\r\n \u0026lt;result name=\"success\"\u0026gt;/Something.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;result name=\"error\"\u0026gt;/AccessDenied.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 在上述假設的例子中,你可以看到操作的結果被複制SUCCESS\u0026nbsp;和ERROR\u0026nbsp;。爲了解決這個問題,我們建議您創建一個類,它包含的結果的結果。 \u003c/p\u003e \n\u003ch1\u003e Struts 2 攔截器: \u003c/h1\u003e \n\u003cp\u003e 攔截器是作爲Servlet過濾器或JDK的Proxy類的概念上是相同的。攔截器允許橫切功能單獨實現動作以及框架。想要使用攔截器,可以實現如下: \u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e Providing preprocessing logic before the action is called. \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e Providing postprocessing logic after the action is called. \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e Catching exceptions so that alternate processing can be performed. \u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e 使用攔截器在Struts2框架提供的功能很多,例如包括異常處理,文件上傳,生命週期回調和驗證等。事實上,Struts2的基地很多其攔截功能上,這不是不可能有7或8每個動作攔截分配。 \u003c/p\u003e \n\u003ch2\u003e Struts2框架攔截器: \u003c/h2\u003e \n\u003cp\u003e Struts 2框架提供了良好的預配置,並準備使用的盒攔截。下面列出了幾個重要的攔截器: \u003c/p\u003e \n\u003ctable width=\"100%\"\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003cth width=\"5\"\u003e SN \u003c/th\u003e \n \u003cth\u003e Interceptor \u0026amp; 描述 \u003c/th\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 1 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003ealias\u003c/span\u003e\u003cbr\u003e Allows parameters to have different name aliases across requests. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 2 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003echeckbox\u003c/span\u003e\u003cbr\u003e Assists in managing check boxes by adding a parameter value of false for check boxes that are not checked. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 3 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003econversionError\u003c/span\u003e\u003cbr\u003e Places error information from converting strings to parameter types into the action's field errors. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 4 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003ecreateSession\u003c/span\u003e\u003cbr\u003e Automatically creates an HTTP session if one does not already exist. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 5 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003edebugging\u003c/span\u003e\u003cbr\u003e Provides several different debugging screens to the developer. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 6 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eexecAndWait\u003c/span\u003e\u003cbr\u003e Sends the user to an intermediary waiting page while the action executes in the background. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 7 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eexception\u003c/span\u003e\u003cbr\u003e Maps exceptions that are thrown from an action to a result, allowing automatic exception handling via redirection. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 8 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003efileUpload\u003c/span\u003e\u003cbr\u003e Facilitates easy file uploading. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 9 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003ei18n\u003c/span\u003e\u003cbr\u003e Keeps track of the selected locale during a user's session. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 10 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003elogger\u003c/span\u003e\u003cbr\u003e Provides simple logging by outputting the name of the action being executed. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 11 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eparams\u003c/span\u003e\u003cbr\u003e Sets the request parameters on the action. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 12 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eprepare\u003c/span\u003e\u003cbr\u003e This is typically used to do pre-processing work, such as setup database connections. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 13 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eprofile\u003c/span\u003e\u003cbr\u003e Allows simple profiling information to be logged for actions. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 14 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003escope\u003c/span\u003e\u003cbr\u003e Stores and retrieves the action's state in the session or application scope. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 15 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eServletConfig\u003c/span\u003e\u003cbr\u003e Provides the action with access to various servlet-based information. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 16 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003etimer\u003c/span\u003e\u003cbr\u003e Provides simple profiling information in the form of how long the action takes to execute. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 17 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003etoken\u003c/span\u003e\u003cbr\u003e Checks the action for a valid token to prevent duplicate formsubmission. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 18 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003evalidation\u003c/span\u003e\u003cbr\u003e Provides validation support for actions \u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n\u003c/table\u003e \n\u003cp\u003e 完整的細節上面提到的攔截,請loook到Struts2文檔。但我會告訴你如何使用攔截器,一般在你的Struts應用程序。 \u003c/p\u003e \n\u003ch2\u003e 如何使用攔截器? \u003c/h2\u003e \n\u003cp\u003e 讓我們來看看如何使用一個已經存在的攔截我們的「Hello World」程序。我們將使用定時器攔截器,其目的是測量過了多長時間,執行相應的操作方法。同時我PARAMS攔截器,其目的是發送的請求參數的行動。您可以嘗試不使用這個攔截器和你的榜樣,你會發現,name屬性沒有被設置的參數是不能夠達到給動作。\u003cbr\u003e 我們將繼續HelloWorldAction.java,web.xml中,HelloWorld.jsp和index.jsp文件,因爲他們已經創建的實例章,但讓我們如下修改struts.xml文件中添加一個攔截器 \u003c/p\u003e \n\u003cp\u003e \u0026nbsp; \u003c/p\u003e \n\u003cpre\u003e \r\n\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\"?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n\u0026lt;struts\u0026gt;\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \u0026lt;package name=\"helloworld\" extends=\"struts-default\"\u0026gt;\r\n \u0026lt;action name=\"hello\" \r\n class=\"com.yiibai.struts2.HelloWorldAction\"\r\n method=\"execute\"\u0026gt;\r\n \u0026lt;interceptor-ref name=\"params\"/\u0026gt;\r\n \u0026lt;interceptor-ref name=\"timer\" /\u0026gt;\r\n \u0026lt;result name=\"success\"\u0026gt;/HelloWorld.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊「導出」\u0026gt; WAR文件創建一個WAR文件。然後,這WAR部署在Tomcat的webapps目錄下。最後,啓動Tomcat服務器,並嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給你以下畫面: \u003c/p\u003e \n\u003cimg alt=\"Struts2快速入門\" src=\"https://asset.1ju.org/cmsstatic/struts2-6.jpg\"\u003e \n\u003cp\u003e 現在,在給定的文本框中輸入任何單詞,然後單擊「Say Hello按鈕執行已定義的動作。現在如果你將檢查生成的日誌,你會發現下面的文字: \u003c/p\u003e \n\u003cpre\u003e \r\nINFO: Server startup in 3539 ms\r\n27/08/2011 8:40:53 PM \r\ncom.opensymphony.xwork2.util.logging.commons.CommonsLogger info\r\nINFO: Executed action [//hello!execute] took 109 ms.\r\u003c/pre\u003e \n\u003cp\u003e \u003cspan\u003e這裏的底線是產生,因爲定時器攔截行動,告訴了要執行的總109ms\u003c/span\u003e \u003c/p\u003e \n\u003ch1\u003e 創建自定義攔截器 \u003c/h1\u003e \n\u003cp\u003e 在應用程序中使用自定義攔截器是一個優雅的方式來提供跨領域的應用功能。創建一個自定義攔截器是容易的,需要擴展的接口,下面Interceptor接口內容: \u003c/p\u003e \n\u003cpre\u003e \r\npublic interface Interceptor extends Serializable{\r\n void destroy();\r\n void init();\r\n String intercept(ActionInvocation invocation)\r\n throws Exception;\r\n}\r\u003c/pre\u003e \n\u003cp\u003e 正如其名稱所表明的,在init()方法提供了一種方法來初始化攔截器destroy()方法提供了一個攔截器淨化設施。不同的行動,攔截器的請求重用和需要是線程安全的,特別是在intercept()方法。\u003cbr\u003e ActionInvocation對象提供的運行時環境。它允許訪問的行動本身和方法調用的行動和決定的行動是否已經調用。\u003cbr\u003e 如果您有沒有必要的初始化或清理代碼,AbstractInterceptor類可以擴展。這提供了一個默認的無操作實現\u003cspan\u003e\u0026nbsp;init()\u0026nbsp;\u003c/span\u003e和\u003cspan\u003edestroy()\u003c/span\u003e方法。 \u003c/p\u003e \n\u003ch2\u003e 創建攔截器類: \u003c/h2\u003e \n\u003cp\u003e 讓我們創建MyInterceptor.java在Java資源\u0026gt; src文件夾: \u003c/p\u003e \n\u003cpre\u003e \r\npackage com.yiibai.struts2;\r\n\r\nimport java.util.*;\r\nimport com.opensymphony.xwork2.ActionInvocation;\r\nimport com.opensymphony.xwork2.interceptor.AbstractInterceptor;\r\n\r\npublic class MyInterceptor extends AbstractInterceptor {\r\n\r\n public String intercept(ActionInvocation invocation)throws Exception{\r\n\r\n /* let us do some pre-processing */\r\n String output = \"Pre-Processing\"; \r\n System.out.println(output);\r\n\r\n /* let us call action or next interceptor */\r\n String result = invocation.invoke();\r\n\r\n /* let us do some post-processing */\r\n output = \"Post-Processing\"; \r\n System.out.println(output);\r\n\r\n return result;\r\n\r\n }\r\n}\r\u003c/pre\u003e \n\u003cp\u003e 就像你看到的,實際的動作將使用攔截器執行的invocation.invoke()調用。所以,你可以做一些前處理和後處理根據您的需要。\u003cbr\u003e 框架本身開始的過程,在第一次調用ActionInvocation對象的invoke()。每次invoke()被調用,ActionInvocation諮詢狀態並執行攔截。當所有配置的攔截器被調用,invoke()方法將導致要執行的動作本身。通過請求流以下數據圖顯示了相同的概念: \u003c/p\u003e \n\u003cp\u003e \u0026nbsp; \u003c/p\u003e \n\u003cimg alt=\"Struts2快速入門\" src=\"https://asset.1ju.org/cmsstatic/struts2-1.gif\"\u003e \n\u003ch2\u003e 創建一個動作-Action類: \u003c/h2\u003e \n\u003cp\u003e 讓我們創建一個Java文件HelloWorldAction.java的Java資源\u0026gt; SRC下一個的包名com.yiibai.struts2與下面的內容。 \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.struts2;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class HelloWorldAction extends ActionSupport{\r\n private String name;\r\n\r\n public String execute() throws Exception {\r\n System.out.println(\"Inside action....\");\r\n return \"success\";\r\n } \r\n\r\n public String getName() {\r\n return name;\r\n }\r\n\r\n public void setName(String name) {\r\n this.name = name;\r\n }\r\n}\r\u003c/pre\u003e \n\u003cp\u003e 在前面的例子中,我們已經看到,這是一個相同的類。我們有標準「name」屬性getter和setter方法,返回字符串「success」執行方法。 \u003c/p\u003e \n\u003ch2\u003e 創建視圖 \u003c/h2\u003e \n\u003cp\u003e Let us create the below jsp file\u0026nbsp;\u003cspan\u003eHelloWorld.jsp\u003c/span\u003e\u0026nbsp;in the WebContent folder in your eclipse project. \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ page contentType=\"text/html; charset=UTF-8\" %\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;title\u0026gt;Hello World\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n Hello World, \u0026lt;s:property value=\"name\"/\u0026gt;\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\r\u003c/pre\u003e \n\u003ch2\u003e 創建視圖: \u003c/h2\u003e \n\u003cp\u003e 我們還需要在WebContent文件夾中創建的index.jsp。該文件將作爲初始動作URL,用戶可以直接點擊告訴Struts 2框架調用HelloWorldAction類定義的方法,使HelloWorld.jsp視圖。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ page language=\"java\" contentType=\"text/html; charset=ISO-8859-1\"\r\n pageEncoding=\"ISO-8859-1\"%\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\"%\u0026gt;\r\n \u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;title\u0026gt;Hello World\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n \u0026lt;h1\u0026gt;Hello World From Struts2\u0026lt;/h1\u0026gt;\r\n \u0026lt;form action=\"hello\"\u0026gt;\r\n \u0026lt;label for=\"name\"\u0026gt;Please enter your name\u0026lt;/label\u0026gt;\u0026lt;br/\u0026gt;\r\n \u0026lt;input type=\"text\" name=\"name\"/\u0026gt;\r\n \u0026lt;input type=\"submit\" value=\"Say Hello\"/\u0026gt;\r\n \u0026lt;/form\u0026gt;\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e hello操作定義在上面的視圖文件將被映射到的HelloWorldAction類和它的執行方法使用struts.xml文件。 \u003c/p\u003e \n\u003ch2\u003e 配置文件 \u003c/h2\u003e \n\u003cp\u003e 現在,我們需要註冊我們的攔截器,然後調用它,因爲我們已經在前面的例子中默認的攔截器。要註冊一個新定義的攔截器\u0026lt;interceptors\u0026gt;...\u0026lt;/\u003cspan\u003einterceptors\u003c/span\u003e\u0026gt;標籤直接放在下的\u0026lt;package\u0026gt;的標記插件struts.xml文件。您可以跳過這一步,因爲我們沒有一個默認的攔截器在前面的例子。但在這裏,讓我們的註冊和使用,如下所示: \u003c/p\u003e \n\u003cpre\u003e \r\n\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\"?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n\r\n\u0026lt;struts\u0026gt;\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \u0026lt;package name=\"helloworld\" extends=\"struts-default\"\u0026gt;\r\n\r\n \u0026lt;interceptors\u0026gt;\r\n \u0026lt;interceptor name=\"myinterceptor\"\r\n class=\"com.yiibai.struts2.MyInterceptor\" /\u0026gt;\r\n \u0026lt;/interceptors\u0026gt;\r\n\r\n \u0026lt;action name=\"hello\" \r\n class=\"com.yiibai.struts2.HelloWorldAction\" \r\n method=\"execute\"\u0026gt;\r\n \u0026lt;interceptor-ref name=\"params\"/\u0026gt;\r\n \u0026lt;interceptor-ref name=\"myinterceptor\" /\u0026gt;\r\n \u0026lt;result name=\"success\"\u0026gt;/HelloWorld.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\r\n \u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 應該注意的是,你可以註冊多個攔截器\u0026lt;package\u0026gt;標籤內,同一時間可以調用多個攔截器內的\u0026lt;action\u0026gt;標籤。可以調用相同的攔截器與不同的動作。\u003cbr\u003e 需要創建\u003cspan\u003eWebContent/\u003c/span\u003eWEB-INF文件夾下web.xml文件下如下: \u003c/p\u003e \n\u003cp\u003e \u0026nbsp; \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\"?\u0026gt;\r\n\u0026lt;web-app xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n xmlns=\"http://java.sun.com/xml/ns/javaee\" \r\n xmlns:web=\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\r\n xsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\r\n id=\"WebApp_ID\" version=\"3.0\"\u0026gt;\r\n \r\n \u0026lt;display-name\u0026gt;Struts 2\u0026lt;/display-name\u0026gt;\r\n \u0026lt;welcome-file-list\u0026gt;\r\n \u0026lt;welcome-file\u0026gt;index.jsp\u0026lt;/welcome-file\u0026gt;\r\n \u0026lt;/welcome-file-list\u0026gt;\r\n \u0026lt;filter\u0026gt;\r\n \u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n \u0026lt;filter-class\u0026gt;\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u0026lt;/filter-class\u0026gt;\r\n \u0026lt;/filter\u0026gt;\r\n\r\n \u0026lt;filter-mapping\u0026gt;\r\n \u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n \u0026lt;url-pattern\u0026gt;/*\u0026lt;/url-pattern\u0026gt;\r\n \u0026lt;/filter-mapping\u0026gt;\r\n\u0026lt;/web-app\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊「導出」\u0026gt; WAR文件創建一個WAR文件。然後,這WAR部署在Tomcat的webapps目錄下。最後,啓動Tomcat服務器,並嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給你以下畫面: \u003c/p\u003e \n\u003cimg alt=\"Struts2快速入門\" src=\"https://asset.1ju.org/cmsstatic/struts2-6.jpg\"\u003e \n\u003cp\u003e 現在,在給定的文本框中輸入任何單詞,然後單擊「Say Hello按鈕執行已定義的動作。現在,如果你將檢查生成的日誌,你會發現下面的文字在底部: \u003c/p\u003e \n\u003cpre\u003e \r\nPre-Processing\r\nInside action....\r\nPost-Processing\r\u003c/pre\u003e \n\u003ch2\u003e 堆疊多個攔截器: \u003c/h2\u003e \n\u003cp\u003e 正如你想像,配置多個攔截器的每個動作很快就會變得非常難以控制。出於這個原因,攔截器的攔截器棧管理。下面是一個例子,直接從在struts-default.xml文件: \u003c/p\u003e \n\u003cpre\u003e \r\n\u0026lt;interceptor-stack name=\"basicStack\"\u0026gt;\r\n \u0026lt;interceptor-ref name=\"exception\"/\u0026gt;\r\n \u0026lt;interceptor-ref name=\"servlet-config\"/\u0026gt;\r\n \u0026lt;interceptor-ref name=\"prepare\"/\u0026gt;\r\n \u0026lt;interceptor-ref name=\"checkbox\"/\u0026gt;\r\n \u0026lt;interceptor-ref name=\"params\"/\u0026gt;\r\n \u0026lt;interceptor-ref name=\"conversionError\"/\u0026gt;\r\n\u0026lt;/interceptor-stack\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 上述權被稱爲basicStack,並且可以用於在您的配置中,如下所示。此配置節點被放置下\u0026lt;package.../\u0026gt;節點。每個\u0026lt;interceptor-ref.../\u0026gt;標籤引用了一個攔截器或攔截器棧已配置在當前的攔截器棧。因此,這是非常重要的,以確保名稱是唯一在所有攔截器和攔截器棧配置時,配置初始攔截器和攔截器棧。\u003cbr\u003e 我們已經看到了如何應用攔截器的作用,應用攔截器棧是沒有什麼不同。事實上,我們都使用完全相同的標籤: \u003c/p\u003e \n\u003cp\u003e \u0026nbsp; \u003c/p\u003e \n\u003cpre\u003e \r\n\u0026lt;action name=\"hello\" class=\"com.yiibai.struts2.MyAction\"\u0026gt;\r\n \u0026lt;interceptor-ref name=\"basicStack\"/\u0026gt;\r\n \u0026lt;result\u0026gt;view.jsp\u0026lt;/result\u0026gt;\r\n\u0026lt;/action\r\u003c/pre\u003e \n\u003cp\u003e 所有的6個攔截器,上述登記註冊完成股權「basicStack」hello操作。\u003cspan\u003e他們在配置\u003c/span\u003e應該指出的是攔截器執行的順序。例如,在上述情況下,異常將被執行第一,servlet配置\u003cspan\u003e第二\u003c/span\u003e等。 \u003c/p\u003e \n\u003ch1\u003e Struts 2 Results and Result Types \u003c/h1\u003e \n\u003cp\u003e 正如前面提到的,\u003cspan\u003e\u0026lt;results\u0026gt;\u003c/span\u003e標籤Struts2的MVC框架的視圖中所扮演的角色。動作是負責執行業務邏輯。執行業務邏輯後,下一步是使用\u003cspan\u003e\u0026lt;results\u0026gt;\u003c/span\u003e標籤顯示視圖。\u003cbr\u003e 經常有一些導航規則附加的結果。例如,如果在動作方法是對用戶進行驗證,有三種可能的結果。 (a)成功登錄失敗的登錄.\u0026nbsp;(b)用戶名或密碼不正確.(c)帳戶鎖定。\u003cbr\u003e 的操作方法在這種情況下,將配置有三種可能的結果字符串和三種不同的視圖呈現結果。在前面的例子\u003cspan\u003e我們已經看到\u003c/span\u003e。\u003cbr\u003e 但是,Struts2不配合使用JSP作爲視圖技術。畢竟了MVC模式的整個目的是保持層分離和高度可配置。例如,對於一個Web2.0客戶端,您可能要返回XML或JSON作爲輸出。在這種情況下,你可以創建一個新的結果類型爲XML或JSON,實現這一目標。\u003cbr\u003e Struts的一些預定義的結果類型,無論我們已經看到了,這是默認的結果類型,這是用來調度派遣到JSP頁面。 Struts允許使用的其他標記語言的技術,目前的結果和流行的選擇,包括\u003cspan\u003eVelocity, Freemaker, XSLT\u003c/span\u003e\u003cspan\u003e\u0026nbsp;和\u003c/span\u003e\u003cspan\u003eTiles\u003c/span\u003e。 \u003c/p\u003e \n\u003ch2\u003e 分發調度結果類型: \u003c/h2\u003e \n\u003cp\u003e 調度的結果類型是默認的類型,是用來指定,如果沒有其他的結果類型。它被用來轉發到一個servlet,JSP,HTML頁面等等,在服務器上它使用RequestDispatcher.forward()方法。\u003cbr\u003e 在我們前面的例子中,我們看到了「shorthand」版本,在這裏我們提供了一個JSP的路徑作爲身體的結果標記。 \u003c/p\u003e \n\u003cp\u003e \u0026nbsp; \u003c/p\u003e \n\u003cpre\u003e\u0026lt;result name=\"success\"\u0026gt;\r\n /HelloWorld.jsp\r\n\u0026lt;/result\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e We can also specify the JSP file using a \u0026lt;param name=\"location\"\u0026gt; tag within the \u0026lt;result...\u0026gt; element as follows: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;result name=\"success\" type=\"dispatcher\"\u0026gt;\r\n \u0026lt;param name=\"location\"\u0026gt;\r\n /HelloWorld.jsp\r\n \u0026lt;/param \u0026gt;\r\n\u0026lt;/result\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 我們還可以提供一個分析參數,默認值是true。解析參數的位置參數確定是否將被解析爲OGNL表達式。 \u003c/p\u003e \n\u003ch2\u003e FreeMaker結果類型: \u003c/h2\u003e \n\u003cp\u003e 在這個例子中,我們將看到我們如何使用FreeMaker作爲視圖技術。 freemaker是一種流行的模板引擎,用於生成輸出,使用預定義的模板。讓我們創建一個Freemaker模板文件hello.fm以下內容: \u003c/p\u003e \n\u003cpre\u003eHello World ${name}\r\u003c/pre\u003e \n\u003cp\u003e 在此以上的文件是一個模板,其中名稱是使用已定義的動作外,將通過放慢參數。在你的CLASSPATH中將保存該文件。接下來讓我們修改struts.xml中指定的結果如下: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\"?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n\r\n\u0026lt;struts\u0026gt;\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \u0026lt;package name=\"helloworld\" extends=\"struts-default\"\u0026gt;\r\n\r\n \u0026lt;action name=\"hello\" \r\n class=\"com.yiibai.struts2.HelloWorldAction\"\r\n method=\"execute\"\u0026gt;\r\n \u0026lt;result name=\"success\" type=\"freemarker\"\u0026gt;\r\n \u0026lt;param name=\"location\"\u0026gt;/hello.fm\u0026lt;/param\u0026gt;\r\n \u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n \r\n \u0026lt;/package\u0026gt;\r\n\r\n\u0026lt;/struts\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 讓我們保持我們的HelloWorldAction.java,HelloWorldAction.jsp和index.jsp文件,爲我們創造了他們的例子章。現在,右鍵單擊該項目上的名稱和clickExport\u0026gt; WAR文件創建一個WAR文件。然後,這WAR部署在Tomcat的webapps目錄下。最後,啓動Tomcat服務器,並嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給你以下畫面: \u003c/p\u003e \n\u003cimg alt=\"Struts2快速入門\" src=\"https://asset.1ju.org/cmsstatic/struts2-6.jpg\"\u003e \n\u003cp\u003e \u003cspan\u003e值\u003c/span\u003e「\u003cspan\u003eStruts2\u003c/span\u003e」,並提交頁面。您應該看到下一頁 \u003c/p\u003e \n\u003cimg alt=\"Struts2快速入門\" src=\"https://asset.1ju.org/cmsstatic/struts2-7.jpg\"\u003e \n\u003cp\u003e 正如你可以看到,這是完全一樣的不同之處在於,我們是不依賴於使用JSP作爲視圖技術的JSP視圖。在這個例子中,我們已經使用Freemaker。 \u003c/p\u003e \n\u003ch2\u003e 重定向結果類型: \u003c/h2\u003e \n\u003cp\u003e 重定向結果的類型調用標準\u003cspan\u003e\u0026nbsp;\u003c/span\u003e\u003ci\u003eresponse.sendRedirect()\u003c/i\u003e\u003cspan\u003e\u0026nbsp;\u003c/span\u003e方法,使瀏覽器來創建一個新的請求給定的位置。\u003cbr\u003e 我們可以提供的位置無論是在體內的\u0026lt;result...\u0026gt;元素或作爲一個\u0026lt;param name=\"location\"\u0026gt;元素。重定向也支持解析的參數。下面是一個例子使用XML配置: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;action name=\"hello\" \r\n class=\"com.yiibai.struts2.HelloWorldAction\"\r\n method=\"execute\"\u0026gt;\r\n \u0026lt;result name=\"success\" type=\"redirect\"\u0026gt;\r\n \u0026lt;param name=\"location\"\u0026gt;\r\n /NewWorld.jsp\r\n \u0026lt;/param \u0026gt;\r\n \u0026lt;/result\u0026gt;\r\n\u0026lt;/action\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 因此,只要修改struts.xml文件中定義重定向上述類型,並創建一個新的的文件NewWorld.jpg在那裏你會被重定向hello操作時,將返回成功。 \u003c/p\u003e \n\u003ch1\u003e Struts2值棧/ OGNL \u003c/h1\u003e \n\u003ch2\u003e 值棧: \u003c/h2\u003e \n\u003cp\u003e 值棧是一組的幾個對象保持中的下列對象提供的順序: \u003c/p\u003e \n\u003ctable width=\"100%\"\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003cth width=\"5\"\u003e SN \u003c/th\u003e \n \u003cth\u003e Objects \u0026amp; 描述 \u003c/th\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 1 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eTemporary Objects\u003c/span\u003e\u003cbr\u003e There are various temporary objects which are created during execution of a page. For example the current iteration value for a collection being looped over in a JSP tag. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 2 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eThe Model Object\u003c/span\u003e\u003cbr\u003e If you are using model objects in your struts application, the current model object is placed before the action on the value stack \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 3 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eThe Action Object\u003c/span\u003e\u003cbr\u003e This will be the current action object which is being executed. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 4 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eNamed Objects\u003c/span\u003e\u003cbr\u003e These objects include #application, #session, #request, #attr and #parameters and refer to the corresponding servlet scopes \u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n\u003c/table\u003e \n\u003cp\u003e 值棧可以通過標籤提供JSP,Velocity或者Freemarker的。在單獨的章節中,我們將研究有不同的標籤,被用來獲取和設置Struts 2.0的值棧。您可以在你的行動值棧對象如下: \u003c/p\u003e \n\u003cpre\u003eActionContext.getContext().getValueStack()\r\u003c/pre\u003e \n\u003cp\u003e 一旦你擁有了值對象,您可以使用以下方法來操作該對象: \u003c/p\u003e \n\u003ctable width=\"100%\"\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003cth width=\"5\"\u003e SN \u003c/th\u003e \n \u003cth\u003e ValueStack Methods \u0026amp; 描述 \u003c/th\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 1 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eObject findValue(String expr)\u003c/span\u003e\u003cbr\u003e Find a value by evaluating the given expression against the stack in the default search order. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 2 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eCompoundRoot getRoot()\u003c/span\u003e\u003cbr\u003e Get the CompoundRoot which holds the objects pushed onto the stack. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 3 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eObject peek()\u003c/span\u003e\u003cbr\u003e Get the object on the top of the stack without changing the stack. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 4 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eObject pop()\u003c/span\u003e\u003cbr\u003e Get the object on the top of the stack and remove it from the stack. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 5 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003evoid push(Object o)\u003c/span\u003e\u003cbr\u003e Put this object onto the top of the stack. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 6 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003evoid set(String key, Object o)\u003c/span\u003e\u003cbr\u003e Sets an object on the stack with the given key so it is retrievable by findValue(key,...) \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 7 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003evoid setDefaultType(Class defaultType)\u003c/span\u003e\u003cbr\u003e Sets the default type to convert to if no type is provided when getting a value. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 8 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003evoid setValue(String expr, Object value)\u003c/span\u003e\u003cbr\u003e Attempts to set a property on a bean in the stack with the given expression using the default search order. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 9 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eint size()\u003c/span\u003e\u003cbr\u003e Get the number of objects in the stack. \u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n\u003c/table\u003e \n\u003ch2\u003e OGNL: \u003c/h2\u003e \n\u003cp\u003e 對象圖導航語言(OGNL)是一個功能強大的表達式語言,用於引用和操作數據的值棧。OGNL還可以在數據傳輸和類型轉換。\u003cbr\u003e OGNL是非常相似的JSP表達式語言。 OGNL是基於的思想具有根或缺省對象的範圍內的。默認的根對象的屬性可以參考使用的標記符號,這是英鎊符號。 \u003c/p\u003e \n\u003cp\u003e \u0026nbsp; \u003c/p\u003e \n\u003cp\u003e 正如前面提到的,OGNL根據上下文和Struts建立一個ActionContext中使用OGNL地圖。ActionContext中的地圖由下列組成: \u003c/p\u003e \n\u003col\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003eapplication\u003c/span\u003e\u0026nbsp;- 應用程序範圍內的變量 \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003esession\u003c/span\u003e\u0026nbsp;- 會話範圍的變量 \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003eroot / value stack\u003c/span\u003e\u0026nbsp;-所有操作變量都存儲在這裏 \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003erequest\u003c/span\u003e\u0026nbsp;- 請求範圍的變量 \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003eparameters\u003c/span\u003e\u0026nbsp;- 請求參數 \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003eatributes\u003c/span\u003e\u0026nbsp;- 存儲的屬性頁面,請求,會話和應用範圍 \u003c/p\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e 重要的是要明白,值棧中的操作對象是始終可用。所以,因此,如果你的行動對象的屬性x和y有隨時可供您使用。\u003cbr\u003e 在ActionContext中的對象被稱爲使用英鎊符號,但是,值棧中的對象可以直接引用,例如,如果員工是一個動作類的屬性的話,就可以得到參考如下: \u003c/p\u003e \n\u003cp\u003e \u0026nbsp; \u003c/p\u003e \n\u003cpre\u003e \u0026lt;s:property value=\"name\"/\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 而不是 \u003c/p\u003e \n\u003cpre\u003e \u0026lt;s:property value=\"#name\"/\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 如果你有所謂的「login」會話中的屬性,你可以找回如下: \u003c/p\u003e \n\u003cpre\u003e \u0026lt;s:property value=\"#session.login\"/\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e OGNL還支持處理的集合 - 即地圖,List和Set。例如,以顯示顏色的下拉列表中,你可以這樣做: \u003c/p\u003e \n\u003cpre\u003e \u0026lt;s:select name=\"color\" list=\"{'red','yellow','green'}\" /\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e OGNL表達式是巧妙地解釋了\u003cspan\u003e\u0026nbsp;\"red\",\"yellow\",\"green\"\u003c/span\u003e顏色和此基礎上建立一個列表。\u003cbr\u003e OGNL表達式將被廣泛使用在接下來的章節中,我們將研究不同的標籤。因此,而不是孤立地看着他們,讓我們來看看的表格標籤/控制標籤/數據標籤和Ajax標籤部分在使用中的一些例子。 \u003c/p\u003e \n\u003ch2\u003e 值棧/OGNL例: \u003c/h2\u003e \n\u003ch3\u003e 創建動作: \u003c/h3\u003e \n\u003cp\u003e 讓我們考慮下面的操作類,我們訪問值棧,然後設置幾個鍵,我們將在我們的觀點,即訪問使用OGNL。JSP頁面。 \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.struts2;\r\n\r\nimport java.util.*; \r\n\r\nimport com.opensymphony.xwork2.util.ValueStack;\r\nimport com.opensymphony.xwork2.ActionContext;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class HelloWorldAction extends ActionSupport{\r\n private String name;\r\n\r\n public String execute() throws Exception {\r\n ValueStack stack = ActionContext.getContext().getValueStack();\r\n Map\u0026lt;String, Object\u0026gt; context = new HashMap\u0026lt;String, Object\u0026gt;();\r\n\r\n context.put(\"key1\", new String(\"This is key1\")); \r\n context.put(\"key2\", new String(\"This is key2\"));\r\n stack.push(context);\r\n\r\n System.out.println(\"Size of the valueStack: \" + stack.size());\r\n return \"success\";\r\n } \r\n\r\n public String getName() {\r\n return name;\r\n }\r\n\r\n public void setName(String name) {\r\n this.name = name;\r\n }\r\n}\r\u003c/pre\u003e \n\u003cp\u003e 其實,Struts 2增加值棧的頂部時動作執行。因此,通常的方法把東西值棧是增加值getter/setter方法Action類和然後使用\u0026lt;s:property\u0026gt;的標籤,訪問值。但我展示你究竟是如何的ActionContext中和值棧在struts的工作。 \u003c/p\u003e \n\u003ch3\u003e 創建視圖 \u003c/h3\u003e \n\u003cp\u003e 讓我們創建下面的JSP文件helloWorld.jsp,在WebContent文件夾在eclipse項目。這種觀點的情況下采取行動的成功返回,將顯示: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ page contentType=\"text/html; charset=UTF-8\" %\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;title\u0026gt;Hello World\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n Entered value : \u0026lt;s:property value=\"name\"/\u0026gt;\u0026lt;br/\u0026gt;\r\n Value of key 1 : \u0026lt;s:property value=\"key1\" /\u0026gt;\u0026lt;br/\u0026gt;\r\n Value of key 2 : \u0026lt;s:property value=\"key2\" /\u0026gt; \u0026lt;br/\u0026gt;\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 我們還需要創建index.jsp在WebContent文件夾下,其內容如下: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ page language=\"java\" contentType=\"text/html; charset=ISO-8859-1\"\r\n pageEncoding=\"ISO-8859-1\"%\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\"%\u0026gt;\r\n \u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;title\u0026gt;Hello World\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n \u0026lt;h1\u0026gt;Hello World From Struts2\u0026lt;/h1\u0026gt;\r\n \u0026lt;form action=\"hello\"\u0026gt;\r\n \u0026lt;label for=\"name\"\u0026gt;Please enter your name\u0026lt;/label\u0026gt;\u0026lt;br/\u0026gt;\r\n \u0026lt;input type=\"text\" name=\"name\"/\u0026gt;\r\n \u0026lt;input type=\"submit\" value=\"Say Hello\"/\u0026gt;\r\n \u0026lt;/form\u0026gt;\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\r\u003c/pre\u003e \n\u003ch3\u003e 配置文件 \u003c/h3\u003e \n\u003cp\u003e 以下是struts.xml文件的內容: \u003c/p\u003e \n\u003cpre\u003e \r\n\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\"?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n\r\n\u0026lt;struts\u0026gt;\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \u0026lt;package name=\"helloworld\" extends=\"struts-default\"\u0026gt;\r\n\r\n \u0026lt;action name=\"hello\" \r\n class=\"com.yiibai.struts2.HelloWorldAction\" \r\n method=\"execute\"\u0026gt;\r\n \u0026lt;result name=\"success\"\u0026gt;/HelloWorld.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\r\n \u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 以下是web.xml文件中的內容: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\"?\u0026gt;\r\n\u0026lt;web-app xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n xmlns=\"http://java.sun.com/xml/ns/javaee\" \r\n xmlns:web=\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\r\n xsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\r\n id=\"WebApp_ID\" version=\"3.0\"\u0026gt;\r\n \r\n \u0026lt;display-name\u0026gt;Struts 2\u0026lt;/display-name\u0026gt;\r\n \u0026lt;welcome-file-list\u0026gt;\r\n \u0026lt;welcome-file\u0026gt;index.jsp\u0026lt;/welcome-file\u0026gt;\r\n \u0026lt;/welcome-file-list\u0026gt;\r\n \u0026lt;filter\u0026gt;\r\n \u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n \u0026lt;filter-class\u0026gt;\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u0026lt;/filter-class\u0026gt;\r\n \u0026lt;/filter\u0026gt;\r\n\r\n \u0026lt;filter-mapping\u0026gt;\r\n \u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n \u0026lt;url-pattern\u0026gt;/*\u0026lt;/url-pattern\u0026gt;\r\n \u0026lt;/filter-mapping\u0026gt;\r\n\u0026lt;/web-app\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊「導出」\u0026gt; WAR文件創建一個WAR文件。然後,這WAR部署在Tomcat的webapps目錄下。最後,啓動Tomcat服務器,並嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給你以下畫面: \u003c/p\u003e \n\u003cimg alt=\"Struts2快速入門\" src=\"https://asset.1ju.org/cmsstatic/struts2-6.jpg\"\u003e \n\u003cp\u003e 現在,在給定的文本框中輸入任何單詞,然後點擊「Say Hello」按鈕執行已定義的動作。現在,如果你將檢查生成的日誌,你會發現下面的文字在底部: \u003c/p\u003e \n\u003cpre\u003e \r\nSize of the valueStack: 3\r\u003c/pre\u003e \n\u003cp\u003e 這將顯示下面的屏幕,它會顯示任何價值,你將進入和值key1和key2,我們賦上了值棧。 \u003c/p\u003e \n\u003cimg alt=\"Struts2快速入門\" src=\"https://asset.1ju.org/cmsstatic/struts2-10.jpg\"\u003e \n\u003ch1\u003e 結論: \u003c/h1\u003e \n\u003cp\u003e 希望你有較好的瞭解Struts 2概念。如果願意瞭解更多的細節和進一步的例子,如上傳文件,發送電子郵件,表單驗證等,然後可以去通過完整教程。 \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"13:Td6c,"])</script><script>self.__next_f.push([1,"\u003cp\u003e Struts2是流行和成熟的基於MVC設計模式的Web應用程序框架。 Struts2不只是Struts1下一個版本,它是一個完全重寫的Struts架構。\u003c/p\u003e \n\u003cp\u003e WebWork框架開始以Struts框架爲基礎,其目標是提供一個加強和改進框架Struts來使web開發的開發人員更容易。\u003c/p\u003e \n\u003cp\u003e 一段時間後,WebWork框架和Struts社區聯手打造的著名的Struts2框架。\u003c/p\u003e \n\u003ch2\u003e Struts 2框架的特點:\u003c/h2\u003e \n\u003cp\u003e 這裏有一些強大的功能,可能會迫使你考慮Struts2:\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e \u003cstrong\u003ePOJO表單和POJO動\u003c/strong\u003e作\u0026nbsp;- Struts2的Struts框架已經擺脫了動作表單組成部分,\u0026nbsp;Struts2可以使用任何POJO接收的形式輸入。同樣現在可以看到任何POJO作爲一個Action類。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cstrong\u003e標籤支持 \u003c/strong\u003e- Struts2中,提高了表單標籤和新標籤允許開發人員編寫更少的代碼。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cstrong\u003eAJAX\u0026nbsp;支持\u003c/strong\u003e- Struts2中已確認由Web2.0技術接管,並整合到產品中,通過創建AJAX標籤,功能非常相似的標準Struts2\u0026nbsp;標籤AJAX支持。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cstrong\u003e易於整合\u003c/strong\u003e\u0026nbsp;- Struts2\u0026nbsp;集成各種整合與其他框架如Spring,Tiles\u0026nbsp;和SiteMesh是現在更容易。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cstrong\u003e模板支持\u0026nbsp;\u003c/strong\u003e- 支持生成使用模板。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cstrong\u003e插件支持\u003c/strong\u003e\u0026nbsp;- 可以提高核心Struts2的特性,並增強使用插件。大量的插件可供Struts2。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cstrong\u003e性能分析\u003c/strong\u003e - Struts2的分析,調試和分析應用程序提供了集成。除此之外,Struts還提供了集成的內置調試工具調試。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cstrong\u003e易於修改標籤\u0026nbsp;\u003c/strong\u003e- Struts2的標籤標註,可以調整使用Freemarker的模板。這並不需要JSP或\u003ca href=\"http://www.yiiibai.com/java/\"\u003eJava\u003c/a\u003e知識。基本HTML,XML和CSS知識是足夠修改標籤。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cstrong\u003e提倡少配置\u003c/strong\u003e\u0026nbsp;- Struts2\u0026nbsp;促進較少的配置的幫助下,使用默認的各種設置值。不必配置的東西,除非它不符Struts2的默認設置。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cstrong\u003e視圖技術:\u003c/strong\u003e\u0026nbsp;- Struts2中有一個很大的支持多個視圖選項\u0026nbsp;(JSP, Freemarker, Velocity 和 XSLT)\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e 以上只是Struts2的十大功能,這使得它是企業公司級應用框架。\u003c/p\u003e \n\u003ch2\u003e Struts 2的缺點:\u003c/h2\u003e \n\u003cp\u003e 雖然Struts 2 的配備了一個偉大的功能列表,但我不會忘記提及關於Struts2一些缺點,將需要大量的改進措施:\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e \u003cstrong\u003e更大的學習曲線\u003c/strong\u003e\u0026nbsp;- 要使用MVC與Struts,你必須是習慣使用標準的JSP,Servlet API和大量精心設計的框架。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cstrong\u003e欠佳的文檔\u003c/strong\u003e\u0026nbsp;- Struts有標準的servlet和JSP API的相比,更少的在線資源,許多用戶第一時間發現網上Apache文檔混亂和管理不善的組織。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cstrong\u003e較少透明度\u003c/strong\u003e\u0026nbsp;- Struts應用程序中,有很多幕後比正常的基於Java的Web應用程序,這使得它很難理解的框架。\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e 最後一點,一個好的框架應該提供通用的特性,許多不同類型的應用程序,可以利用它。 Struts 2是一個最好的網絡架構和高度被用於開發富Internet應用程序(RIA)。\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"14:T24fb,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 我們的首要任務是讓最低限度的Struts2應用程序運行。本章將指導您如何準備開發環境中開始使用Struts2。我假設你已經在機器上安裝JDK(5 +),Tomcat和Eclipse。如果還沒有安裝這些組件(軟件),然後按照以下步驟:\u003c/p\u003e \n\u003ch2\u003e Step 1 - 安裝Java開發工具包(JDK):\u003c/h2\u003e \n\u003cp\u003e 從Oracle的Java網站:\u003ca href=\"http://www.oracle.com/technetwork/java/javase/downloads/index.htmll\"\u003eJava SE Downloads\u003c/a\u003e,可以下載最新版本的SDK。會發現說明安裝JDK中下載的文件,按照給定的說明來安裝和配置設置。最後,設置PATH和JAVA_HOME環境變量來引用該目錄包含javac和java,通常分別爲:java_install_dir/bin 和 java_install_dir\u003c/p\u003e \n\u003cp\u003e 如果使用的是Windows, SDK安裝在C:jdk1.5.0_20,在文件C:AUTOEXEC.BAT文件中把下面這行寫入。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003eset\u003c/span\u003e\u003cspan class=\"pln\"\u003e PATH\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003eC\u003c/span\u003e\u003cspan class=\"pun\"\u003e:\u003c/span\u003e\u003cspan class=\"pln\"\u003ejdk1\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"lit\"\u003e5.0\u003c/span\u003e\u003cspan class=\"pln\"\u003e_20\b\u003c/span\u003e\u003cspan class=\"kwd\"\u003ein\u003c/span\u003e\u003cspan class=\"pun\"\u003e;%\u003c/span\u003e\u003cspan class=\"pln\"\u003ePATH\u003c/span\u003e\u003cspan class=\"pun\"\u003e%\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eset\u003c/span\u003e\u003cspan class=\"pln\"\u003e JAVA_HOME\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003eC\u003c/span\u003e\u003cspan class=\"pun\"\u003e:\u003c/span\u003e\u003cspan class=\"pln\"\u003ejdk1\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"lit\"\u003e5.0\u003c/span\u003e\u003cspan class=\"pln\"\u003e_20\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 另外,在Windows NT/2000/XP上,您還可以右鍵單擊「我的電腦」,選擇「屬性」,再「高級」,找到「環境變量」。然後,更新PATH值(jdk安裝的目錄),然後按下「確定」按鈕。\u003c/p\u003e \n\u003cp\u003e 在Unix(Solaris上,Linux等),如果SDK安裝在/usr/local/jdk1.5.0_20,使用的是C shell,你把下面的到\u0026nbsp;.cshrc文件。\u0026nbsp;\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003esetenv PATH \u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003eusr\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"kwd\"\u003elocal\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003ejdk1\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"lit\"\u003e5.0\u003c/span\u003e\u003cspan class=\"pln\"\u003e_20\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003ebin\u003c/span\u003e\u003cspan class=\"pun\"\u003e:\u003c/span\u003e\u003cspan class=\"pln\"\u003e$PATH\r\nsetenv JAVA_HOME \u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003eusr\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"kwd\"\u003elocal\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003ejdk1\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"lit\"\u003e5.0\u003c/span\u003e\u003cspan class=\"pln\"\u003e_20\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 另外,如果使用如Borland公司的JBuilder,Eclipse,IntelliJ IDEA,或Sun ONE Studio的集成開發環境(IDE),編譯和運行一個簡單的程序,以確認是否安裝Java 。\u003cbr\u003e 注:可使用MyEclipse直接開發。\u003c/p\u003e \n\u003ch2\u003e Step 2 - Apache Tomcat的安裝:\u003c/h2\u003e \n\u003cp\u003e 您可以下載最新版本的Tomcat:\u003ca href=\"http://tomcat.apache.org/\"\u003ehttp://tomcat.apache.org/\u003c/a\u003e。一旦下載安裝,解壓二進制分發到一個方便的位置。例如,在Windows上可以是C:ApacheTomca,或/usr/local/apache-tomcat-6.0.33在Linux/Unix,並創建CATALINA_HOME環境變量指向這些位置。\u003c/p\u003e \n\u003cp\u003e Tomcat既可以啓動Windows機器上執行以下命令,或者可以簡單雙擊startup.bat\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e%\u003c/span\u003e\u003cspan class=\"pln\"\u003eCATALINA_HOME\u003c/span\u003e\u003cspan class=\"pun\"\u003e%\u003c/span\u003e\u003cspan class=\"pln\"\u003e\b\u003c/span\u003e\u003cspan class=\"kwd\"\u003ein\u003c/span\u003e\u003cspan class=\"pln\"\u003estartup\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ebat\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eor\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n C\u003c/span\u003e\u003cspan class=\"pun\"\u003e:\u003c/span\u003e\u003cspan class=\"pln\"\u003eapache\u003c/span\u003e\u003cspan class=\"pun\"\u003e-\u003c/span\u003e\u003cspan class=\"pln\"\u003etomcat\u003c/span\u003e\u003cspan class=\"pun\"\u003e-\u003c/span\u003e\u003cspan class=\"lit\"\u003e6.0\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"lit\"\u003e33\u003c/span\u003e\u003cspan class=\"pln\"\u003e\b\u003c/span\u003e\u003cspan class=\"kwd\"\u003ein\u003c/span\u003e\u003cspan class=\"pln\"\u003estartup\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ebat\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e Tomcat既可以在UNIX(Solaris,Linux等)的機器上啓動執行以下命令:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e$CATALINA_HOME\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003ebin\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003estartup\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esh\r\n \r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eor\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003eusr\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"kwd\"\u003elocal\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003eapache\u003c/span\u003e\u003cspan class=\"pun\"\u003e-\u003c/span\u003e\u003cspan class=\"pln\"\u003etomcat\u003c/span\u003e\u003cspan class=\"pun\"\u003e-\u003c/span\u003e\u003cspan class=\"lit\"\u003e6.0\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"lit\"\u003e33\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003ebin\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003estartup\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esh\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 成功啓動後,默認包含在Tomcat 的Web應用程序將通過訪問 http://localhost:8080/。如果一切順利,那麼它應該顯示以下結果:\u003c/p\u003e \n\u003cimg alt=\"Tomcat Home page\" src=\"https://asset.1ju.org/cmsstatic/struts2-1.JPG\"\u003e \n\u003cp\u003e 進一步Tomcat 配置和運行信息的文檔中可以找到這裏,以及在Tomcat網站:http://tomcat.apache.org\u003c/p\u003e \n\u003cp\u003e 停止Tomcat既可以通過Windows機器上執行以下命令:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e%\u003c/span\u003e\u003cspan class=\"pln\"\u003eCATALINA_HOME\u003c/span\u003e\u003cspan class=\"pun\"\u003e%\u003c/span\u003e\u003cspan class=\"pln\"\u003e\b\u003c/span\u003e\u003cspan class=\"kwd\"\u003ein\u003c/span\u003e\u003cspan class=\"pln\"\u003eshutdown\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eor\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\nC\u003c/span\u003e\u003cspan class=\"pun\"\u003e:\u003c/span\u003e\u003cspan class=\"pln\"\u003eapache\u003c/span\u003e\u003cspan class=\"pun\"\u003e-\u003c/span\u003e\u003cspan class=\"pln\"\u003etomcat\u003c/span\u003e\u003cspan class=\"pun\"\u003e-\u003c/span\u003e\u003cspan class=\"lit\"\u003e5.5\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"lit\"\u003e29\u003c/span\u003e\u003cspan class=\"pln\"\u003e\b\u003c/span\u003e\u003cspan class=\"kwd\"\u003ein\u003c/span\u003e\u003cspan class=\"pln\"\u003eshutdown\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 停止Tomcat既可以在Unix上執行以下命令(的Solaris,Linux等)的機器:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e$CATALINA_HOME\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003ebin\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003eshutdown\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esh\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eor\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003eusr\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"kwd\"\u003elocal\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003eapache\u003c/span\u003e\u003cspan class=\"pun\"\u003e-\u003c/span\u003e\u003cspan class=\"pln\"\u003etomcat\u003c/span\u003e\u003cspan class=\"pun\"\u003e-\u003c/span\u003e\u003cspan class=\"lit\"\u003e5.5\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"lit\"\u003e29\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003ebin\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003eshutdown\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esh\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e Step 3 - 安裝Eclipse(IDE)\u003c/h2\u003e \n\u003cp\u003e 在本教程中的所有例子已經寫入使用Eclipse IDE。所以我建議機器上安裝最新版本的Eclipse。\u003c/p\u003e \n\u003cp\u003e 安裝Eclipse 下載\u0026nbsp;\u003ca href=\"http://www.eclipse.org/downloads/\"\u003ehttp://www.eclipse.org/downloads\u003c/a\u003e最新的Eclipse二進制文件。一旦下載安裝,解壓二進制分發到一個方便的位置。例如,在windows中爲C:eclipse ,或/usr/local/eclipse 在\u0026nbsp;Linux/Unix 上,最後設置PATH變量。\u003c/p\u003e \n\u003cp\u003e Eclipse可以啓動Windows機器上執行以下命令,或者可以簡單地雙擊eclipse.exe\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e%\u003c/span\u003e\u003cspan class=\"pln\"\u003eC\u003c/span\u003e\u003cspan class=\"pun\"\u003e:\u003c/span\u003e\u003cspan class=\"pln\"\u003eeclipseeclipse\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eexe\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在Eclipse中可以在UNIX(的Solaris,Linux等)的機器上啓動執行以下命令:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e$\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003eusr\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"kwd\"\u003elocal\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003eeclipse\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003eeclipse\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 成功啓動後,如果一切正常,那麼它應顯示以下結果:\u003c/p\u003e \n\u003cimg alt=\"Eclipse Home page\" src=\"https://asset.1ju.org/cmsstatic/struts2-2.JPG\"\u003e \n\u003ch2\u003e Step 4 - 設置Struts2的庫\u003c/h2\u003e \n\u003cp\u003e 現在,如果一切正常,那麼可以進行設置Struts2 框架。下面是簡單的步驟,下載並安裝在機器上的Struts2。\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e 作出一個選擇是否要在Windows或Unix安裝Struts2,然後進行下一個步驟.zip文件下載在Windows,.tz 爲UNIX文件。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 下載Struts2 的二進制文件的最新版本\u0026nbsp;\u003ca href=\"http://struts.apache.org/download.cgi\"\u003ehttp://struts.apache.org/download.cgi\u003c/a\u003e.\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 在寫這篇教程的時候,我下載的是struts-2.0.14-all.zip解壓下載的文件時,C:struts-2.2.3 有如下的目錄結構。\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cimg alt=\"Sturts Directories\" src=\"https://asset.1ju.org/cmsstatic/struts2-11.jpg\"\u003e \n\u003cp\u003e 第二步是解壓zip文件中的任何位置,我下載和解壓struts-2.2.3-all.zip\u0026nbsp;在c:文件夾中,Windows 7機器上的所有jar文件放到到C:struts-2.2.3lib目錄下。確保正確設置CLASSPATH變量,否則將出現的問題,在運行應用程序同時。\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"15:T5cb2,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 前面我們已經學習了Struts2 的架構,當點擊一個超鏈接或提交一個HTML表單在Struts2 的 Web應用程序,輸入所收集被髮送到一個Java類稱爲操作控制器。當動作執行後,結果選擇了一個資源來呈現響應。資源通常是一個JSP,但它也可以是一個PDF文件,Excel電子表格,或一個Java applet 窗口。\u003c/p\u003e \n\u003cp\u003e 假設已經建立開發環境。現在讓我們繼續爲第一個 「Hello World」 的 struts2 項目構建。這個項目的目的是建立一個Web應用程序,它收集用戶的姓名,並顯示「Hello World」 用戶名。我們將創建任何Struts2項目的四個組成部分:\u003c/p\u003e \n\u003ctable\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003cth\u003e SN\u003c/th\u003e \n \u003cth\u003e 組件和說明\u003c/th\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 1\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eAction\u003c/b\u003e\u003cbr\u003e Create an action class which will contain complete business logic and conrol the interaction between the user, the model, and the view.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 2\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eInterceptors\u003c/b\u003e\u003cbr\u003e Create interceptors if required, or use existing interceptors. This is part of Controller.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 3\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eView\u003c/b\u003e\u003cbr\u003e Create a JSPs to interact with the user to take input and to present the final messages.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 4\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eConfiguration Files\u003c/b\u003e\u003cbr\u003e Create configuration files to couple the Action, View and Controllers. These files are struts.xml, web.xml, struts.properties.\u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n\u003c/table\u003e \n\u003cp\u003e 我打算使用Eclipse IDE,所以所有必需的組件將創建一個動態Web項目下。所以,讓我們開始創建動態Web項目。\u003c/p\u003e \n\u003ch2\u003e 創建動態Web項目:\u003c/h2\u003e \n\u003cp\u003e 啓動Eclipse,然後再\u0026nbsp;File \u0026gt; New \u0026gt; Dynamic Web Project\u0026nbsp;輸入工程名稱爲\u0026nbsp;HelloWorldStruts2\u0026nbsp;並設置屏幕中給出其餘的選項:\u003c/p\u003e \n\u003cimg alt=\"Hello World Sturts2\" src=\"https://asset.1ju.org/cmsstatic/struts2-hello-world-1.jpg\"\u003e \n\u003cp\u003e 選擇在接下來的畫面中的所有默認選項和最後檢查\u0026nbsp;Generate Web.xml deployment descriptor\u0026nbsp;選項. 這將創建一個動態Web項目在Eclipse。現在去\u0026nbsp;Windows \u0026gt; Show View \u0026gt; Project Explorer, 會看到項目窗口的東西如下:\u003c/p\u003e \n\u003cimg alt=\"Hello World Sturts2\" src=\"https://asset.1ju.org/cmsstatic/struts2-hello-world-2.jpg\"\u003e \n\u003cp\u003e 現在複製下列文件從struts 2 lib 文件夾\u0026nbsp;C:struts-2.2.3lib 到工程\u0026nbsp;WEB-INFlib\u0026nbsp;文件夾,要做到這一點,你可以簡單地將以下的所有文件拖放複製到WEB-INF lib文件夾。\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e commons-fileupload-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e commons-io-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e commons-lang-x.y.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e commons-logging-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e commons-logging-api-x.y.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e freemarker-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e javassist-.xy.z.GA\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e ognl-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e struts2-core-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e xwork-core.x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003ch2\u003e 創建動作類:\u003c/h2\u003e \n\u003cp\u003e Action類是 Struts2 應用程序的關鍵,我們實現的大部分動作類中的業務邏輯。因此,讓我們創建一個Java文件HelloWorldAction.java\u0026nbsp;Java Resources \u0026gt; src\u0026nbsp;在下面給出的內容包名\u0026nbsp;com.yiibai.struts2\u0026nbsp;。\u003c/p\u003e \n\u003cp\u003e Action類響應用戶操作,當用戶點擊一個URL。 Action類中的方法中的一個或多個被執行並返回一個字符串結果。基於結果的值,一個特定的JSP頁面的呈現方式。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHelloWorldAction\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 這是一個非常簡單的類,一個名爲「name」屬性。我們有標準的「name」屬性的getter和setter方法​​,並返回字符串「success」的執行方法。\u0026nbsp;\u003c/p\u003e \n\u003cp\u003e Struts2框架將創建一個對象HelloWorldAction類並調用執行方法在響應用戶的動作。把業務邏輯裏面的execute方法,最後返回的字符串常量。簡單地說爲每個網址,必須執行一個動作類,要麼就可以直接使用這個類的名稱作爲操作名,也可以使用struts.xml文件如下所示映射到一些其他的名字。\u003c/p\u003e \n\u003ch2\u003e 創建視圖\u003c/h2\u003e \n\u003cp\u003e 我們需要一個JSP提交最後的消息,這個頁面會被稱爲Struts2框架一個預定義的動作時,會發生這種映射將被定義在struts.xml文件。因此,讓我們一起創造在Eclipse項目在WebContent文件夾下面的jsp文件helloWorld.jsp。要做到這一點,右鍵單擊WebContent文件夾在項目資源管理器,選擇New \u0026gt;JSP File。\u0026nbsp;.\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Hello World, \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e taglib指令告訴Servlet容器,這個頁面將使用Struts 2的標籤,這些標籤將之前由s。\u0026nbsp;s:property標籤顯示動作類屬性\"name\u0026gt;\u0026nbsp;HelloWorldAction類的getName()方法返回的值。\u0026nbsp;\u003c/p\u003e \n\u003ch2\u003e 創建主頁:\u003c/h2\u003e \n\u003cp\u003e 我們還需要在WebContent文件夾中創建的index.jsp。該文件將作爲初始動作URL,用戶可以在其中點擊告訴Struts 2框架調用 HelloWorldAction類定義的方法呈現 helloWorld.jsp 視圖。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n pageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n \u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;h1\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World From Struts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/h1\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;form\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;label\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003efor\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003ePlease enter your name\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/label\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"text\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"submit\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Say Hello\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e Hello 動作定義在上面的視圖文件將被映射到HelloWorldAction類和其執行方法使用struts.xml文件。當用戶點擊「提交」按鈕,將導致Struts2框架運行的執行方法定義的在其中,HelloWorldAction類根據返回值的方法,將相應的視圖選擇和渲染作爲響應。\u003c/p\u003e \n\u003ch2\u003e 配置文件\u003c/h2\u003e \n\u003cp\u003e 我們需要一個映射,以配合網址,HelloWorldAction類(模型),和的helloWorld.jsp的(視圖)。映射講述了Struts 2框架類將響應用戶的操作(URL),這個類的方法將被執行,查看渲染基於字符串結果,該方法返回。\u003c/p\u003e \n\u003cp\u003e 因此,讓我們創建一個名爲struts.xml中。由於Struts2 要求struts.xml中存在類「文件夾中。因此,創建struts.xml文件的WebContent/ WEB-INF/classes文件夾下。 Eclipse不創建「classes」文件夾,所以需要自己做。要做到這一點,在項目資源管理器的WEB-INF文件夾上點擊右鍵並選擇New \u0026gt; Folder。struts.xml中應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 上面的配置文件的幾句話。在這裏,我們設置爲 true常量struts.devMode,因爲我們正在程序開發環境,我們需要看到一些有用的日誌消息。然後,我們定義了一個名爲HelloWorld 包。創建一個包是有用的,當想一起進行分組動作。在我們的例子中,我們將我們的行動命名爲「hello」,這是相應的URL /hello.action 和備份HelloWorldAction.class。執行HelloWorldAction.class方法是運行時URL /hello.action 調用的方法。如果執行方法的結果返回「success」,然後我們把用戶到 helloWorld.jsp。\u003c/p\u003e \n\u003cp\u003e 下一步是創建一個web.xml文件,這是一個Struts2的任何請求的入口點。Struts2應用程序的入口點,將是一個部署描述符(web.xml)中定義的過濾器。因此,我們將定義在web.xml中條目oforg.apache.struts2.dispatcher.FilterDispatcher類。 web.xml文件中需要創建的WEB-INF文件夾下的WebContent下。已經建立的Eclipse的web.xml文件時爲創建項目。所以,讓我們只需要修改如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 我們已經指定index.jsp的歡迎文件。然後,我們已經配置Struts2的過濾器上運行的所有URL(即任何URL匹配模式/ *)\u003c/p\u003e \n\u003ch2\u003e 啓用詳細日誌:\u003c/h2\u003e \n\u003cp\u003e 可以啓用完整的日誌記錄功能,而Struts 2的WEB-INF/classes下文件夾創建logging.properties文件。保持在屬性文件中的以下兩行:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \r\norg\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eapache\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ecatalina\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ecore\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eContainerBase\u003c/span\u003e\u003cspan class=\"pun\"\u003e.[\u003c/span\u003e\u003cspan class=\"typ\"\u003eCatalina\u003c/span\u003e\u003cspan class=\"pun\"\u003e].\u003c/span\u003e\u003cspan class=\"pln\"\u003elevel \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e INFO\r\norg\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eapache\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ecatalina\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ecore\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eContainerBase\u003c/span\u003e\u003cspan class=\"pun\"\u003e.[\u003c/span\u003e\u003cspan class=\"typ\"\u003eCatalina\u003c/span\u003e\u003cspan class=\"pun\"\u003e].\u003c/span\u003e\u003cspan class=\"pln\"\u003ehandlers \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003elogging\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eConsoleHandler\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 默認logging.properties指定ConsoleHandler的路由記錄到stdout,也是一個文件處理器。處理程序的日誌級別閾值可以設置使用 SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST 或 ALL.\u003c/p\u003e \n\u003cp\u003e 就是這樣。我們已經準備好使用Struts 2框架來運行我們的Hello World應用程序。\u003c/p\u003e \n\u003ch2\u003e 執行應用程序\u003c/h2\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊\u0026nbsp;Export \u0026gt; WAR File文件創建一個WAR文件。然後部署在Tomcat 的 webapps目錄下這個WAR。最後,啓動Tomcat 服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Hello World Input\" src=\"https://asset.1ju.org/cmsstatic/struts2-hello-world-3.jpg\"\u003e \n\u003cp\u003e 輸入一個值「Struts2」,並提交頁面。應該看到頁面如下:\u003c/p\u003e \n\u003cimg alt=\"Hello World Result\" src=\"https://asset.1ju.org/cmsstatic/struts2-hello-world-4.jpg\"\u003e \n\u003cp\u003e 注意,可以定義索引struts.xml文件中的動作,在這種情況下,可以調用索引頁http://localhost:8080/HelloWorldStruts2/index.action。下面檢查如何定義指數作爲一個動作:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"index\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/index.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"16:T46e6,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 本章將帶你通過一個Struts2應用程序所需的基本配置。在這裏,我們將看到在一些重要的配置文件,將配置文件:web.xml ,struts.xml,struts-config.xml和struts.properties\u003c/p\u003e \n\u003cp\u003e 使用web.xml和struts.xml的配置文件,並在前面的章節中,已經看到我們的例子中曾使用這兩個文件,讓我解釋以及其他文件。\u003c/p\u003e \n\u003ch2\u003e web.xml 文件:\u003c/h2\u003e \n\u003cp\u003e web.xml配置文件是一個J2EE的配置文件,決定如何處理元素的HTTP請求由servlet容器。嚴格來說它不是一個Struts2的配置文件,但它是Struts2的工作需要進行配置的文件。\u003c/p\u003e \n\u003cp\u003e 如前所述,這個文件爲任何Web應用程序提供了一個切入點。 Struts2 應用程序的入口點,將是一個部署描述符(web.xml)中定義的過濾器。因此,我們將定義在web.xml中的FilterDispatcher是類的項。需要創建的文件夾的WebContent/ WEB-INF下web.xml文件。\u003c/p\u003e \n\u003cp\u003e 這是第一個配置文件,將需要配置,如果沒有一個模板或工具,可生成(如Eclipse或Maven2的)的幫助下開始。以下是web.xml文件中的內容,我們用我們的最後一個例子。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 請注意,我們Struts 2的過濾器映射爲/*,\u0026nbsp;/*.action這意味着所有的URL將被解析struts的過濾器。我們將覆蓋時,我們將通過「註釋」一章。\u003c/p\u003e \n\u003ch2\u003e struts.xml 文件:\u003c/h2\u003e \n\u003cp\u003e struts.xml文件中包含的配置信息,將爲動作開發被修改。這個文件可以被用來覆蓋默認設置的應用程序,例如struts.devMode=false 和其他設置中定義的屬性文件。這個文件可以被文件夾WEB-INF/classes下創建\u0026nbsp;\u003c/p\u003e \n\u003cp\u003e 讓我們來看看在我們struts.xml文件中創建的Hello World的例子在前面的章節中解釋。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u0026lt;-- more actions can be listed here --\u0026gt;\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u0026lt;-- more packages can be listed here --\u0026gt;\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 首先要注意的是DOCTYPE。所有的Struts配置文件需要有正確的doctype所示,我們的小例子。 \u0026lt;struts\u0026gt;根標籤的元素,我們聲明不同的包使用\u0026lt;package\u0026gt;標籤。\u0026nbsp;\u0026lt;package\u0026gt;允許分離和模塊化的配置。這是非常有用的,當有一個大項目,項目被劃分成不同的模塊。\u003c/p\u003e \n\u003cp\u003e 也就是說,如果項目有三個域 - business_applicaiton ,customer_application 和 staff_application,可以創建三個包和存儲相關的動作,在適當的包。包裝標籤具有以下屬性:\u003c/p\u003e \n\u003ctable\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003cth\u003e 屬性\u003c/th\u003e \n \u003cth\u003e 描述\u003c/th\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e name (required)\u003c/td\u003e \n \u003ctd\u003e The unique identifier for the package\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e extends\u003c/td\u003e \n \u003ctd\u003e Which package does this package extend from? By default, we use struts-default as the base package.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e abstract\u003c/td\u003e \n \u003ctd\u003e If marked true, the package is not available for end user consumption.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e namesapce\u003c/td\u003e \n \u003ctd\u003e Unique namespace for the actions\u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n\u003c/table\u003e \n\u003cp\u003e 隨着name和value屬性恆定的標籤將被用於覆蓋default.properties中定義以下屬性,就像我們剛剛設置struts.devMode屬性。 Settingstruts.devMode屬性可以讓我們看到更多的調試消息,在日誌文件中。\u003c/p\u003e \n\u003cp\u003e 我們定義動作標記對應的每一個URL,我們要訪問,我們定義了一個類的execute()方法,將訪問時,我們將訪問相應的URL。\u003c/p\u003e \n\u003cp\u003e 結果決定得到執行動作後返回給瀏覽器。從操作返回的字符串應該是一個結果的名稱。以上,或者作爲一個「global」的結果,可包中的每一個動作,結果被配置每次動作。結果有可選的名稱和類型屬性。默認名稱的值是「success」。\u003c/p\u003e \n\u003cp\u003e 隨着時間的推移,struts.xml文件可以逐步擴展,打破它包是模塊化的方式之一,但Struts提供了另一種模塊化struts.xml文件。可以將文件分割爲多個XML文件,並以下列方式將它們導入。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;include\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003efile\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"my-struts1.xml\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;include\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003efile\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"my-struts2.xml\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 其他的配置文件,我們還沒有涉及到在struts-default.xml中。這個文件包含了Struts的標準配置設置,就不必去觸摸項目的這些99.99%設置。出於這個原因,我們不打算對這個文件介紹太多。如果有興趣,不妨看看到struts2的核心2.2.3.jar文件default.properties文件。\u003c/p\u003e \n\u003ch2\u003e struts-config.xml 文件:\u003c/h2\u003e \n\u003cp\u003e 在struts-config.xml 配置文件是在Web客戶端組件的視圖和模型之間的鏈接,但99.99%不會有觸碰這些設置在項目中。基本配置文件包含以下主要內容:\u003c/p\u003e \n\u003ctable\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003cth\u003e SN\u003c/th\u003e \n \u003cth\u003e 攔截\u0026nbsp;\u0026amp; 描述\u003c/th\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 1\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003estruts-config\u003c/b\u003e\u003cbr\u003e This is the root node of the configuration file.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 2\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eform-beans\u003c/b\u003e\u003cbr\u003e This is where you map your ActionForm subclass to a name. You use this name as an alias for your ActionForm throughout the rest of the struts-config.xml file, and even on your JSP pages.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 3\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eglobal forwards\u003c/b\u003e\u003cbr\u003e This section maps a page on your webapp to a name. You can use this name to refer to the actual page. This avoids hardcoding URLs on your web pages.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 4\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eaction-mappings\u003c/b\u003e\u003cbr\u003e This is where you declare form handlers and they are also known as\u0026nbsp;\u003cb\u003eaction mappings\u003c/b\u003e.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 5\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003econtroller\u003c/b\u003e\u003cbr\u003e This section configures Struts internals and rarely used in practical situations.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 6\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eplug-in\u003c/b\u003e\u003cbr\u003e This section tells Struts where to find your properties files, which contain prompts and error messages\u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n\u003c/table\u003e \n\u003cp\u003e 下面是示例struts-config.xml文件:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts-config PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 1.0//EN\"\r\n\"http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts-config\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"com\"\u003e\u0026lt;!-- ========== Form Bean Definitions ============ --\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;form-beans\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;form-bean\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"login\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"test.struts.LoginForm\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/form-beans\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"com\"\u003e\u0026lt;!-- ========== Global Forward Definitions ========= --\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;global-forwards\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/global-forwards\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"com\"\u003e\u0026lt;!-- ========== Action Mapping Definitions ======== --\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action-mappings\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003epath\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"/login\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"test.struts.LoginAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;forward\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"valid\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003epath\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"/jsp/MainMenu.jsp\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;forward\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"invalid\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003epath\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"/jsp/LoginView.jsp\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action-mappings\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"com\"\u003e\u0026lt;!-- ========== Controller Definitions ======== --\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;controller\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003econtentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"text/html;charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003edebug\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emaxFileSize\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"1.618M\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003elocale\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003enocache\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts-config\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e struts-config.xml文件的更多詳細信息,請查看 Struts 文檔。\u003c/p\u003e \n\u003ch2\u003e struts.properties 文件\u003c/h2\u003e \n\u003cp\u003e 此配置文件提供了一種機制來改變框架的默認行爲。 struts.properties配置文件內包含的屬性其實也可以被配置在web.xml中使用init-param中,以及在struts.xml的配置文件中使用恆定的標籤。但如果喜歡保持獨立和特定Struts,那麼可以創建這個文件的文件夾下的WEB-INF/classes。\u003c/p\u003e \n\u003cp\u003e 在這個文件中配置的值將覆蓋默認值配置default.properties這是包含在struts2-core-x.y.z.jar\u0026nbsp;分佈。有幾個的屬性,可能會考慮改變使用struts.properties文件:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"com\"\u003e### When set to true, Struts will act much more friendly for developers\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\nstruts\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003edevMode \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003etrue\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"com\"\u003e### Enables reloading of internationalization files\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\nstruts\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ei18n\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ereload \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003etrue\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"com\"\u003e### Enables reloading of XML configuration files\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\nstruts\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003econfiguration\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exml\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ereload \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003etrue\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"com\"\u003e### Sets the port that the server is run on\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\nstruts\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eurl\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ehttp\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eport \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"lit\"\u003e8080\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 這裏井號(#)開頭的行會被假定作爲註釋,它將被Struts 2忽略。\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"17:T6849,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 動作是Struts2框架的核心,因爲他們的任何MVC(模型 - 視圖 - 控制器)框架。每個URL將被映射到一個特定的動作,它提供了來自用戶的請求提供服務所需的處理邏輯。\u003c/p\u003e \n\u003cp\u003e 但動作也提供其他兩個重要的能力。首先,操作從請求數據的傳輸中起着重要的作用,通過向視圖,無論是一個JSP或其它類型的結果。二,動作必須協助的框架,在確定結果應該渲染視圖,在響應該請求將被退回。\u003c/p\u003e \n\u003ch2\u003e 創建動作:\u003c/h2\u003e \n\u003cp\u003e 在Struts2的動作,唯一的要求是必須有一個無參數的方法返回String或結果的對象,必須是一個POJO。如果不帶參數的方法是不指定,則默認動作是使用execute()方法。\u003c/p\u003e \n\u003cp\u003e 也可以選擇擴展ActionSupport類實現了6個接口,包括動作界面。動作界面如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003einterface\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eAction\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003estatic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003efinal\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003estatic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003efinal\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e NONE \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"none\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003estatic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003efinal\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e ERROR \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"error\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003estatic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003efinal\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e INPUT \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"input\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003estatic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003efinal\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e LOGIN \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"login\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 讓我們來看看Hello World示例的操作方法:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHelloWorldAction\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 爲了說明這一點,操作方法控制視圖,讓我們做出以下更改執行方法和擴展類ActionSupport 如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHelloWorldAction\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eif\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"SECRET\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eequals\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e))\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"kwd\"\u003eelse\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e ERROR\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在這個例子中,我們有一些在execute方法的邏輯來看待的name屬性。如果屬性等於字符串「SECRET」,我們返回SUCCESS\u0026nbsp;的結果,否則我們返回ERROR\u0026nbsp;的結果。因爲我們已經擴展ActionSupport,所以我們可以使用字符串常量的成功和錯誤。現在,讓我們修改我們的struts.xml文件如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"error\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/AccessDenied.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建視圖\u003c/h2\u003e \n\u003cp\u003e 讓我們創建以下JSP文件 helloWorld.jsp 的WebContent文件夾在eclipse項目。要做到這一點,右鍵單擊WebContent文件夾在項目資源管理器,選擇New \u0026gt;JSP File。該文件將要求返回的結果是SUCCESS,這是一個字符串常量「success」的定義在動作界面:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Hello World, \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 以下是由框架的動作的結果將被調用的文件,該文件是等於字符串常量「錯誤」的ERROR\u0026nbsp;。以下是AccessDenied.jsp 的內容\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eAccess Denied\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n You are not authorized to view this page.\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 我們還需要在WebContent文件夾中創建index.jsp。該文件將作爲初始動作URL,用戶可以直接點擊告訴Struts 2框架調用HelloWorldAction類的 execute方法,並呈現 helloWorld.jsp視圖。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n pageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n \u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;h1\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World From Struts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/h1\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;form\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;label\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003efor\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003ePlease enter your name\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/label\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"text\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"submit\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Say Hello\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 就是這樣,不需要改變的web.xml文件,所以讓我們用同一個web.xml,是之前我們已經創建了範例章。現在,我們已經準備好運行使用Struts 2框架的 Hello World應用程序。\u003c/p\u003e \n\u003ch2\u003e 執行應用程序\u003c/h2\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊\u0026nbsp;Export \u0026gt; WAR File\u0026nbsp;創建一個WAR文件。然後在Tomcat 的webapps目錄下部署這個WAR。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Hello World Input\" src=\"https://asset.1ju.org/cmsstatic/struts2-hello-world-3.jpg\"\u003e \n\u003cp\u003e 讓我們爲「SECRET」,並輸入一個字,應該看到以下頁面:\u003c/p\u003e \n\u003cimg alt=\"Success Result\" src=\"https://asset.1ju.org/cmsstatic/-1.jpg\"\u003e \n\u003cp\u003e 現在輸入任何單詞而非「SECRET」,應該看到以下頁面:\u0026nbsp;\u003c/p\u003e \n\u003cimg alt=\"Access Denied Result\" src=\"https://asset.1ju.org/cmsstatic/-2.jpg\"\u003e \n\u003ch2\u003e 建立多個動作:\u003c/h2\u003e \n\u003cp\u003e 經常會定義一個以上的動作,以處理不同的請求,並提供不同的用戶的URL,因此可以定義不同的類定義如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eMyAction\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003estatic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e GOOD \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003estatic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e BAD \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e ERROR\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHelloWorld\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e...\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eif\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"SECRET\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eequals\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e))\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eMyAction\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eGOOD\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eMyAction\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eBAD\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e...\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eSomeOtherClass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e...\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eMyAction\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eGOOD\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e...\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在struts.xml文件中配置這些操作如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\nstruts\u0026gt;\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"error\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/AccessDenied.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"something\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.SomeOtherClass\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/Something.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"error\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/AccessDenied.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 正如看到在上述假設的例子,動作的結果是重複的SUCCESS和ERROR。要解決這個問題,建議創建一個類包含結果的結果。\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"18:T84e9,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 攔截器的概念是Servlet過濾器或JDK代理類一樣的。攔截器允許橫切功能分開實現的動作,以及框架。使用攔截器,可以實現如下:\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e 提供預處理行動之前被稱爲邏輯。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 提供後處理邏輯動作後被調用\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 捕獲異常,這樣可以進行替代處理。\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e Struts2框架提供的許多功能都使用攔截實現的例子包括異常處理,文件上傳,生命週期回調和驗證等事實上作爲Struts2的基礎,其功能攔截,這可能有7或8攔截器分配給每個動作。\u003c/p\u003e \n\u003ch2\u003e Struts2框架的攔截器:\u003c/h2\u003e \n\u003cp\u003e Struts 2框架提供了良好的箱攔截列表來預先設定的,並準備使用。下面列出了幾個重要的攔截:\u003c/p\u003e \n\u003ctable\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003cth\u003e SN\u003c/th\u003e \n \u003cth\u003e 攔截器\u0026nbsp;\u0026amp; 描述\u003c/th\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 1\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003ealias\u003c/b\u003e\u003cbr\u003e Allows parameters to have different name aliases across requests.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 2\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003echeckbox\u003c/b\u003e\u003cbr\u003e Assists in managing check boxes by adding a parameter value of false for check boxes that are not checked.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 3\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003econversionError\u003c/b\u003e\u003cbr\u003e Places error information from converting strings to parameter types into the action's field errors.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 4\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003ecreateSession\u003c/b\u003e\u003cbr\u003e Automatically creates an HTTP session if one does not already exist.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 5\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003edebugging\u003c/b\u003e\u003cbr\u003e Provides several different debugging screens to the developer.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 6\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eexecAndWait\u003c/b\u003e\u003cbr\u003e Sends the user to an intermediary waiting page while the action executes in the background.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 7\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eexception\u003c/b\u003e\u003cbr\u003e Maps exceptions that are thrown from an action to a result, allowing automatic exception handling via redirection.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 8\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003efileUpload\u003c/b\u003e\u003cbr\u003e Facilitates easy file uploading.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 9\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003ei18n\u003c/b\u003e\u003cbr\u003e Keeps track of the selected locale during a user's session.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 10\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003elogger\u003c/b\u003e\u003cbr\u003e Provides simple logging by outputting the name of the action being executed.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 11\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eparams\u003c/b\u003e\u003cbr\u003e Sets the request parameters on the action.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 12\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eprepare\u003c/b\u003e\u003cbr\u003e This is typically used to do pre-processing work, such as setup database connections.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 13\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eprofile\u003c/b\u003e\u003cbr\u003e Allows simple profiling information to be logged for actions.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 14\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003escope\u003c/b\u003e\u003cbr\u003e Stores and retrieves the action's state in the session or application scope.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 15\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eServletConfig\u003c/b\u003e\u003cbr\u003e Provides the action with access to various servlet-based information.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 16\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003etimer\u003c/b\u003e\u003cbr\u003e Provides simple profiling information in the form of how long the action takes to execute.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 17\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003etoken\u003c/b\u003e\u003cbr\u003e Checks the action for a valid token to prevent duplicate formsubmission.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 18\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003evalidation\u003c/b\u003e\u003cbr\u003e Provides validation support for actions\u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n\u003c/table\u003e \n\u003cp\u003e 請看Struts 2文檔的完整細節上面提到的攔截。會告訴如何使用Struts應用程序在一個攔截器。\u003c/p\u003e \n\u003ch2\u003e 如何使用攔截器?\u003c/h2\u003e \n\u003cp\u003e 讓我們來看看如何使用已有的攔截,我們的「Hello World」程序。我們將使用計時器來測量過了多長時間執行操作方法,其目的是攔截。同時使用params攔截器,其目的是發送請求參數的動作。您可以嘗試不使用這個攔截您的示例中會發現,沒有被設置name屬性,因爲參數是無法達到動作。\u003c/p\u003e \n\u003cp\u003e 我們將繼續HelloWorldAction.java,web.xml 的helloWorld.jsp 和 index.jsp 文件,因爲他們已經建立了範例章節,但讓我們如下修改struts.xml文件,添加一個攔截器\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;interceptor-ref\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"params\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;interceptor-ref\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"timer\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊\u0026nbsp;Export \u0026gt; WAR File\u0026nbsp;創建一個WAR文件。然後部署在Tomcat 的webapps目錄下這個WAR。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給你以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Hello World Input\" src=\"https://asset.1ju.org/cmsstatic/struts2-hello-world-3.jpg\"\u003e \n\u003cp\u003e 現在,在給定的文本框中輸入單詞,並單擊「Say Hello按鈕執行已定義的動作。現在,如果將檢查生成的日誌,會發現下面的文字:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \r\nINFO\u003c/span\u003e\u003cspan class=\"pun\"\u003e:\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eServer\u003c/span\u003e\u003cspan class=\"pln\"\u003e startup \u003c/span\u003e\u003cspan class=\"kwd\"\u003ein\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"lit\"\u003e3539\u003c/span\u003e\u003cspan class=\"pln\"\u003e ms\r\n\u003c/span\u003e\u003cspan class=\"lit\"\u003e27\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"lit\"\u003e08\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"lit\"\u003e2011\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"lit\"\u003e8\u003c/span\u003e\u003cspan class=\"pun\"\u003e:\u003c/span\u003e\u003cspan class=\"lit\"\u003e40\u003c/span\u003e\u003cspan class=\"pun\"\u003e:\u003c/span\u003e\u003cspan class=\"lit\"\u003e53\u003c/span\u003e\u003cspan class=\"pln\"\u003e PM \r\ncom\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003elogging\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ecommons\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eCommonsLogger\u003c/span\u003e\u003cspan class=\"pln\"\u003e info\r\nINFO\u003c/span\u003e\u003cspan class=\"pun\"\u003e:\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eExecuted\u003c/span\u003e\u003cspan class=\"pln\"\u003e action \u003c/span\u003e\u003cspan class=\"pun\"\u003e[\u003c/span\u003e\u003cspan class=\"com\"\u003e//hello!execute] took 109 ms.\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 這裏底行,正在生成因爲這告訴動作發生要執行的總共爲 109ms定時器的攔截器。\u003c/p\u003e \n\u003ch2\u003e 創建自定義的攔截器\u003c/h2\u003e \n\u003cp\u003e 在應用程序中使用自定義的攔截器是一種優雅的方式提供橫切的應用功能。創建一個自定義攔截器是很容易的,需要擴展的接口,下面的Interceptor接口:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003einterface\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eInterceptor\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eSerializable\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e destroy\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e init\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e intercept\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionInvocation\u003c/span\u003e\u003cspan class=\"pln\"\u003e invocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 正如其名稱所表明的,init()方法提供了一種方法來初始化攔截器,並destroy()\u0026nbsp;方法提供了一種工具攔截清理。不同的行動,攔截被重用跨請求和需要是線程安全的,尤其是intercept()\u0026nbsp;方法。\u0026nbsp;\u003c/p\u003e \n\u003cp\u003e ActionInvocation對象可以訪問運行時環境。它允許訪問的動作本身和方法調用的動作,並確定動作是否已被調用。\u003c/p\u003e \n\u003cp\u003e 如果不需要初始化或清除代碼,可以擴展AbstractInterceptor類。這提供了一個默認的無操作實現的init()和 destroy()方法。\u003c/p\u003e \n\u003ch2\u003e 創建攔截器類:\u003c/h2\u003e \n\u003cp\u003e 讓我們創建Java資源 MyInterceptor.java\u0026gt; src 文件夾:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.*;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionInvocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003einterceptor\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eAbstractInterceptor\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eMyInterceptor\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eAbstractInterceptor\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e intercept\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionInvocation\u003c/span\u003e\u003cspan class=\"pln\"\u003e invocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"com\"\u003e/* let us do some pre-processing */\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e output \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"Pre-Processing\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"kwd\"\u003eout\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eprintln\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003eoutput\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"com\"\u003e/* let us call action or next interceptor */\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e result \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e invocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003einvoke\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"com\"\u003e/* let us do some post-processing */\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n output \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"Post-Processing\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"kwd\"\u003eout\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eprintln\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003eoutput\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e result\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 就像看到的,實際行動將使用攔截器執行invocation.invoke()調用。所以,可以做一些前處理和一些處理後,根據需要。\u003c/p\u003e \n\u003cp\u003e 該框架本身啓動的過程中,在第一次調用ActionInvocation對象的invoke()。每次\u0026nbsp;invoke()被調用,ActionInvocation的諮詢的狀態和執行爲準攔截接下來。通過請求流以下數據圖顯示了相同的概念:\u003c/p\u003e \n\u003cimg alt=\"ActionInvocation\" src=\"https://asset.1ju.org/cmsstatic/struts2-12.jpg\"\u003e \n\u003ch2\u003e 創建動作類:\u003c/h2\u003e \n\u003cp\u003e 讓我們創建一個Java文件HelloWorldAction.java的Java下Java Resources \u0026gt; src下面給出的內容包名爲 com.yiibai.struts2。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHelloWorldAction\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"kwd\"\u003eout\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eprintln\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Inside action....\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在前面的例子中,我們已經看到,這是一個相同的類。我們有標準的「名稱」屬性的getter和setter方法​​,並返回字符串「success」的執行方法。\u003c/p\u003e \n\u003ch2\u003e 創建視圖\u003c/h2\u003e \n\u003cp\u003e 讓我們創建以下JSP文件helloWorld.jsp,在eclipse項目在WebContent文件夾。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Hello World, \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建頁面:\u003c/h2\u003e \n\u003cp\u003e 我們還需要在WebContent文件夾中創建 index.jsp。該文件將作爲初始動作URL,用戶可以在其中點擊告訴Struts 2框架調用 HelloWorldAction類定義的方法呈現 helloWorld.jsp視圖。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n pageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n \u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;h1\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World From Struts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/h1\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;form\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;label\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003efor\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003ePlease enter your name\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/label\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"text\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"submit\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Say Hello\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e Hello 動作定義在上面的視圖文件將被映射到HelloWorldAction類和其執行方法使用struts.xml文件。\u003c/p\u003e \n\u003ch2\u003e 配置文件\u003c/h2\u003e \n\u003cp\u003e 現在,我們需要註冊我們的攔截器,然後調用它默認的攔截器在前面的例子中調用。要註冊一個新定義的攔截,直接放在的\u0026lt;interceptors\u0026gt;...\u0026lt;/interceptors\u0026gt;標籤下\u0026lt;package\u0026gt;的標籤插件struts.xml文件。您可以跳過這一步爲默認的攔截器,就像我們在我們前面的例子。但在這裏,讓我們註冊和使用它,如下所示:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;interceptors\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;interceptor\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myinterceptor\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.MyInterceptor\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/interceptors\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;interceptor-ref\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"params\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;interceptor-ref\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myinterceptor\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 應該指出的是,可以註冊多個攔截器\u0026lt;package\u0026gt;標籤內,同一時間,可以調用多個攔截裏面的\u0026lt;action\u0026gt;標籤。可以調用相同的攔截器與不同的動作。\u0026nbsp;\u003c/p\u003e \n\u003cp\u003e web.xml文件需要在 WEB-INF文件夾下創建 WebContent 如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊\u0026nbsp;\u0026nbsp;Export \u0026gt; WAR File\u0026nbsp;文件創建一個WAR文件。然後部署在Tomcat 的webapps目錄下這個WAR。最後,啓動Tomcat 服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給你以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Hello World Input\" src=\"https://asset.1ju.org/cmsstatic/struts2-hello-world-3.jpg\"\u003e \n\u003cp\u003e 現在,在給定的文本框中輸入任何單詞,並單擊「Say Hello「 按鈕執行已定義的動作。現在,如果檢查生成的日誌,會發現下面的文本下方:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \r\n\u003c/span\u003e\u003cspan class=\"typ\"\u003ePre\u003c/span\u003e\u003cspan class=\"pun\"\u003e-\u003c/span\u003e\u003cspan class=\"typ\"\u003eProcessing\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"typ\"\u003eInside\u003c/span\u003e\u003cspan class=\"pln\"\u003e action\u003c/span\u003e\u003cspan class=\"pun\"\u003e....\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"typ\"\u003ePost\u003c/span\u003e\u003cspan class=\"pun\"\u003e-\u003c/span\u003e\u003cspan class=\"typ\"\u003eProcessing\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 堆疊多個攔截器:\u003c/h2\u003e \n\u003cp\u003e 可以想像,配置多個攔截器每個動作很快就會變得非常難以控制。出於這個原因,攔截器與攔截器棧管理。下面是一個例子,直接從在struts-default.xml文件:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;interceptor-stack\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"basicStack\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;interceptor-ref\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"exception\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;interceptor-ref\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"servlet-config\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;interceptor-ref\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"prepare\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;interceptor-ref\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"checkbox\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;interceptor-ref\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"params\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;interceptor-ref\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"conversionError\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/interceptor-stack\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 上面的棧被調用basicStack,可用於在配置中,如下所示。此配置節點放置在\u0026lt;package.../\u0026gt;節點下。每個\u0026lt;interceptor-ref.../\u0026gt;標記引用一個攔截器或攔截器棧已配置在當前的攔截器棧。因此,這是非常重要的,以確保該名稱是唯一的所有攔截器和攔截器棧配置配置初始的攔截器和攔截器棧時。\u0026nbsp;\u003c/p\u003e \n\u003cp\u003e 我們已經看到了如何應用攔截的動作,將攔截器棧是沒有什麼不同。事實上,我們完全使用相同的標籤:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.MyAction\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;interceptor-ref\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"basicStack\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eview.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u0026lt;/action\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 上述註冊的「basicStack」所有6個攔截器完成註冊的棧\u0026nbsp;Hello 動作。應該指出的是,攔截器執行的順序在配置中。例如,在上述情況下,異常將被執行,servlet 配置等。\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"19:T2462,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 正如前面提到的,\u0026lt;results\u0026gt;標籤在Struts2的MVC框架的視圖中所扮演的角色。動作是負責執行業務邏輯。執行業務邏輯後,接下來的步驟是使用\u0026lt;results\u0026gt;標籤顯示的視圖。\u0026nbsp;\u003c/p\u003e \n\u003cp\u003e 經常有一些附帶導航規則的結果。例如,如果在操作方法是對用戶進行驗證,有三種可能的結果。 (一)成功登錄;(二)不成功的登錄,用戶名或密碼錯誤;(三)帳戶鎖定。\u003c/p\u003e \n\u003cp\u003e 在這種情況下的動作方法將被配置呈現的結果有三種可能的結果字符串和三個不同的看法。我們已經看到在前面的例子。\u003c/p\u003e \n\u003cp\u003e 但是,Struts2 不配合使用JSP作爲視圖技術。畢竟MVC範例的整個目的是保持獨立的層,高度可配置的。例如,對於一個Web2.0的客戶端,可能希望返回XML或JSON作爲輸出。在這種情況下,可以創建一個新的結果類型爲XML或JSON和實現這一目標。\u003c/p\u003e \n\u003cp\u003e Struts的一些預定義的結果類型,無論我們已經看到了,這是默認的結果類型,它是用來調度調度到\u003ca href=\"http://www,yiibai.com/jsp/\"\u003eJSP\u003c/a\u003e頁面。 Struts 允許使用其它標記語言的技術呈現的結果和流行的選擇,包括\u0026nbsp;Velocity, Freemaker, XSLT\u0026nbsp;和Tiles.\u003c/p\u003e \n\u003ch2\u003e 分發結果類型:\u003c/h2\u003e \n\u003cp\u003e 調度程序的結果類型是缺省類型,並使用,如果沒有其他的結果類型被指定。它被用來轉發到一個servlet,JSP,\u003ca href=\"http://www,yiibai.com/html/\"\u003eHTML\u003c/a\u003e頁面,等等,在服務器上。它使用RequestDispatcher.forward()方法。\u003c/p\u003e \n\u003cp\u003e 在我們前面的例子中,我們看到了「shorthand」的版本,在那裏我們提供了身體的結果標籤 JSP路徑。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n /HelloWorld.jsp\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 我們也可以指定JSP文件中使用一個\u0026lt;param name=\"location\"\u0026gt;的標籤內\u0026lt;result...\u0026gt;的元素如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"dispatcher\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"location\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n /HelloWorld.jsp\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 我們還可以提供一個分析參數,默認爲true。解析參數位置參數決定是否將被解析爲OGNL表達式。\u003c/p\u003e \n\u003ch2\u003e FreeMaker結果類型:\u003c/h2\u003e \n\u003cp\u003e 在這個例子中,我們將看到我們如何使用FreeMaker作爲視圖技術。 freemaker是一種流行的模板引擎,用於使用預定義的模板來生成輸出。讓我們Freemaker模板創建一個文件稱爲hello.fm以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"typ\"\u003eHello\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eWorld\u003c/span\u003e\u003cspan class=\"pln\"\u003e $\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在這裏,上述文件是一個模板的名字是從外面使用已定義的動作,將傳遞一個參數置。會保持這個文件在CLASSPATH中。接下來,讓我們修改struts.xml中指定結果如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"freemarker\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"location\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/hello.fm\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 讓我們使用前面的 HelloWorldAction.java,HelloWorldAction.jsp和index.jsp文件。現在右鍵點擊項目名稱,並單擊Export \u0026gt; WAR File創建一個WAR文件。然後部署這個WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給出以下畫面:\u0026nbsp;\u003c/p\u003e \n\u003cimg alt=\"Hello World Input\" src=\"https://asset.1ju.org/cmsstatic/struts2-hello-world-3.jpg\"\u003e \n\u003cp\u003e 輸入一個值「Struts2」,並提交頁面。應該看到翻頁\u003c/p\u003e \n\u003cimg alt=\"Hello World Result\" src=\"https://asset.1ju.org/cmsstatic/struts2-hello-world-4.jpg\"\u003e \n\u003cp\u003e 正如看到,這是完全一樣的JSP視圖,但我們是不依賴於使用JSP作爲視圖技術。在這個例子中,我們已經使用Freemaker。\u003c/p\u003e \n\u003ch2\u003e 重定向結果類型:\u003c/h2\u003e \n\u003cp\u003e 重定向的結果類型,調用的是標準response.sendRedirect() 方法,使瀏覽器建立一個新的請求發送到給定的位置。\u003c/p\u003e \n\u003cp\u003e 我們可以提供無論是在體內的\u0026lt;result...\u0026gt;元素或作爲一個\u0026lt;param name=\"location\"\u0026gt;的元素的位置。還支持重定向解析參數。下面是一個例子使用XML配置:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"redirect\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"location\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n /NewWorld.jsp\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 因此,只要修改struts.xml文件,定義如上所述重定向類型,並創建一個新的文件,在那裏會被重定向 Hello時動作將返回成功到NewWorld.jpg。也可以checkStruts2 重定向操作的例子,爲了更好的理解。\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"1a:T5b1d,"])</script><script>self.__next_f.push([1,"\u003ch2\u003e 值棧:\u003c/h2\u003e \n\u003cp\u003e 值棧是一個集合中的幾個對象保持下列對象提供的順序:\u003c/p\u003e \n\u003ctable\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003cth\u003e SN\u003c/th\u003e \n \u003cth\u003e 對象\u0026amp; 描述\u003c/th\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 1\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eTemporary Objects\u003c/b\u003e\u003cbr\u003e There are various temporary objects which are created during execution of a page. For example the current iteration value for a collection being looped over in a JSP tag.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 2\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eThe Model Object\u003c/b\u003e\u003cbr\u003e If you are using model objects in your struts application, the current model object is placed before the action on the value stack\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 3\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eThe Action Object\u003c/b\u003e\u003cbr\u003e This will be the current action object which is being executed.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 4\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eNamed Objects\u003c/b\u003e\u003cbr\u003e These objects include #application, #session, #request, #attr and #parameters and refer to the corresponding servlet scopes\u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n\u003c/table\u003e \n\u003cp\u003e 值棧可以通過JSP,Velocity或者Freemarker的標籤。有各種不同的標籤在單獨的章節中,我們將學習,用於獲取和設置Struts 2.0 的值棧。 ValueStack的對象裏面可以得到動作如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"typ\"\u003eActionContext\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egetContext\u003c/span\u003e\u003cspan class=\"pun\"\u003e().\u003c/span\u003e\u003cspan class=\"pln\"\u003egetValueStack\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 一旦擁有了值對象,就可以用下面的方法來操縱該對象:\u003c/p\u003e \n\u003ctable\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003cth\u003e SN\u003c/th\u003e \n \u003cth\u003e ValueStack的方法及說明\u003c/th\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 1\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eObject findValue(String expr)\u003c/b\u003e\u003cbr\u003e Find a value by evaluating the given expression against the stack in the default search order.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 2\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eCompoundRoot getRoot()\u003c/b\u003e\u003cbr\u003e Get the CompoundRoot which holds the objects pushed onto the stack.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 3\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eObject peek()\u003c/b\u003e\u003cbr\u003e Get the object on the top of the stack without changing the stack.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 4\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eObject pop()\u003c/b\u003e\u003cbr\u003e Get the object on the top of the stack and remove it from the stack.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 5\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003evoid push(Object o)\u003c/b\u003e\u003cbr\u003e Put this object onto the top of the stack.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 6\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003evoid set(String key, Object o)\u003c/b\u003e\u003cbr\u003e Sets an object on the stack with the given key so it is retrievable by findValue(key,...)\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 7\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003evoid setDefaultType(Class defaultType)\u003c/b\u003e\u003cbr\u003e Sets the default type to convert to if no type is provided when getting a value.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 8\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003evoid setValue(String expr, Object value)\u003c/b\u003e\u003cbr\u003e Attempts to set a property on a bean in the stack with the given expression using the default search order.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 9\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eint size()\u003c/b\u003e\u003cbr\u003e Get the number of objects in the stack.\u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n\u003c/table\u003e \n\u003ch2\u003e OGNL:\u003c/h2\u003e \n\u003cp\u003e 對象圖形導航語言(OGNL)是一個功能強大的表達式語言是用來參考值棧上的數據和操縱。 OGNL也有助於在數據傳輸和類型轉換。\u003c/p\u003e \n\u003cp\u003e OGNL和JSP表達式語言很相似。 OGNL 基礎的理念是在 root或默認的對象範圍內。默認或根對象的屬性,可以參考使用的標記符號(井號)。\u003c/p\u003e \n\u003cp\u003e 如前所述,OGNL是基於上下文和Struts的構建ActionContext 使用OGNL映射。ActionContext中映射包括以下:\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e application\u0026nbsp;- 應用範圍的變量\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e session\u0026nbsp;- 會話範圍的變量\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e root / value stack\u0026nbsp;- 所有操作變量都保存在這裏\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e request\u0026nbsp;- 請求範圍的變量\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e parameters\u0026nbsp;- 請求參數\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e atributes\u0026nbsp;-\u0026nbsp;存儲的屬性頁面,請求,會話和應用範圍\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e 重要的是要明白,操作對象是始終可用值棧中的。所以,因此,如果動作對象的屬性x和y有隨時供使用。\u003c/p\u003e \n\u003cp\u003e 在ActionContext中的對象被稱爲使用井號的符號,但是,值棧中的對象可以被直接引用,例如,如果員工是一個動作類的屬性,那麼就可以得到如下參考:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 來代替\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"#name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 如果會話中有一個屬性叫做「login」,可以找回如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"#session.login\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e OGNL還支持處理的集合 - 即映射,List和Set。例如,以顯示顏色的下拉列表,可以這樣做:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:select\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"color\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elist\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"{'red','yellow','green'}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 本OGNL表達式是巧妙地的解釋\u0026nbsp;\"red\",\"yellow\",\"green\"爲顏色,並此基礎上建立一個列表。\u0026nbsp;\u003c/p\u003e \n\u003cp\u003e OGNL表達式將被廣泛使用時,在接下來的章節中,我們將研究不同的標籤。因此,讓我們來看看它使用的一些例子在Form標籤/標籤/數據標籤控制和Ajax標籤。\u003c/p\u003e \n\u003ch2\u003e ValueStack/OGNL 例子:\u003c/h2\u003e \n\u003ch3\u003e 創建動作:\u003c/h3\u003e \n\u003cp\u003e 讓我們考慮以下動作類,當我們訪問值棧,然後設置幾個鍵,我們將在視圖,即訪問使用OGNL,JSP頁面。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.*;\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eValueStack\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionContext\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHelloWorldAction\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eValueStack\u003c/span\u003e\u003cspan class=\"pln\"\u003e stack \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionContext\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egetContext\u003c/span\u003e\u003cspan class=\"pun\"\u003e().\u003c/span\u003e\u003cspan class=\"pln\"\u003egetValueStack\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eMap\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eObject\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e context \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHashMap\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eObject\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026gt;();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n context\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eput\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"key1\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"This is key1\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n context\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eput\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"key2\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"This is key2\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n stack\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003epush\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003econtext\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"kwd\"\u003eout\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eprintln\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Size of the valueStack: \"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e+\u003c/span\u003e\u003cspan class=\"pln\"\u003e stack\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esize\u003c/span\u003e\u003cspan class=\"pun\"\u003e());\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 其實,Struts 2的值棧的頂部增加了動作時執行。所以,通常的方法是把東西值棧添加 getter/setter方法以使這些值在Action類,然後使用\u0026lt;s:property\u0026gt;標籤來訪問值。以下是展示如何在struts ActionContext 中 ValueStack \u0026nbsp;工作。\u003c/p\u003e \n\u003ch3\u003e 創建視圖\u003c/h3\u003e \n\u003cp\u003e 讓我們創建以下JSP文件 helloWorld.jsp 的要 WebContent 文件夾。這個視圖將被顯示動作返回「success」:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Entered value : \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Value of key 1 : \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"key1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Value of key 2 : \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"key2\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 我們還需要創建的index.jsp在WebContent文件夾,其內容如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n pageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n \u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;h1\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World From Struts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/h1\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;form\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;label\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003efor\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003ePlease enter your name\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/label\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"text\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"submit\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Say Hello\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch3\u003e 配置文件\u003c/h3\u003e \n\u003cp\u003e 以下是struts.xml文件的內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 以下是web.xml文件中的內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊Export \u0026gt; WAR File創建一個WAR文件。然後將此WAR 部署在Tomcat 的 webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。如以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Hello World Input\" src=\"https://asset.1ju.org/cmsstatic/struts2-hello-world-3.jpg\"\u003e \n\u003cp\u003e 現在在給定的文本框中輸入任何單詞,然後點擊\"Say Hello\"按鈕執行已定義的動作。現在,如果檢查生成的日誌,會發現下面的文本底部:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \r\n\u003c/span\u003e\u003cspan class=\"typ\"\u003eSize\u003c/span\u003e\u003cspan class=\"pln\"\u003e of the valueStack\u003c/span\u003e\u003cspan class=\"pun\"\u003e:\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"lit\"\u003e3\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 這將顯示以下畫面,這將顯示任何的值,將進入值爲key1和key2,我們已經把它們放入 ValueStack。\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"1b:T675e,"])</script><script>self.__next_f.push([1,"\u003cp\u003e Struts 2框架提供了內置支持處理文件上傳使用基於HTML表單的文件上傳。上傳一個文件時,它通常會被存儲在一個臨時目錄中,他們應該由Action類進行處理或移動到一個永久的目錄,以確保數據不丟失。\u003c/p\u003e \n\u003cp\u003e \u003cb\u003e請注意,服務器\u003c/b\u003e\u003cb\u003e有一個安全策略\u003c/b\u003e\u003cb\u003e可能會禁止寫到目錄以外的臨時目錄和屬於web應用的目錄。\u003c/b\u003e\u003c/p\u003e \n\u003cp\u003e 在Struts中的文件上傳是通過預先定義的攔截文件上傳攔截器這是可通過org.apache.struts2.interceptor.FileUploadInterceptor類的defaultStack中的一部分。仍然可以使用在struts.xml中設置各種參數,我們將在下面看到。\u003c/p\u003e \n\u003ch2\u003e 創建視圖文件:\u003c/h2\u003e \n\u003cp\u003e 讓我們開始創建我們認爲這將需要瀏覽和上傳選定的文件。因此,讓我們創建一個純HTML上傳表單,允許用戶上傳文件 index.jsp:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\npageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eFile Upload\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;form\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"upload\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"post\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eenctype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"multipart/form-data\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;label\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003efor\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myFile\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eUpload your file\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/label\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"file\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myFile\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"submit\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Upload\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在上面的例子中值得注意幾點說明。首先,表單的enctype屬性設置爲multipart/ form-data。這應該是設置爲使得處理文件上傳文件上傳。下一個點值得注意的是表單的 action方法上傳和文件上傳字段的名稱 - myFile。我們需要這些信息創建操作方法和struts配置。\u003c/p\u003e \n\u003cp\u003e 接下來讓我們創建一個簡單的 jsp 文件的success.jsp 結果顯示我們的文件上傳的情況下成功。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eFile Upload Success\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\nYou have successfully uploaded \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myFileFileName\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 下面將結果文件error.jsp 可能會有一些錯誤,在上傳文件:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eFile Upload Error\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\nThere has been an error in uploading the file.\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建action類:\u003c/h2\u003e \n\u003cp\u003e 接下來讓我們創建一個Java類稱爲 uploadFile.java 這會處理上傳文件,該文件存儲在一個安全的位置:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eio\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eFile\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e org\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eapache\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ecommons\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eio\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eFileUtils\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eio\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eIOException\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e uploadFile \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eFile\u003c/span\u003e\u003cspan class=\"pln\"\u003e myFile\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e myFileContentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e myFileFileName\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e destPath\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"com\"\u003e/* Copy file to a safe location */\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n destPath \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"C:/apache-tomcat-6.0.33/work/\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003etry\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \t \u003c/span\u003e\u003cspan class=\"typ\"\u003eSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"kwd\"\u003eout\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eprintln\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Src File name: \"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e+\u003c/span\u003e\u003cspan class=\"pln\"\u003e myFile\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \t \u003c/span\u003e\u003cspan class=\"typ\"\u003eSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"kwd\"\u003eout\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eprintln\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Dst File name: \"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e+\u003c/span\u003e\u003cspan class=\"pln\"\u003e myFileFileName\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \t \t \r\n \t \u003c/span\u003e\u003cspan class=\"typ\"\u003eFile\u003c/span\u003e\u003cspan class=\"pln\"\u003e destFile \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eFile\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003edestPath\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e myFileFileName\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \t \u003c/span\u003e\u003cspan class=\"typ\"\u003eFileUtils\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ecopyFile\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003emyFile\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e destFile\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"kwd\"\u003ecatch\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eIOException\u003c/span\u003e\u003cspan class=\"pln\"\u003e e\u003c/span\u003e\u003cspan class=\"pun\"\u003e){\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n e\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eprintStackTrace\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e ERROR\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eFile\u003c/span\u003e\u003cspan class=\"pln\"\u003e getMyFile\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e myFile\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setMyFile\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eFile\u003c/span\u003e\u003cspan class=\"pln\"\u003e myFile\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003emyFile \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e myFile\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getMyFileContentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e myFileContentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setMyFileContentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e myFileContentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003emyFileContentType \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e myFileContentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getMyFileFileName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e myFileFileName\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setMyFileFileName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e myFileFileName\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003emyFileFileName \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e myFileFileName\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e uploadFile.java是一個非常簡單的類。重要的是要注意的是使用FileUpload攔截器隨着參數Intercetpor 確實爲我們解決所有繁重工作。文件上傳攔截器,使三個參數,默認情況下提供。它們被命名爲以下模式:\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e [your file name parameter]\u0026nbsp;- 這是實際的文件的上載。在這個例子中是 \"myFile\"\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e [your file name parameter]ContentType\u0026nbsp;- 這是被上傳的文件,該文件的內容類型。在這個例子中是 \"myFileContentType\"\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e [your file name parameter]FileName\u0026nbsp;- 這是被上傳的文件的名稱。在這個例子中是 \"myFileFileName\"\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e 這三個參數是爲我們提供的,這要歸功於Struts的攔截器。所有我們需要做的是在我們的Action類,這些變量是自動連線我們以正確的名稱創建三個參數。所以,在上面的例子中,我們有三個參數的操作方法簡單地返回「success」,如果一切順利,否則返回「error」。\u003c/p\u003e \n\u003ch2\u003e 配置文件:\u003c/h2\u003e \n\u003cp\u003e 以下是Struts2的配置屬性可以控制文件上傳過程:\u003c/p\u003e \n\u003ctable\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003cth\u003e SN\u003c/th\u003e \n \u003cth\u003e 屬性\u0026amp; 描述\u003c/th\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 1\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003estruts.multipart.maxSize\u003c/b\u003e\u003cbr\u003e The maximum size (in bytes) of a file to be accepted as a file upload. Default is 250M.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 2\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003estruts.multipart.parser\u003c/b\u003e\u003cbr\u003e The library used to upload the multipart form. By default is\u0026nbsp;\u003cb\u003ejakarta\u003c/b\u003e\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 3\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003estruts.multipart.saveDir\u003c/b\u003e\u003cbr\u003e The location to store the temporary file. By default is javax.servlet.context.tempdir.\u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n\u003c/table\u003e \n\u003cp\u003e 爲了改變這些設置,可以使用恆定的標籤在應用程序 struts.xml文件,像我一樣改變要上傳的文件的最大大小。讓我們有我們的在struts.xml如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.multipart.maxSize\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"1000000\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"upload\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.uploadFile\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/success.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"error\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/error.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 由於FileUpload攔截器是攔截器defaultStack的一部分,我們並不需要明確地配置。但可以添加\u0026lt;interceptor-ref\u0026gt;標籤到\u0026lt;action\u0026gt;裏面。文件上傳攔截器需要兩個參數:(a)maximumSize及(b)allowedTypes。maximumSize參數設置允許的最大文件大小(默認爲約2MB)。allowedTypes參數接受的內容是一個逗號分隔的列表(MIME)類型,如下所示:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"upload\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.uploadFile\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;interceptor-ref\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"basicStack\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;interceptor-ref\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"fileUpload\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"allowedTypes\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eimage/jpeg,image/gif\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/interceptor-ref\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/success.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"error\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/error.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 以下是web.xml文件中的內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 現在右鍵點擊項目名稱,並單擊\u0026nbsp;Export \u0026gt; WAR File\u0026nbsp;創建一個WAR文件。然後部署此WAR在Tomcat 的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/upload.jsp。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"File Upload\" src=\"https://asset.1ju.org/cmsstatic/struts2-13.jpg\"\u003e \n\u003cp\u003e 現在選擇一個文件的「Contacts.txt」使用「瀏覽」按鈕,然後點擊上傳按鈕,將文件上傳,應該看到頁面。可以檢查上傳的文件保存在\u0026nbsp;C:apache-tomcat-6.0.33work.\u003c/p\u003e \n\u003cimg alt=\"File Upload Result\" src=\"https://asset.1ju.org/cmsstatic/struts2-14.jpg\"\u003e \n\u003cp\u003e 請注意,使用FileUpload攔截刪除上傳的文件自動所以需要編程在一些位置上保存上傳的文件被刪除之前。\u003c/p\u003e \n\u003ch2\u003e 錯誤消息:\u003c/h2\u003e \n\u003cp\u003e fileUplaod攔截器使用幾個默認的錯誤消息鍵:\u003c/p\u003e \n\u003ctable\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003cth\u003e SN\u003c/th\u003e \n \u003cth\u003e 錯誤消息鍵 \u0026amp; 描述\u003c/th\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 1\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003estruts.messages.error.uploading\u003c/b\u003e\u003cbr\u003e A general error that occurs when the file could not be uploaded.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 2\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003estruts.messages.error.file.too.large\u003c/b\u003e\u003cbr\u003e Occurs when the uploaded file is too large as specified by maximumSize.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 3\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003estruts.messages.error.content.type.not.allowed\u003c/b\u003e\u003cbr\u003e Occurs when the uploaded file does not match the expected content types specified.\u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n\u003c/table\u003e \n\u003cp\u003e You can override the text of these messages in\u0026nbsp;\u003cb\u003eWebContent/WEB-INF/classes/messages.properties\u003c/b\u003eresource files.\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"1c:T66cc,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 本章將教如何使用Struts 2的簡單的步驟來訪問數據庫。 Struts是一個MVC框架,而不是一個數據庫框架,但它提供了極好的支持JPA/ Hibernate集成。我們將看看在的Hibernate集成在後面的章節,但在這一章中,我們將使用純JDBC來訪問數據庫。\u003c/p\u003e \n\u003cp\u003e 在這一章中的第一個步驟是設置我們的數據庫。我作爲我的數據庫在這個例子中使用MySQL。在機器上安裝MySQL,我創建了一個新的數據庫稱爲「struts_tutorial」。創建了一個表稱爲 login,填充了一些值。下面是使用的腳本來創建和填充表。\u003c/p\u003e \n\u003cp\u003e MYSQL數據庫默認的用戶名「root」和密碼爲:「root123」\u0026nbsp;\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003eCREATE TABLE \u003c/span\u003e\u003cspan class=\"str\"\u003e`struts_tutorial`\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"str\"\u003e`login`\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"str\"\u003e`user`\u003c/span\u003e\u003cspan class=\"pln\"\u003e VARCHAR\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"lit\"\u003e10\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e NOT NULL \u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"str\"\u003e`password`\u003c/span\u003e\u003cspan class=\"pln\"\u003e VARCHAR\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"lit\"\u003e10\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e NOT NULL \u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"str\"\u003e`name`\u003c/span\u003e\u003cspan class=\"pln\"\u003e VARCHAR\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"lit\"\u003e20\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e NOT NULL \u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n PRIMARY KEY \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e`user`\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e ENGINE \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eInnoDB\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\nINSERT INTO \u003c/span\u003e\u003cspan class=\"str\"\u003e`struts_tutorial`\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"str\"\u003e`login`\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e`user`\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e`password`\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e`name`\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n VALUES \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e'scott'\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e'navy'\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e'Scott Burgemott'\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 下一步是下載\u0026nbsp;\u003ca href=\"http://dev.mysql.com/downloads/connector/j/5.1.htmll\"\u003eMySQL Connector\u003c/a\u003e\u0026nbsp;jar文件,並把這個文件的WEB-INF lib文件夾下。之後,已經做到了這一點,我們現在準備創建的動作類。\u0026nbsp;\u003c/p\u003e \n\u003ch2\u003e 創建動作:\u003c/h2\u003e \n\u003cp\u003e 動作類對應的數據庫表中的列的屬性。我們有字符串屬性的用戶名,密碼和名稱。在操作方法,我們使用用戶和密碼參數,以檢查用戶是否存在,如果存在,我們在下一個畫面中顯示的用戶名。如果用戶輸入了錯誤的信息,我們把他們再次到登錄屏幕。以下是LoginAction.java文件的內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esql\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eConnection\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esql\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eDriverManager\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esql\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003ePreparedStatement\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esql\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eResultSet\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eLoginAction\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e user\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e password\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e ret \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e ERROR\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eConnection\u003c/span\u003e\u003cspan class=\"pln\"\u003e conn \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enull\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003etry\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e URL \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"jdbc:mysql://localhost/struts_tutorial\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eClass\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eforName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"com.mysql.jdbc.Driver\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n conn \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eDriverManager\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egetConnection\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003eURL\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"root\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"root123\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e sql \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"SELECT name FROM login WHERE\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n sql\u003c/span\u003e\u003cspan class=\"pun\"\u003e+=\u003c/span\u003e\u003cspan class=\"str\"\u003e\" user = ? AND password = ?\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003ePreparedStatement\u003c/span\u003e\u003cspan class=\"pln\"\u003e ps \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e conn\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eprepareStatement\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003esql\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n ps\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esetString\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"lit\"\u003e1\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e user\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n ps\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esetString\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"lit\"\u003e2\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e password\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eResultSet\u003c/span\u003e\u003cspan class=\"pln\"\u003e rs \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e ps\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eexecuteQuery\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ewhile\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003ers\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"kwd\"\u003enext\u003c/span\u003e\u003cspan class=\"pun\"\u003e())\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n name \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e rs\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egetString\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"lit\"\u003e1\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n ret \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ecatch\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e e\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n ret \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e ERROR\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003efinally\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eif\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003econn \u003c/span\u003e\u003cspan class=\"pun\"\u003e!=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enull\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003etry\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n conn\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eclose\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ecatch\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e e\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e ret\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getUser\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e user\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setUser\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e user\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003euser \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e user\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getPassword\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e password\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setPassword\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e password\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003epassword \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e password\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建頁面:\u003c/h2\u003e \n\u003cp\u003e 現在,讓我們創建一個JSP文件index.jsp的收集用戶名和密碼。此用戶名和密碼對數據庫進行檢查。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\npageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eLogin\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;form\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"loginaction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"post\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n User:\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;br/\u0026gt;\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"text\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"user\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Password:\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;br/\u0026gt;\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"password\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"password\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"submit\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Login\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\t\t\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建視圖:\u003c/h2\u003e \n\u003cp\u003e 現在,讓我們一起創造的success.jsp文件將被調用的情況下動作返回SUCCESS,但在發生錯誤ERROR\u0026nbsp;的情況下,我們將有另一種觀點認爲文件是從操作返回。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eSuccessful Login\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Hello World, \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 下面將是在一個錯誤的情況下,從動作返回視圖文件error.jsp。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eInvalid User Name or Password\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Wrong user name or password provided.\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 配置文件:\u003c/h2\u003e \n\u003cp\u003e 最後,讓我們一起使用struts.xml 配置文件如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"loginaction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.LoginAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/success.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"error\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/error.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 以下是web.xml文件中的內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 現在,右鍵點擊項目名稱,並單擊Export \u0026gt; WAR File創建一個WAR文件。然後部署此WAR在Tomcat 的 webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Database User ID and Password\" src=\"https://asset.1ju.org/cmsstatic/struts2-mysql-1.jpg\"\u003e \n\u003cp\u003e 輸入了錯誤的用戶名和密碼。應該看到頁面如下:\u003c/p\u003e \n\u003cimg alt=\"Database Error Result\" src=\"https://asset.1ju.org/cmsstatic/struts2-mysql-2.jpg\"\u003e \n\u003cp\u003e 現在進入\u003cb\u003escott\u003c/b\u003e\u0026nbsp;用戶名和密碼爲\u0026nbsp;\u003cb\u003enavy\u003c/b\u003e\u0026nbsp;。應該看到頁面如下:\u003c/p\u003e \n\u003cimg alt=\"Database Success Result\" src=\"https://asset.1ju.org/cmsstatic/struts2-mysql-3.jpg\"\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"1d:T7f30,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 本章將教你如何使用Struts2 的應用程序發送電子郵件。對於此練習中,需要下載並安裝將mail.jar 從 JavaMail API1.4.4,並將 mail.jar文件放置在WEB-INFlib文件夾,然後繼續遵循的標準步驟創建動作,視圖和配置文件。\u003c/p\u003e \n\u003ch2\u003e 創建動作:\u003c/h2\u003e \n\u003cp\u003e 下一步是創建一個Action方法,發送電子郵件。讓我們創建一個新類稱爲 Emailer.java 以下內容。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eProperties\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e javax\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003email\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eMessage\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e javax\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003email\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003ePasswordAuthentication\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e javax\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003email\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eSession\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e javax\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003email\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eTransport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e javax\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003email\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003einternet\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eInternetAddress\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e javax\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003email\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003einternet\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eMimeMessage\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmailer\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003efrom\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e password\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e to\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e subject\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e body\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003estatic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eProperties\u003c/span\u003e\u003cspan class=\"pln\"\u003e properties \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eProperties\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003estatic\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n properties\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eput\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"mail.smtp.host\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"smtp.gmail.com\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n properties\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eput\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"mail.smtp.socketFactory.port\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"465\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n properties\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eput\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"mail.smtp.socketFactory.class\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"str\"\u003e\"javax.net.ssl.SSLSocketFactory\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n properties\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eput\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"mail.smtp.auth\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n properties\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eput\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"mail.smtp.port\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"465\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e ret \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003etry\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eSession\u003c/span\u003e\u003cspan class=\"pln\"\u003e session \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eSession\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egetDefaultInstance\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003eproperties\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e javax\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003email\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eAuthenticator\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprotected\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003ePasswordAuthentication\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n getPasswordAuthentication\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003ePasswordAuthentication\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003efrom\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e password\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}});\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eMessage\u003c/span\u003e\u003cspan class=\"pln\"\u003e message \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eMimeMessage\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003esession\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n message\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esetFrom\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eInternetAddress\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003efrom\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n message\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esetRecipients\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eMessage\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eRecipientType\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eTO\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eInternetAddress\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eparse\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003eto\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n message\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esetSubject\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003esubject\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n message\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esetText\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003ebody\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eTransport\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esend\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003emessage\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ecatch\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e e\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n ret \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e ERROR\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n e\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eprintStackTrace\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e ret\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getFrom\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003efrom\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setFrom\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003efrom\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"kwd\"\u003efrom\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003efrom\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getPassword\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e password\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setPassword\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e password\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003epassword \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e password\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getTo\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e to\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setTo\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e to\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eto \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e to\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getSubject\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e subject\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setSubject\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e subject\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esubject \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e subject\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getBody\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e body\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setBody\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e body\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ebody \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e body\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003estatic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eProperties\u003c/span\u003e\u003cspan class=\"pln\"\u003e getProperties\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e properties\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003estatic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setProperties\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eProperties\u003c/span\u003e\u003cspan class=\"pln\"\u003e properties\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmailer\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eproperties \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e properties\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 可以看到在上面的源代碼中,Emailer.java有對應的形式在下面給出的email.jsp頁的屬性的屬性。這些屬性\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e from\u0026nbsp;- 發件人的電子郵件地址。由於我們使用的是谷歌的SMTP,我們需要一個有效的gtalk ID\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e password\u0026nbsp;- 上述帳戶的密碼\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e to\u0026nbsp;- 給誰發送電子郵件?\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e Subject\u0026nbsp;- 電子郵件主題\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e body\u0026nbsp;- 實際的電子郵件消息\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e 我們有沒有考慮過上述各個屬性的任何驗證,驗證將被添加在下一章。現在讓我們看看在execute()方法。 execute()方法使用使用javax郵件庫發送一封電子郵件,使用提供的參數。如果郵件被髮送,動作返回 SUCCESS,否則它返回ERROR。\u003c/p\u003e \n\u003ch2\u003e 創建主頁頁:\u003c/h2\u003e \n\u003cp\u003e 讓我們編寫主頁index.jsp的JSP文件,這將被用來收集電子郵件的相關信息,上面提到的:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n pageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmail Form\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;em\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eThe form below uses Google's SMTP server. \r\n So you need to enter a gmail username and password\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/em\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;form\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"emailer\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"post\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;label\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003efor\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"from\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eFrom\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/label\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"text\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"from\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;label\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003efor\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"password\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003ePassword\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/label\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"password\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"password\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;label\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003efor\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"to\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eTo\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/label\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"text\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"to\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;label\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003efor\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"subject\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eSubject\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/label\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"text\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"subject\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;label\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003efor\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"body\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eBody\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/label\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"text\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"body\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"submit\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Send Email\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建視圖:\u003c/h2\u003e \n\u003cp\u003e 我們將使用JSP文件的success.jsp將被調用的情況下行動返回SUCCESS,但在發生ERROR\u0026nbsp;的情況下,我們將有另一種視圖認爲文件是從操作返回。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\tpageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmail Success\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Your email to \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"to\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e was sent successfully.\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 下面將是在一個錯誤的情況下,從動作返回視圖文件error.jsp。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\tpageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmail Error\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n There is a problem sending your email to \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"to\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e.\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 配置文件:\u003c/h2\u003e \n\u003cp\u003e 現在,讓我們將這一切組合起來使用struts.xml的配置文件如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"emailer\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.Emailer\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/success.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"error\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/error.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 以下是web.xml文件中的內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 現在,右鍵點擊項目名稱,並單擊\u0026nbsp;Export \u0026gt; WAR File創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給出以下畫面:\u0026nbsp;\u003c/p\u003e \n\u003cimg alt=\"Email User Input\" src=\"https://asset.1ju.org/cmsstatic/struts2-email-1.jpg\"\u003e \n\u003cp\u003e 輸入所需信息,並單擊「Send Email\u0026nbsp;」按鈕。如果一切順利,那麼應該看到以下頁面:\u003c/p\u003e \n\u003cimg alt=\"Email Successful\" src=\"https://asset.1ju.org/cmsstatic/struts2-email-2.jpg\"\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"1e:T69b3,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 現在,我們將看看如何的Struts驗證框架。在Struts的核心有驗證框架,協助應用程序的運行規則來執行驗證執行之前的操作方法。\u003c/p\u003e \n\u003cp\u003e 通常是使用Javascript來實現客戶端驗證。但不應單獨依賴於客戶端驗證。最佳實踐表明,驗證應引入各級應用程序框架。現在,讓我們來看看兩種方式添加驗證我們的Struts項目。\u003c/p\u003e \n\u003cp\u003e 在這裏,我們將採取一個例子,Employee\u0026nbsp;將被捕獲的姓名和年齡使用一個簡單的頁面,我們將會把兩個驗證,以確保使用總是進入一個名字和年齡應該是在28和65之間。所以,讓我們先從主JSP頁面的例子。\u003c/p\u003e \n\u003ch2\u003e 創建主頁面:\u003c/h2\u003e \n\u003cp\u003e 讓我們寫主JSP頁面文件的index.jsp,這將被用來收集上述員工的相關信息。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n pageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmployee Form\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:form\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"empinfo\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"post\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:textfield\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Name\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003esize\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"20\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:textfield\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"age\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Age\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003esize\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"20\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:submit\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"submit\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Submit\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ealign\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"center\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在index.jsp使用Struts的標籤,我們還沒有涉及,但我們將研究這些標籤相關的章節。但現在,假設\u0026nbsp;s:textfield\u0026nbsp;標籤打印一個輸入字段s:submit打印一個提交按鈕。我們已經使用label屬性標籤,每個標籤每個標籤創建。\u0026nbsp;\u003c/p\u003e \n\u003ch2\u003e 創建視圖:\u003c/h2\u003e \n\u003cp\u003e 我們將使用JSP文件的success.jsp將調用的情況下定義的動作返回SUCCESS。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\tpageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eSuccess\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Employee Information is captured successfully.\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建動作:\u003c/h2\u003e \n\u003cp\u003e 因此,讓我們定義一個小小的動作類Employee,然後添加一個方法稱爲validate(),如下所示在Employee.java文件。請確保操作類擴展ActionSupport類,否則validate方法將不會被執行。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e getAge\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setAge\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eage \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e validate\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eif\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e==\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enull\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e||\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003etrim\u003c/span\u003e\u003cspan class=\"pun\"\u003e().\u003c/span\u003e\u003cspan class=\"pln\"\u003eequals\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e))\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n addFieldError\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"The name is required\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eif\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003eage \u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"lit\"\u003e28\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e||\u003c/span\u003e\u003cspan class=\"pln\"\u003e age \u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"lit\"\u003e65\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n addFieldError\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"age\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Age must be in between 28 and 65\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 如在上面的例子所示,「Name」字段的驗證方法檢查是否有一個值,或不。如果沒有值已經提供,我們添加一個帶有自定義錯誤消息「Age」字段的字段錯誤。其次,我們檢查,如果輸入的值是在28和65之間或不爲「Age」字段,如果這個條件不符合我們以上驗證字段添加一個錯誤。\u003c/p\u003e \n\u003ch2\u003e 配置文件:\u003c/h2\u003e \n\u003cp\u003e 最後,讓我們把所有東西一起使用struts.xml的配置文件如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"empinfo\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.Employee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"input\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/index.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/success.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 以下是web.xml文件中的內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 現在,右鍵點擊項目名稱,並單擊Export \u0026gt; WAR File創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Email User Input\" src=\"https://asset.1ju.org/cmsstatic/struts2-email-1.jpg\"\u003e \n\u003cp\u003e 現在不輸入任何所需信息,只需點擊「Submit\u0026nbsp;」按鈕。將看到以下結果:\u003c/p\u003e \n\u003cimg alt=\"Error\" src=\"https://asset.1ju.org/cmsstatic/struts2-15.jpg\"\u003e \n\u003cp\u003e 輸入所需的信息,但輸入了錯誤的From字段,讓我們說「test」和年齡爲30,最後點擊「Submit\u0026nbsp;」按鈕。將看到以下結果:\u003c/p\u003e \n\u003cimg alt=\"Success\" src=\"https://asset.1ju.org/cmsstatic/struts2-16.jpg\"\u003e \n\u003ch2\u003e 此驗證是如何工作的?\u003c/h2\u003e \n\u003cp\u003e 當用戶按下提交按鈕時,Struts2會自動執行的驗證方法,如果任何一個if語句裏面的方法列出,Struts 2調用addFieldError方法。如果有任何錯誤已加入Struts 2將不會進行調用execute方法。而Struts 2框架將返回輸入作爲調用該行動的結果。\u003c/p\u003e \n\u003cp\u003e 因此,驗證失敗時Struts2返回輸入,Struts 2框架將重新顯示index.jsp文件。因爲我們使用了Struts 2的表單標籤,Struts2中會自動添加錯誤消息,只是上面的形式提交。\u003c/p\u003e \n\u003cp\u003e 這些錯誤消息是我們addFieldError方法調用中指定的。addFieldError方法有兩個參數。首先是表單字段名錯誤,第二個是錯誤信息,上面顯示該表單字段。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003eaddFieldError\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"The name is required\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 要處理的返回值輸入,我們需要添加以下的結果,以我們的動作節點在struts.xml。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"input\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/index.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 基於XML的驗證:\u003c/h2\u003e \n\u003cp\u003e 在進行驗證的第二個方法是通過將一個xml文件的動作類。Struts2的基於XML驗證的驗證提供了更多的選擇,如電子郵件驗證,整數範圍驗證,表單驗證字段,表達式驗證,正則表達式驗證,需要驗證,驗證所需的字符串,字符串長度的驗證等。\u003c/p\u003e \n\u003cp\u003e XML文件需要被命名爲'[action-class]'-validation.xml。所以,在我們的例子中,我們創建一個文件,名爲\u0026nbsp;Employee-validation.xml包含以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE validators PUBLIC \r\n\"-//OpenSymphony Group//XWork Validator 1.0.2//EN\"\r\n\"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;validators\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;field\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;field-validator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"required\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n The name is required.\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field-validator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;field\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"age\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;field-validator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"int\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"min\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e29\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"max\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e64\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Age must be in between 28 and 65\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field-validator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/validators\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 上面的XML文件會被保存在CLASSPATH 沿着類文件。讓我們有我們的僱員動作類沒有validate()方法如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e getAge\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setAge\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eage \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 其餘的設置將保持,因爲它是我前面的例子,現在,如果運行應用程序,它會產生相同的結果是什麼,我們在前面的例子:\u003c/p\u003e \n\u003cp\u003e xml文件來存儲配置的優點是允許的驗證從應用程序代碼的分離。可以讓開發人員編寫的代碼和業務分析師建立驗證xml文件。要注意的是另一件事是默認提供的驗證類型。有大量的驗證,默認情況下,使用Struts。常見的驗證包括驗證日期,正則表達式驗證字符串長度的驗證。檢查以下鏈接更多細節\u0026nbsp;Struts - 基於XML的校驗.\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"1f:T2c7c,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 以下是的各類字段級和非字段級驗證在Struts2列表:\u003c/p\u003e \n\u003ch2\u003e date validator:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;field\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"birthday\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;field-validator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"date\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"min\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e01/01/1990\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"max\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e01/01/2000\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Birthday must be within ${min} and ${max}\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field-validator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e double validator:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;field\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"percentage\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;field-validator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"double\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"minExclusive\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e0.123\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"maxExclusive\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e99.98\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Percentage needs to be between ${minExclusive}\r\n ${maxExclusive} (exclusive)\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field-validator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e email validator:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;field\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myEmail\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;field-validator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"email\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Must provide a valid email\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field-validator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e expression validator:\u003c/h2\u003e \n\u003cp\u003e 非現場級驗證,驗證基於正則表達式提供。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;field-validator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"expression\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"expression\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e....\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Failed to meet Ognl Expression .... \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field-validator\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e int validator:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;field\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"age\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;field-validator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"int\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"min\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e5\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"max\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e50\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Age needs to be between ${min} and ${max}\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field-validator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e regex validator:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;field\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myStrangePostcode\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;field-validator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"regex\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"fieldName\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003emyStrangePostcode\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"expression\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u0026lt;![CDATA[([aAbBcCdD][123][eEfFgG][456])]]\u0026gt;\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field-validator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e required validator:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;field\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"username\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;field-validator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"required\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n username must not be null\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field-validator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e requiredstring validator:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;field\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"username\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;field-validator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"requiredstring\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"trim\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003etrue\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n username must not be null\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field-validator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e stringlength validator:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;field\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"username\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;field-validator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"stringlength\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"minLength\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e10\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"maxLength\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e10\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"trim\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003etrue\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Your username needs to be 10 characters long\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field-validator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e url validator:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;field-validator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"url\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"fieldName\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003emyHomePageURL\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Invalid homepage url\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field-validator\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"20:T750a,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 國際化(i18n)是規劃和實施的產品和服務,使他們能很容易地適應特定的本地語言和文化的過程中,這個過程被稱爲本地化。國際化的過程有時也被稱爲翻譯或本地化啓用。國際化是縮寫i18n,因爲我和兩端用n字打頭,並有18個字符之間的第i個和最後n。\u003c/p\u003e \n\u003cp\u003e Struts2提供本地化,即,國際化(i18n)支持,通過資源包,攔截器和標籤庫在以下地方:\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e UI 標籤\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 消息和錯誤\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 動作類\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003ch2\u003e 資源包:\u003c/h2\u003e \n\u003cp\u003e Struts2 使用資源包來提供Web應用程序的用戶多語言和區域選項。不必擔心在不同的語言編寫的網頁。所有必須做的是創造一個資源包爲每個想要的語言。資源包將包含標題,消息和其他文本的語言用戶。資源包的文件,該文件包含鍵/值對您的應用程序的默認語言。\u003c/p\u003e \n\u003cp\u003e 簡單的命名格式的資源文件是:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003ebundlename_language_country\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eproperties\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 這裏,軟件包可以ActionClass,接口,超類,型號,封裝,全球資源屬性。接下來的部分\u0026nbsp;language_country\u0026nbsp;,En_US的等在這裏,可以跳過這是可選的全國部分區域表示es_ES和英語(美國),西班牙語(西班牙)表示語言環境的語言環境,例如代表國家。\u0026nbsp;\u003c/p\u003e \n\u003cp\u003e 當引用消息元素,其關鍵,按照下列順序進行相應的消息包的Struts框架搜索:\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e ActionClass.properties\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e Interface.properties\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e SuperClass.properties\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e model.properties\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e package.properties\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e struts.properties\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e global.properties\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e 多語言開發應用程序,就必須保持相應的到那些語言/區域設置多個屬性文件定義的鍵/值對中的所有內容。例如,如果要開發應用程序(默認)爲美國英語,西班牙語,和法語就必須創建三個屬性文件。在這裏,我將使用只global.properties文件,你可以利用不同的屬性文件來隔離不同類型的消息。\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e global.properties:\u0026nbsp;默認情況下,英語(美國)將被應用\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e global_fr.properties:\u0026nbsp;這將是法語環境中使用。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e global_es.properties:\u0026nbsp;這將被用於西班牙語言環境。\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003ch2\u003e 訪問消息:\u003c/h2\u003e \n\u003cp\u003e 有幾種方法可以訪問的信息資源,包括gettext的,文本標籤,UI標籤的關鍵屬性,國際化標籤。讓我們來看看他們簡單:\u003c/p\u003e \n\u003cp\u003e 要顯示i18n的文本,使用的調用屬性標記gettext,或其他任何標記,例如UI標籤如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"getText('some.key')\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 文本標記檢索從默認的資源包,即一個消息 struts.properties\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;s:text\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"some.key\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e i18n標籤推值棧上的任意資源束。 i18n標籤範圍內的其他標籤可以顯示該資源包的消息:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;s:i18n\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"some.package.bundle\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:text\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"some.key\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:i18n\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 大多數UI標籤的鍵屬性,可以用來檢索的消息,從一個資源包:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;s:textfield\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ekey\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"some.key\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"textfieldName\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e Localization 例子:\u003c/h2\u003e \n\u003cp\u003e 創建的index.jsp從前一章到多種語言。相同的文件將被寫入,如下所示:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n pageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmployee Form with Multilingual Support\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;h1\u0026gt;\u0026lt;s:text\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"global.heading\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;/h1\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:url\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"indexEN\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003enamespace\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"/\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"locale\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"request_locale\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003een\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:url\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:url\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"indexES\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003enamespace\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"/\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"locale\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"request_locale\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003ees\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:url\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:url\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"indexFR\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003enamespace\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"/\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"locale\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"request_locale\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003efr\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:url\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:a\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ehref\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{indexEN}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEnglish\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:a\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:a\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ehref\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{indexES}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eSpanish\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:a\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:a\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ehref\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{indexFR}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eFrance\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:a\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:form\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"empinfo\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"post\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003enamespace\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"/\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:textfield\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ekey\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"global.name\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003esize\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"20\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:textfield\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"age\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ekey\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"global.age\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003esize\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"20\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:submit\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"submit\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ekey\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"global.submit\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 我們將創建的success.jsp文件,該文件將被調用的情況下定義的動作返回SUCCESS。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\tpageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eSuccess\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"getText('global.success')\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在這裏,我們需要創建兩個動作。 (一)第一個動作一個Locale和照顧,用不同的語言顯示相同的index.jsp文件(二)另一項行動是爲了照顧提交表單本身。的動作都將返回SUCCESS,但我們會採取不同的動作,返回值的基礎上,因爲我們的目的是不同的兩個動作:\u003c/p\u003e \n\u003ch3\u003e 動作處理locale:\u003c/h3\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eLocale\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch3\u003e 提交表單處理動作:\u003c/h3\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e getAge\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setAge\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eage \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 現在。讓我們創建以下三個global.properties文件放在CLASSPATH中:\u003c/p\u003e \n\u003ch3\u003e GLOBAL.PROPERTIES:\u003c/h3\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003eglobal\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eName\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eglobal\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eage \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eAge\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eglobal\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esubmit \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eSubmit\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eglobal\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eheading \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eSelect\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eLocale\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eglobal\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esuccess \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eSuccessfully\u003c/span\u003e\u003cspan class=\"pln\"\u003e authenticated\u003c/span\u003e\u003c/pre\u003e \n\u003ch3\u003e GLOBAL_FR.PROPERTIES:\u003c/h3\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003eglobal\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eNom\u003c/span\u003e\u003cspan class=\"pln\"\u003e d\u003c/span\u003e\u003cspan class=\"str\"\u003e'utilisateur \r\nglobal.age = l'\u003c/span\u003e\u003cspan class=\"pun\"\u003eâ\u003c/span\u003e\u003cspan class=\"pln\"\u003ege\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eglobal\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esubmit \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eSoumettre\u003c/span\u003e\u003cspan class=\"pln\"\u003e des\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eglobal\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eheading \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e S\u003c/span\u003e\u003cspan class=\"pun\"\u003eé\u003c/span\u003e\u003cspan class=\"pln\"\u003e lectionnez \u003c/span\u003e\u003cspan class=\"typ\"\u003eLocal\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eglobal\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esuccess \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eAuthentifi\u003c/span\u003e\u003cspan class=\"pln\"\u003e\t\u003c/span\u003e\u003cspan class=\"pun\"\u003eé\u003c/span\u003e\u003cspan class=\"pln\"\u003e avec succ\u003c/span\u003e\u003cspan class=\"pun\"\u003eè\u003c/span\u003e\u003cspan class=\"pln\"\u003es\u003c/span\u003e\u003c/pre\u003e \n\u003ch3\u003e GLOBAL_ES.PROPERTIES:\u003c/h3\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003eglobal\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eNombre\u003c/span\u003e\u003cspan class=\"pln\"\u003e de usuario\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eglobal\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eage \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEdad\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eglobal\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esubmit \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003ePresentar\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eglobal\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eheading \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e seleccionar la configuracion regional\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eglobal\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esuccess \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eAutenticado\u003c/span\u003e\u003cspan class=\"pln\"\u003e correctamente\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 我們將創建struts.xml中兩個動作如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.custom.i18n.resources\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"global\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003enamespace\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"/\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"empinfo\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.Employee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"input\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/index.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/success.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"locale\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.Locale\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/index.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 以下是web.xml文件中的內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 現在,右鍵點擊項目名稱,並單擊\u0026nbsp;Export \u0026gt; WAR File創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"English Output\" src=\"https://asset.1ju.org/cmsstatic/i18n-1.gif\"\u003e \n\u003cp\u003e 現在選擇的任何一種語言,讓我們說,我們選擇西班牙語,這將顯示以下結果:\u003c/p\u003e \n\u003cimg alt=\"Spanish Output\" src=\"https://asset.1ju.org/cmsstatic/i18n-2.gif\"\u003e \n\u003cp\u003e 您可以嘗試用法語。最後,讓我們嘗試點擊「\u003cb\u003eSubmit\u003c/b\u003e\u0026nbsp;」按鈕,當我們在西班牙語言,它會顯示以下畫面:\u0026nbsp;\u003c/p\u003e \n\u003cimg alt=\"Spanish Success\" src=\"https://asset.1ju.org/cmsstatic/i18n-3.gif\"\u003e \n\u003cp\u003e 恭喜你,現在有一個多語種的網頁,可以在全球範圍內啓動您的網站。\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"21:T4a99,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 在HTTP請求中的一切都被視爲一個String由協議。這包括數字,布爾值,整數,日期,小數和一切。每一件事情是一個字符串,將根據HTTP。然而,Struts類可以有任何數據類型的屬性。Struts的自動裝配屬性?\u003c/p\u003e \n\u003cp\u003e Struts使用了多種類型轉換器在幕後做繁重。例如,如果Action類的屬性有一個整數,Struts的自動轉換請求參數的整數屬性沒有做任何事情。默認情況下,Struts的一些類型轉換器。下面列出了他們中的一些,如果您正在使用其中任何一個,那麼你有什麼可擔心的:\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e Integer, Float, Double, Decimal\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e Date and Datetime\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e Arrays and Collections\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e Enumerations\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e Boolean\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e BigDecimal\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e 有些時候,當使用自己的數據類型,它是需要添加自己的轉換,使Struts知道如何將這些值,然後顯示。考慮以下POJO類Environment.java。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 這是一個非常簡單的類,它有一個名爲name的屬性,所以沒有什麼特別的關於這個類。我們創建包含有關係統 - SystemDetails.java信息另一個類。目的是練習,我有硬編碼環境,以「開發」在操作系統「Windows XP SP3」。在實際項目中,會從系統配置得到信息。因此,讓我們有以下動作類:\u0026nbsp;\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eSystemDetails\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pln\"\u003e environment \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Development\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e operatingSystem \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"Windows XP SP3\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pln\"\u003e getEnvironment\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e environment\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setEnvironment\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pln\"\u003e environment\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eenvironment \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e environment\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getOperatingSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e operatingSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setOperatingSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e operatingSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eoperatingSystem \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e operatingSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 接下來讓我們創建一個簡單的JSP文件System.jsp顯示環境和操作系統信息。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\npageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eSystem Details\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Environment: \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"environment\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Operating System:\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"operatingSystem\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 讓我們編寫 system.jsp,SystemDetails.java類在struts.xml一起使用。 SystemDetails類有一個簡單的execute()方法返回字符串「SUCCESS」。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"system\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.SystemDetails\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/System.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊\u0026nbsp;Export \u0026gt; WAR File\u0026nbsp;創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/system.action。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"System Info\" src=\"https://asset.1ju.org/cmsstatic/struts2-3.gif\"\u003e \n\u003cp\u003e 上面的輸出有什麼錯? Struts 知道如何顯示字符串「Windows XP SP3」等內置數據類型轉換,但它不知道用Environmenttype屬性做什麼。所以,它只是被稱爲類的toString()方法。爲了解決這個問題,現在讓我們創建並註冊一個簡單的TypeConverter環境類。創建一個類名爲EnvironmentConverter.java以下。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eMap\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e org\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eapache\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eStrutsTypeConverter\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironmentConverter\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eStrutsTypeConverter\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@Override\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eObject\u003c/span\u003e\u003cspan class=\"pln\"\u003e convertFromString\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eMap\u003c/span\u003e\u003cspan class=\"pln\"\u003e context\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pun\"\u003e[]\u003c/span\u003e\u003cspan class=\"pln\"\u003e values\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eClass\u003c/span\u003e\u003cspan class=\"pln\"\u003e clazz\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pln\"\u003e env \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003evalues\u003c/span\u003e\u003cspan class=\"pun\"\u003e[\u003c/span\u003e\u003cspan class=\"lit\"\u003e0\u003c/span\u003e\u003cspan class=\"pun\"\u003e]);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e env\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@Override\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e convertToString\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eMap\u003c/span\u003e\u003cspan class=\"pln\"\u003e context\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eObject\u003c/span\u003e\u003cspan class=\"pln\"\u003e value\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pln\"\u003e env \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e value\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e env \u003c/span\u003e\u003cspan class=\"pun\"\u003e==\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enull\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enull\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e:\u003c/span\u003e\u003cspan class=\"pln\"\u003e env\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egetName\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\t\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e EnvironmentConverter 擴展了 StrutsTypeConverter 類,如何將環境爲一個 String,反之亦然通過重寫兩個的方法 convertFromString()和 convertToString()並通知了Struts。現在,讓我們註冊這個轉換器之前,我們我們在我們的應用程序。有兩種方法來註冊一個轉換器。如果轉換器將只用於在一個特定的動作,那麼將需要創建一個屬性文件需要被命名爲\u0026nbsp;'[action-class]'-converstion.properties,所以,在我們的例子中,我們創建一個名爲SystemDetails下面的註冊 converstion.properties 輸入:\u0026nbsp;\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003ecom\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironmentConverter\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在上面的例子中,「environment」的名字是在SystemDetails.java 類的一個屬性,告訴要使用Struts EnvironmentConverter從這個屬性的轉換。但是,我們不打算這樣做,相反,我們要在全局範圍內註冊這個轉換器,因此,它可以在整個應用程序。要做到這一點,創建一個屬性文件名爲\u0026nbsp;xwork-conversion.properties 在\u0026nbsp;WEB-INF/classes文件夾下面一行:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003ecom\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironmentConverter\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 這簡單的註冊全局轉換器,這樣的Struts可以自動做轉換每次遇到一個對象類型的環境。現在,如果重新編譯並重新運行該程序,會得到更好的輸出如下:\u003c/p\u003e \n\u003cimg alt=\"System Info\" src=\"https://asset.1ju.org/cmsstatic/struts2-4.gif\"\u003e \n\u003cp\u003e 很顯然,現在的結果是更好的,這意味着我們的Struts的轉換工作正常。這是可以創建多個轉換器和按要求註冊後才能使用。\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"22:T2e4a,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 實際本章教程開始之前,讓我們看看由http://struts.apache.org給出的幾個定義:\u003c/p\u003e \n\u003ctable\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003cth\u003e Term\u003c/th\u003e \n \u003cth\u003e 描述\u003c/th\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cb\u003etag\u003c/b\u003e\u003c/td\u003e \n \u003ctd\u003e A small piece of code executed from within JSP, FreeMarker, or Velocity.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cb\u003etemplate\u003c/b\u003e\u003c/td\u003e \n \u003ctd\u003e A bit of code, usually written in FreeMarker, that can be rendered by certain tags (HTML tags).\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cb\u003etheme\u003c/b\u003e\u003c/td\u003e \n \u003ctd\u003e A collection of templates packaged together to provide common functionality.\u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n\u003c/table\u003e \n\u003cp\u003e 我也建議去通過Struts2本土化章節,因爲我們將採取同樣的例子,再次執行我們的練習。\u0026nbsp;\u003c/p\u003e \n\u003cp\u003e 當使用Struts 2 標籤如\u0026lt;s:submit...\u0026gt;,\u0026lt;s:textfield...\u0026gt;等在網頁中,Struts 2框架生成HTML代碼與預先設定的樣式和佈局。 Struts 2自帶內置的主題有三個:\u003c/p\u003e \n\u003ctable\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003cth\u003e Theme\u003c/th\u003e \n \u003cth\u003e 描述\u003c/th\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cb\u003esimple theme\u003c/b\u003e\u003c/td\u003e \n \u003ctd\u003e A minimal theme with no \"bells and whistles\". For example, the textfield tag renders the HTML \u0026lt;input/\u0026gt; tag without a label, validation, error reporting, or any other formatting or functionality.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cb\u003exhtml theme\u003c/b\u003e\u003c/td\u003e \n \u003ctd\u003e This is the default theme used by Struts 2 and provides all the basics that the simple theme provides and adds several features like standard two-column table layout for the HTML, Labels for each of the HTML, Validation and error reporting etc.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cb\u003ecss_xhtml theme\u003c/b\u003e\u003c/td\u003e \n \u003ctd\u003e This theme provides all the basics that the simple theme provides and adds several features like standard two-column CSS-based layout, using \u0026lt;div\u0026gt; for the HTML Struts Tags, Labels for each of the HTML Struts Tags, placed according to the CSS stylesheet.\u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n\u003c/table\u003e \n\u003cp\u003e 正如上面所提到的,如果不指定一個主題,然後Struts2中會使用默認的XHTML主題。例如Struts 2中選擇標籤:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;s:textfield\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Name\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 生成HTML標記:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;tr\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;td\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"tdLabel\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;label\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003efor\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"empinfo_name\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"label\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eName:\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/label\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/td\u0026gt;\u0026lt;td\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"text\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"empinfo_name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/td\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/tr\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 這裏empinfo struts.xml文件中定義動作名稱。\u003c/p\u003e \n\u003ch2\u003e 選擇主題:\u003c/h2\u003e \n\u003cp\u003e 可以指定主題Struts 2每一個標籤的基礎上或指定的主題Struts 2使用,可以使用下列方法之一:\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e 主題屬性的具體標籤\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 主題屬性標籤的周邊表單標籤\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 頁面範圍的屬性,名爲「主題」\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 請求範圍屬性名爲「主題」\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 會話作用域屬性命名爲「主題」\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 應用程序作用域的屬性命名爲「主題」\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 在struts.properties struts.ui.theme屬性(默認爲XHTML)\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e 以下語法指定他們在標籤級別,如果願意爲不同的標籤使用不同的主題:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;s:textfield\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Name\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etheme\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"xhtml\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 因爲它不是非常實用,每個標籤的基礎上使用主題,所以乾脆我們可以指定規則struts.properties文件中使用以下標籤:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"com\"\u003e# Standard UI theme\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\nstruts\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eui\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003etheme\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003exhtml\r\n\u003c/span\u003e\u003cspan class=\"com\"\u003e# Directory where theme template resides\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\nstruts\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eui\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003etemplateDir\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"kwd\"\u003etemplate\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"com\"\u003e# Sets the default template type. Either ftl, vm, or jsp\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\nstruts\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eui\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003etemplateSuffix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003eftl\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 以下的結果是,我們拿起從本地化章節裏我們使用默認設置struts.ui.theme= XHTML的struts-default.properties文件中,默認情況下,在\u0026nbsp;struts2-core.xy.z.jar文件,這是由主題。\u003c/p\u003e \n\u003cimg alt=\"English Output\" src=\"https://asset.1ju.org/cmsstatic/i18n-1.gif\"\u003e \n\u003ch2\u003e 主題如何工作的?\u003c/h2\u003e \n\u003cp\u003e 對於一個給定的主題,每一個struts標籤有關聯的模板,如:s:textfield -\u0026gt; text.ftl\u0026nbsp;和\u0026nbsp;s:password -\u0026gt; password.ftl等,這些模板文件來壓縮struts2-core.xy.z.jar文件。這些模板文件保持一個預先定義的HTML佈局爲每個標籤。所以Struts2 框架生成最終的HTML標記代碼使用Sturts標籤和相關的模板。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"typ\"\u003eStruts\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"lit\"\u003e2\u003c/span\u003e\u003cspan class=\"pln\"\u003e tags \u003c/span\u003e\u003cspan class=\"pun\"\u003e+\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eAssociated\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003etemplate\u003c/span\u003e\u003cspan class=\"pln\"\u003e file \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eFinal\u003c/span\u003e\u003cspan class=\"pln\"\u003e HTML markup code\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 默認模板已經寫在FreeMarker和他們有擴展名\u0026nbsp;.ftl。可以設計使用速度或JSP模板,並據此設置配置在使用struts.ui.templateSuffix 和 struts.ui.templateDir struts.properties。\u003c/p\u003e \n\u003ch2\u003e 創建新的主題:\u003c/h2\u003e \n\u003cp\u003e 最簡單的方法來創建一個新的主題是複製現有的任何主題/模板文件,並做必要的修改。所以,讓我們開始創建一個文件夾\u0026nbsp;WebContent/WEB-INF/classes\u0026nbsp;名爲模板和子文件夾與我們新的主題的名稱,例如WebContent/WEB-INF/classes/template/mytheme。從這裏,可以從頭開始構建模板,或者可以複製​​模板從Struts2分佈和根據需要進行修改。\u003c/p\u003e \n\u003cp\u003e 我們要修改現有的默認模板XHTML學習目的。所以,現在讓,我們複製內容從\u0026nbsp;struts2-core-x.y.z.jar/template/xhtml\u0026nbsp;到我們的主題目錄,並只修改WebContent/WEB-INF/classes/template/mytheme/control.ftl文件。當我們打開control.ftl 它將有下面幾行:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e\u0026lt;table class=\"${parameters.cssClass?default('wwFormTable')?html}\"\u0026lt;#rt/\u0026gt;\r\n\u0026lt;#if parameters.cssStyle?\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e style=\"${parameters.cssStyle?html}\"\u0026lt;#rt/\u0026gt;\r\n\u0026lt;/#if\u0026gt;\r\n\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 讓我們上述文件control.ftl改變有以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;table\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003estyle\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"\u003c/span\u003e\u003cspan class=\"pln\"\u003eborder\u003c/span\u003e\u003cspan class=\"pun\"\u003e:\u003c/span\u003e\u003cspan class=\"lit\"\u003e1px\u003c/span\u003e\u003cspan class=\"pln\"\u003e solid black\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 如果檢查看 form.ftl 會發現,control.ftl 這個文件中,form.ftl這個文件是指從XHTML主題。因此,讓我們改變如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e\u0026lt;#include \"/${parameters.templateDir}/xhtml/form-validate.ftl\" /\u0026gt;\r\n\u0026lt;#include \"/${parameters.templateDir}/simple/form-common.ftl\" /\u0026gt;\r\n\u0026lt;#if (parameters.validate?default(false))\u0026gt;\r\n onreset=\"${parameters.onreset?default('clearErrorMessages(this);\r\n clearErrorLabels(this);')}\"\r\n\u0026lt;#else\u0026gt;\r\n \u0026lt;#if parameters.onreset?\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n onreset=\"${parameters.onreset?html}\"\r\n \u0026lt;/#if\u0026gt;\r\n\u0026lt;/#if\u0026gt;\r\n\u0026gt;\r\n\u003c/span\u003e\u003cspan\u003e\u003cspan class=\"pln\"\u003e\u0026lt;#include \"/${parameters.templateDir}/mytheme/control.ftl\" /\u0026gt;\u0026nbsp;\u0026nbsp;\u003c/span\u003e\u003c/span\u003e\r\n\u003c/pre\u003e \n\u003cp\u003e 我假設不會有太多瞭解FreeMarker模板語言,仍然尋找FTL文件需要做什麼,可以得到一個不錯的主意。然而,讓我們除上述變動外,並回到我們的本地化的例子,創建\u0026nbsp;WebContent/WEB-INF/classes/struts.properties\u0026nbsp;檔案的以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"com\"\u003e# Customized them\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\nstruts\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eui\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003etheme\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003emytheme\r\n\u003c/span\u003e\u003cspan class=\"com\"\u003e# Directory where theme template resides\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\nstruts\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eui\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003etemplateDir\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"kwd\"\u003etemplate\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"com\"\u003e# Sets the template type to ftl.\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\nstruts\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eui\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003etemplateSuffix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003eftl\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 現在這種變化後,右鍵點擊項目名稱,並單擊Export \u0026gt; WAR File創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2。這會給出以下畫面:\u0026nbsp;\u003c/p\u003e \n\u003cimg alt=\"Theme and Template\" src=\"https://asset.1ju.org/cmsstatic/struts2-5.gif\"\u003e \n\u003cp\u003e XHTML主題複製後的變化,我們做了主題這是一個結果,可以看到一個表單組件周圍的邊框。 FreeMarker學習,如果你努力,那麼將能夠創建或修改主題很容易。至少現在,你必須有一個基本的瞭解Sturts2主題和模板。\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"23:T4a74,"])</script><script>self.__next_f.push([1,"\u003cp\u003e Struts提供了一個更簡單的方式來處理未捕獲的異常,並將用戶重定向到一個專門的錯誤頁面。您可以輕鬆地Struts配置到不同的異常有不同的錯誤頁面。\u003c/p\u003e \n\u003cp\u003e Struts的異常處理所使用的「exception」攔截容易。「exception」攔截器作爲默認的棧的一部分,所以不必做任何額外的配置。它可爲準備使用的盒。讓我們看到了一個簡單的Hello World示例進行一些修改在HelloWorldAction.java文件。在這裏,我們特意推出了一個空指針異常在我們HelloWorldAction動作代碼。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHelloWorldAction\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e(){\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e x \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enull\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n x \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e x\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esubstring\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"lit\"\u003e0\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 讓我們 helloWorld.jsp保持內容如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Hello World, \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 以下是內容index.jsp:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n pageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n \u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;h1\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World From Struts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/h1\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;form\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;label\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003efor\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003ePlease enter your name\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/label\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"text\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"submit\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Say Hello\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e struts.xml 應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 現在右擊項目名稱,並單擊Export \u0026gt; WAR File創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat 服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Hello World Input\" src=\"https://asset.1ju.org/cmsstatic/struts2-hello-world-3.jpg\"\u003e \n\u003cp\u003e 輸入一個值「Struts2」,並提交頁面。應該看到以下頁面:\u003c/p\u003e \n\u003cimg alt=\"Exception Output\" src=\"https://asset.1ju.org/cmsstatic/struts2-17.jpg\"\u003e \n\u003cp\u003e 在上面的例子所示,默認的異常攔截器做了非常出色的處理異常。現在,讓我們創建一個專用的錯誤頁面,我們的例外。創建一個文件名爲error.jsp 如以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\tpageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n This is my custom error page\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e Let us now configure Struts to use this this error page in case of an exception. Let us modify the\u003cb\u003estruts.xml\u003c/b\u003e\u0026nbsp;as follows:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;exception-mapping\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eexception\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"java.lang.NullPointerException\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eresult\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"error\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"error\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/Error.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在上面的例子所示,現在我們已經配置 Struts使用專用error.jsp的NullPointerException異常。如果現在重新運行該程序,現在看到下面的輸出:\u003c/p\u003e \n\u003cimg alt=\"Hello World Output\" src=\"https://asset.1ju.org/cmsstatic/struts2-18.jpg\"\u003e \n\u003cp\u003e 此外,Struts2 框架自帶的「日誌」攔截記錄異常。使記錄器記錄的未捕獲異常,我們可以很容易地看堆棧跟蹤和工作出了什麼錯誤。\u003c/p\u003e \n\u003ch2\u003e 全局異常映射:\u003c/h2\u003e \n\u003cp\u003e 我們已經看到了我們可以處理特定的異常行動。我們可以設置一個例外,全局將適用於所有的行動。例如,要捕獲 NullPointerException異常,我們可以添加\u0026lt;global-exception-mappings...\u0026gt;標籤裏面\u0026lt;package...\u0026gt;標籤和其\u0026lt;result...\u0026gt;標籤應加在\u0026lt;行動.. \u0026gt;標記在struts.xml文件如下:\u0026nbsp;\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;global-exception-mappings\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;exception-mapping\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eexception\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"java.lang.NullPointerException\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eresult\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"error\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/global-exception-mappings\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"error\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/Error.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"24:T4b0d,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 正如前面提到的,Struts提供了兩種形式的配置。傳統的方式是使用對所有配置struts.xml文件。到目前爲止,我們已經看到了這樣的例子很多。 Struts配置的另一種方法是使用Java5註釋功能。使用Struts 註解,我們可以實現零配置。\u003c/p\u003e \n\u003cp\u003e 要開始在你的項目中使用註釋,確保WebContent/WEB-INF/lib文件夾中的jar文件包括以下:\u0026nbsp;\u0026nbsp;\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e struts2-convention-plugin-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e asm-x.y.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e antlr-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e commons-fileupload-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e commons-io-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e commons-lang-x.y.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e commons-logging-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e commons-logging-api-x.y.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e freemarker-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e javassist-.xy.z.GA\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e ognl-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e struts2-core-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e xwork-core.x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e 現在,讓我們看看你如何能做到配置在struts.xml文件,取而代之的是註解。\u003c/p\u003e \n\u003cp\u003e Struts2註釋的概念的解釋,我們需要重新考慮我們的驗證爲例說明在\u0026nbsp;Struts2的驗證\u0026nbsp;一章中。\u003c/p\u003e \n\u003cp\u003e 在這裏,我們將採取一個例子,僱員Employee\u0026nbsp;將被捕獲的姓名和年齡使用一個簡單的頁面,我們將會把兩個驗證,以確保使用總是進入一個名字和年齡應該是在28和65之間。所以,讓我們先從主JSP頁面的例子。\u003c/p\u003e \n\u003ch2\u003e 創建主頁:\u003c/h2\u003e \n\u003cp\u003e 讓我們寫主JSP頁面文件index.jsp,這將被用來收集上述員工的相關信息。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n pageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmployee Form\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:form\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"empinfo\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"post\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:textfield\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Name\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003esize\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"20\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:textfield\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"age\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Age\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003esize\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"20\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:submit\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"submit\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Submit\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ealign\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"center\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在index.jsp使用Struts的標籤,我們還沒有覆蓋,但我們將研究這些標籤相關的章節。但現在,假設s:textfield\u0026nbsp;標籤打印一個輸入字段\u0026nbsp;s:submit\u0026nbsp;打印一個提交按鈕。我們已經使用label屬性標籤,每個標籤每個標籤創建。\u003c/p\u003e \n\u003ch2\u003e 創建視圖:\u003c/h2\u003e \n\u003cp\u003e 我們將使用JSP文件的success.jsp將調用的情況下定義的動作返回SUCCESS。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\tpageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eSuccess\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Employee Information is captured successfully.\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建動作:\u003c/h2\u003e \n\u003cp\u003e 這是將用於註釋的地方。讓我們重新定義行動Employee類的註釋,然後添加一個方法稱爲validate()\u0026nbsp;,如下所示在Employee.java文件。請確保操作類擴展ActionSupport類,否則validate方法將不會被執行。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e org\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eapache\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003econvention\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eannotation\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eAction\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e org\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eapache\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003econvention\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eannotation\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eResult\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e org\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eapache\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003econvention\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eannotation\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eResults\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003evalidator\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eannotations\u003c/span\u003e\u003cspan class=\"pun\"\u003e.*;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"lit\"\u003e@Results\u003c/span\u003e\u003cspan class=\"pun\"\u003e({\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@Result\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e location\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/success.jsp\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e),\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@Result\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"input\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e location\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/index.jsp\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e})\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@Action\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/empinfo\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@RequiredFieldValidator\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003e message \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"The name is required\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@IntRangeFieldValidator\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003emessage \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"Age must be in between 28 and 65\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n min \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"29\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e max \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"65\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e getAge\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setAge\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eage \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在這個例子中,我們已經使用了一些註解。讓我逐個說明:\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e 首先,我們已經Result註解。結果註解的結果是一個集合。結果註解下,我們有兩個結果註釋。結果註釋的名稱對應的執行方法的結果。它們還含有一個視圖應擔任相應的execute()\u0026nbsp;返回值的位置。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 下一個註解是行動註解。這是用來修飾\u0026nbsp;execute()方法。操作方法也需要一個值,該URL上調用操作。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 最後,使用兩個驗證的註解。已經配置了所需的字段驗證的年齡字段\"name「字段和整數範圍驗證。也指定了自定義驗證消息。\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003ch2\u003e 配置文件:\u003c/h2\u003e \n\u003cp\u003e 我們不需要struts.xml 配置文件,讓我們刪除該文件,並讓我們檢查web.xml文件中的內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;init-param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts.devMode\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param-value\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003etrue\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param-value\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/init-param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 現在,右鍵點擊項目名稱,並單擊\u0026nbsp;Export \u0026gt; WAR File創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Email User Input\" src=\"https://asset.1ju.org/cmsstatic/struts2-email-1.jpg\"\u003e \n\u003cp\u003e 現在不輸入任何所需信息,只需點擊「\u003cb\u003eSubmit\u003c/b\u003e\u0026nbsp;」按鈕。將看到以下結果:\u0026nbsp;\u003c/p\u003e \n\u003cimg alt=\"Error\" src=\"https://asset.1ju.org/cmsstatic/struts2-15.jpg\"\u003e \n\u003cp\u003e 輸入所需的信息,但輸入了錯誤的「From\u0026nbsp;」字段,讓我們說「test」和年齡爲30名,最後點擊「Submit\u0026nbsp;」按鈕。將看到以下結果:\u003c/p\u003e \n\u003cimg alt=\"Success\" src=\"https://asset.1ju.org/cmsstatic/struts2-16.jpg\"\u003e \n\u003ch2\u003e Struts 2的註釋類型:\u003c/h2\u003e \n\u003cp\u003e Struts 2 應用程序可以使用Java5註釋作爲替代XML和Java屬性配置。可以檢查最重要的註解涉及不同類別的列表:\u003c/p\u003e \n\u003cp\u003e Struts 2的註釋類型.\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"25:T815b,"])</script><script>self.__next_f.push([1,"\u003cp\u003e Struts 2 應用程序可以使用Java5註釋作爲替代XML和Java屬性配置。這裏是清單的不同的類別有關的最重要的註解:\u003c/p\u003e \n\u003ch2\u003e 命名空間註釋(動作註釋):\u003c/h2\u003e \n\u003cp\u003e @ Namespace註釋允許在Action類中,而不是基於零配置的約定動作的命名空間的定義。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"lit\"\u003e@Namespace\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/content\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e...\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 結果註釋 - (動作譯註):\u003c/h2\u003e \n\u003cp\u003e @ Result註解允許在Action類中,而不是一個XML文件中定義的動作結果。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"lit\"\u003e@Result\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e value\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/success.jsp\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e...\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 結果註釋 - (動作譯註):\u003c/h2\u003e \n\u003cp\u003e @ Results註解定義了一套動作的結果。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"lit\"\u003e@Results\u003c/span\u003e\u003cspan class=\"pun\"\u003e({\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@Result\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e value\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/success.jsp\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e),\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@Result\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"error\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e value\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/error.jsp\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e})\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e...\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 註釋後(攔截註釋):\u003c/h2\u003e \n\u003cp\u003e @After註解標誌着一個需要調用後的主要操作方法和執行結果的操作方法。返回值將被忽略。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@After\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e isValid\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eValidationException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"com\"\u003e// validate model object, throw exception if failed\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"com\"\u003e// perform secure action\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 註釋之前(攔截註釋):\u003c/h2\u003e \n\u003cp\u003e @ Before註釋標記需要一個操作方法的主要操作方法之前被調用執行結果。返回值將被忽略。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@Before\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e isAuthorized\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eAuthenticationException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"com\"\u003e// authorize request, throw exception if failed\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"com\"\u003e// perform secure action\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e BeforeResult註釋 - (攔截註釋):\u003c/h2\u003e \n\u003cp\u003e @ BeforeResult註解標誌着一個結果之前需要執行的操作方法。返回值將被忽略。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@BeforeResult\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e isValid\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eValidationException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"com\"\u003e// validate model object, throw exception if failed\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"com\"\u003e// perform action\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e ConversionErrorFieldValidator註釋 - (驗證譯註):\u003c/h2\u003e \n\u003cp\u003e 此驗證註解如果有任何轉換錯誤進行了實地檢查,並適用於他們,如果他們存在。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@ConversionErrorFieldValidator\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003emessage \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"Default message\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n key \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"i18n.key\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e shortCircuit \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003etrue\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e DateRangeFieldValidator註釋 - (驗證譯註):\u003c/h2\u003e \n\u003cp\u003e 這驗證註解檢查日期字段的值在指定範圍內。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@DateRangeFieldValidator\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003emessage \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"Default message\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n key \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"i18n.key\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e shortCircuit \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003etrue\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n min \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"2005/01/01\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e max \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"2005/12/31\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getDOB\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e dob\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e DoubleRangeFieldValidator註釋 - (驗證譯註):\u003c/h2\u003e \n\u003cp\u003e 此驗證註解檢查雙字段有一個值,該值在指定範圍內。如果既不最小或最大,什麼都不會做的。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@DoubleRangeFieldValidator\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003emessage \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"Default message\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n key \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"i18n.key\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e shortCircuit \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003etrue\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n minInclusive \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"0.123\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e maxInclusive \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"99.987\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getIncome\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e income\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e EmailValidator註釋 - (驗證譯註):\u003c/h2\u003e \n\u003cp\u003e 這驗證註解檢查一個字段是一個有效的E-mail地址,如果它包含一個非空的字符串。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@EmailValidator\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003emessage \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"Default message\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n key \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"i18n.key\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e shortCircuit \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003etrue\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getEmail\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e email\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e ExpressionValidator註釋 - (驗證譯註):\u003c/h2\u003e \n\u003cp\u003e 這種非字段級驗證驗證所提供的正則表達式。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"lit\"\u003e@ExpressionValidator\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003emessage \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"Default message\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e key \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"i18n.key\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\nshortCircuit \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003etrue\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e expression \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"an OGNL expression\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e IntRangeFieldValidator註釋 - (驗證譯註):\u003c/h2\u003e \n\u003cp\u003e 這驗證註解檢查一個數字字段的值在指定的範圍內。如果既不最小或最大,什麼都不會做的。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@IntRangeFieldValidator\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003emessage \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"Default message\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n key \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"i18n.key\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e shortCircuit \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003etrue\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n min \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"0\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e max \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"42\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getAge\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e RegexFieldValidator 註釋 - (驗證譯註):\u003c/h2\u003e \n\u003cp\u003e 這個註解驗證一個字符串字段,使用正則表達式。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"lit\"\u003e@RegexFieldValidator\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003e key \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"regex.field\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e expression \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"yourregexp\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e RequiredFieldValidator 註釋 - (驗證譯註):\u003c/h2\u003e \n\u003cp\u003e 這驗證註解檢查一個字段不爲空。標註必須被應用在方法層面。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@RequiredFieldValidator\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003emessage \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"Default message\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n key \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"i18n.key\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e shortCircuit \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003etrue\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getAge\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e RequiredStringValidator註釋 - (驗證譯註):\u003c/h2\u003e \n\u003cp\u003e 這驗證註解檢查一個字符串字段不爲空(即非空,長度\u0026gt; 0)。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@RequiredStringValidator\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003emessage \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"Default message\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n key \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"i18n.key\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e shortCircuit \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003etrue\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e trim \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003etrue\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e StringLengthFieldValidator註釋 - (驗證譯註):\u003c/h2\u003e \n\u003cp\u003e 這個驗證檢查字符串字段是合適的長度。假定該字段是一個字符串。如果設置既不是minLength\u0026nbsp;也不是最大長度,什麼都不會做。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@StringLengthFieldValidator\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003emessage \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"Default message\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n key \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"i18n.key\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e shortCircuit \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003etrue\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n trim \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003etrue\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e minLength \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"5\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e maxLength \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"12\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e UrlValidator註釋 - (驗證譯註):\u003c/h2\u003e \n\u003cp\u003e 這個驗證檢查一個字段是一個有效的URL。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@UrlValidator\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003emessage \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"Default message\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n key \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"i18n.key\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e shortCircuit \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003etrue\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getURL\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e url\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 驗證註釋 - (驗證譯註):\u003c/h2\u003e \n\u003cp\u003e 如果想使用多個相同類型的註釋,這些註釋必須嵌套在@Validations()\u0026nbsp;註釋。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@Validations\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n requiredFields \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"lit\"\u003e@RequiredFieldValidator\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003etype \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eValidatorType\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eSIMPLE\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n fieldName \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"customfield\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n message \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"You must enter a value for field.\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)},\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n requiredStrings \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"lit\"\u003e@RequiredStringValidator\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003etype \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eValidatorType\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eSIMPLE\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n fieldName \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"stringisrequired\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n message \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"You must enter a value for string.\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e CustomValidator註釋 - (驗證譯註):\u003c/h2\u003e \n\u003cp\u003e 這個註解可以用於自定義驗證。使用ValidationParameter的註釋,以提供額外的\u0026nbsp;params.\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"lit\"\u003e@CustomValidator\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003etype \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"customValidatorName\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e fieldName \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"myField\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 轉換註釋 - (類型轉換註釋):\u003c/h2\u003e \n\u003cp\u003e 這是一個標記註釋類型轉換類型級別。轉換註釋必須應用在類型級別。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"lit\"\u003e@Conversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eConversionAction\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eimplements\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eAction\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e CreateIfNull註釋 - (類型轉換註釋):\u003c/h2\u003e \n\u003cp\u003e 這個註解設置類型轉換CreateIfNull。必須應用在域或方法級CreateIfNull註解。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"lit\"\u003e@CreateIfNull\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003e value \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003etrue\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"typ\"\u003eUser\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e users\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 元素註釋 - (類型轉換註釋):\u003c/h2\u003e \n\u003cp\u003e 這個註解設置元素進行類型轉換。必須應用在字段域或方法級元素的註解。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"lit\"\u003e@Element\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003e value \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eacme\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eUser\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"typ\"\u003eUser\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e userList\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 關鍵註釋 - (類型轉換註釋):\u003c/h2\u003e \n\u003cp\u003e 這個註解設置進行類型轉換的關鍵。必須應用在域或方法級的關鍵註解。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"lit\"\u003e@Key\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003e value \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003elang\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eLong\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eMap\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"typ\"\u003eLong\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eUser\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e userMap\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e KeyProperty註釋 - (類型轉換註釋):\u003c/h2\u003e \n\u003cp\u003e 這個註解設置類型轉換KeyProperty。必須應用在域或方法級KeyProperty註解。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"lit\"\u003e@KeyProperty\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003e value \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"userName\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eprotected\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"typ\"\u003eUser\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e users \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enull\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e TypeConversion註釋 - (類型轉換註釋):\u003c/h2\u003e \n\u003cp\u003e 這個註解的註解是用於類和應用程序的轉換規則。註解可以應用於TypeConversion在屬性和方法的級別。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"lit\"\u003e@TypeConversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003erule \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eConversionRule\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eCOLLECTION\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\nconverter \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"java.util.String\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setUsers\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e users \u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eusers \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e users\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"26:T1988,"])</script><script>self.__next_f.push([1,"\u003cp\u003e Struts 2 的標籤有一組標籤,更容易控制流程頁面執行。以下是重要的Struts2控制標籤列表:\u003c/p\u003e \n\u003ch2\u003e if /else 標籤:\u003c/h2\u003e \n\u003cp\u003e 這些標籤執行可在每一種語言找到的一種基本條件流程。 'If'標籤可用於本身或與「Else If''標籤和/或單/多'Else'標籤,如下圖所示:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;s:if\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etest\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{false}\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;div\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eWill Not Be Executed\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/div\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:if\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:elseif\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etest\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{true}\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;div\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eWill Be Executed\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/div\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:elseif\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:else\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;div\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eWill Not Be Executed\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/div\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:else\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e if else 實例\u003c/p\u003e \n\u003ch2\u003e iterator標籤:\u003c/h2\u003e \n\u003cp\u003e 這些迭代器將遍歷一個值。一個可迭代的值可以是任何的java.util.Collection 和 java.util.Iterator。雖然超過一個迭代器遍歷排序,可以使用標籤對結果進行排序或子集標籤的列表或者數組得到一個子集。\u003c/p\u003e \n\u003cp\u003e 下面的示例檢索當前對象的值棧getDays()方法的值,並用它來遍歷。\u0026lt;s:property/\u0026gt;標籤打印出迭代器的當前值。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;s:iterator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"days\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;p\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eday is: \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property/\u0026gt;\u0026lt;/p\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:iterator\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e iterator 實例\u003c/p\u003e \n\u003ch2\u003e merge標籤:\u003c/h2\u003e \n\u003cp\u003e 這些合併標記需要兩個或兩個以上的列表作爲參數,並把它們合併在一起,如下所示:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;s:merge\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evar\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myMergedIterator\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{myList1}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{myList2}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{myList3}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:merge\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:iterator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{#myMergedIterator}\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:iterator\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e merge標籤實例\u003c/p\u003e \n\u003ch2\u003e append 標籤:\u003c/h2\u003e \n\u003cp\u003e 這些append標籤需要兩個或兩個以上的列表作爲參數,並追加它們放在一起,如下圖所示:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;s:append\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evar\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myAppendIterator\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{myList1}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{myList2}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{myList3}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:append\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:iterator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{#myAppendIterator}\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:iterator\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e append標籤實例\u003c/p\u003e \n\u003ch2\u003e generator 標籤:\u003c/h2\u003e \n\u003cp\u003e generator標籤生成一個迭代器的基礎上提供val屬性。以下generator標籤生成一個迭代器,並使用迭代器標籤打印出來。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;s:generator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eval\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{'aaa,bbb,ccc,ddd,eee'}\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:generator\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e generator標籤實例\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"27:T6d31,"])</script><script>self.__next_f.push([1,"\u003ch2\u003e 創建動作類:\u003c/h2\u003e \n\u003cp\u003e 首先,讓我們創建一個簡單的類叫做Employee.java,它看起來像:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eArrayList\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e org\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eapache\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eSubsetIteratorFilter\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eDecider\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(){}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003edepartment \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n employees \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eArrayList\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"George\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Recruitment\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Danielle\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Accounts\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Melissa\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Recruitment\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Rose\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Accounts\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n contractors \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eArrayList\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Mindy\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Database\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Vanessa\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Network\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eDecider\u003c/span\u003e\u003cspan class=\"pln\"\u003e getRecruitmentDecider\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eDecider\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eboolean\u003c/span\u003e\u003cspan class=\"pln\"\u003e decide\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eObject\u003c/span\u003e\u003cspan class=\"pln\"\u003e element\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e employee \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003eelement\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e employee\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egetDepartment\u003c/span\u003e\u003cspan class=\"pun\"\u003e().\u003c/span\u003e\u003cspan class=\"pln\"\u003eequals\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Recruitment\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e};\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getDepartment\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setDepartment\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003edepartment \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e getEmployees\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setEmployees\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eemployees \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e getContractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setContractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003econtractors \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e Employee類有兩個屬性 -\u0026nbsp;name\u0026nbsp;和\u0026nbsp;department,我們也有兩個員工名單 -\u0026nbsp;employees\u0026nbsp;和contractors。我們有一個方法叫做getRecruitmentDecider,返回Decider\u0026nbsp;對象。Decider\u0026nbsp;實現返回true,如果僱員招聘部門工作,否則返回false。\u003c/p\u003e \n\u003cp\u003e 接下來,讓我們創建一個DepartmentComparator比較Employee對象:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eComparator\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eDepartmentComparator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eimplements\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eComparator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e compare\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e e1\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e e2\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e e1\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egetDepartment\u003c/span\u003e\u003cspan class=\"pun\"\u003e().\u003c/span\u003e\u003cspan class=\"pln\"\u003ecompareTo\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003ee2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egetDepartment\u003c/span\u003e\u003cspan class=\"pun\"\u003e());\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@Override\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e compare\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eObject\u003c/span\u003e\u003cspan class=\"pln\"\u003e arg0\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eObject\u003c/span\u003e\u003cspan class=\"pln\"\u003e arg1\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\t\u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"lit\"\u003e0\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在上面的例子所示,部門比較的基礎上按字母順序排列的部門員工進行比較。\u003c/p\u003e \n\u003ch2\u003e 創建視圖\u003c/h2\u003e \n\u003cp\u003e 創建一個文件叫做employee.jsp 有以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmployees\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;b\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eExample of Iterator Tag\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/b\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:iterator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"employees\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e , \r\n\t\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"department\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;br/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;b\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmployees sorted by Department\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/b\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:bean\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.DepartmentComparator\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003evar\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"deptComparator\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:sort\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ecomparator\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"deptComparator\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003esource\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"employees\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e , \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"department\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:sort\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;br/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;b\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eSubSet Tag - Employees working in Recruitment department \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/b\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:subset\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003edecider\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"recruitmentDecider\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003esource\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"employees\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e , \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"department\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:subset\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;br/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;b\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eSubSet Tag - Employees 2 and 3 \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/b\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:subset\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003estart\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ecount\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"2\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003esource\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"employees\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e , \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"department\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:subset\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 讓我們通過使用一個標籤:\u003c/p\u003e \n\u003ch3\u003e iterator標籤\u003c/h3\u003e \n\u003cp\u003e 我們使用iterator標籤要經過員工列表。我們提供「employees」屬性iterator標籤作爲源。在body迭代器標籤,我們現在有訪問Employee對象在員工列表。我們打印隨後他們部門的員工的名字。\u003c/p\u003e \n\u003ch3\u003e SORT\u0026nbsp;標籤\u003c/h3\u003e \n\u003cp\u003e 首先,我們聲明一個bean DepartmentComparator。我們給這個bean名稱deptComparator。然後,我們使用的形式的標記,並指定作爲源和作爲比較器使用的的「deptComparator」的「僱員」列表中。然後,按照前面的例子中,我們遍歷列表和打印員工。正如可以看到的輸出,打印部門排序的員工列表\u003c/p\u003e \n\u003ch3\u003e SUBSET\u0026nbsp;標籤\u003c/h3\u003e \n\u003cp\u003e 用來獲取的列表或陣列的一個子集,該子集標記。我們有兩種口味的子標籤。在第一個例子,我們使用recrutimentDecider 招聘部(請參閱getRecruitmentDecider()方法在Employee.java)工作的員工以獲取列表。\u003c/p\u003e \n\u003cp\u003e 在第二個例子中,我們沒有使用任何決策者,而是我們所追求的元素列表中的第2和第3。子標記需要兩個參數「count」和「start」。 「start」的子集確定的起點,「count」的子集確定的長度。\u003c/p\u003e \n\u003ch2\u003e 配置文件\u003c/h2\u003e \n\u003cp\u003e struts.xml 應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"employee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.Employee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/employee.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e web.xml中,應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊\u0026nbsp;Export \u0026gt; WAR File創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/employee.action。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Struts iterator tag\" src=\"https://asset.1ju.org/cmsstatic/struts2-iterator-1.jpg\"\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"28:T36a3,"])</script><script>self.__next_f.push([1,"\u003ch2\u003e 創建動作類:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHelloWorldAction\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建視圖\u003c/h2\u003e \n\u003cp\u003e 讓我們有index.jsp文件如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\tpageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;h1\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World From Struts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/h1\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;form\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;label\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003efor\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003ePlease pick a name\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/label\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;select\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;option\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Mike\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eMike\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/option\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;option\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Jason\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eJason\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/option\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;option\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Mark\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eMark\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/option\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/select\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"submit\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Say Hello\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 接下來 helloWorld.jsp 演示使用,\u0026nbsp;if, else\u0026nbsp;和\u0026nbsp;elseif\u0026nbsp;標籤:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eExample of If and Else\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;b\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eExample of If and Else\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/b\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:if\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etest\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name=='Mike'\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n You have selected 'Mike'. \r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:if\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:elseif\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etest\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name=='Jason'\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n You have selected 'Jason'\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:elseif\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:else\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n You have not selected 'Mike' or 'Jason'.\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:else\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在這裏,如果標籤返回true,如果「test」屬性中指定的條件返回true。在我們的例子中,我們比較反對「Mike」。如果這個名字是Mike,標籤返回true,我們打印的字符串,否則「elseif」塊被執行,如果不滿意,那麼被執行else塊。這是從傳統的,如果沒有什麼不同,if, else if\u0026nbsp;可以在Java語言中。\u003c/p\u003e \n\u003ch2\u003e 配置文件\u003c/h2\u003e \n\u003cp\u003e struts.xml 應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e web.xml 應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊\u0026nbsp;Export \u0026gt; WAR File創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Struts If Tag input\" src=\"https://asset.1ju.org/cmsstatic/else-1.jpg\"\u003e \n\u003cp\u003e 現在選擇「Mark」,並提交頁面。您應該看到翻頁\u003c/p\u003e \n\u003cimg alt=\"Struts If Tag output\" src=\"https://asset.1ju.org/cmsstatic/else-2.jpg\"\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"29:T5cda,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 如果有兩個列表A和B的值,A1,A2和B1,B2。合併列表,會給出A1,B1,A2,B2。\u003c/p\u003e \n\u003ch2\u003e 創建動作類:\u003c/h2\u003e \n\u003cp\u003e 首先,讓我們創建一個簡單的類叫做Employee.java,它看起來像:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eArrayList\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e org\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eapache\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eSubsetIteratorFilter\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eDecider\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(){}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003edepartment \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n employees \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eArrayList\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"George\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Recruitment\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Danielle\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Accounts\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Melissa\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Recruitment\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Rose\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Accounts\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n contractors \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eArrayList\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Mindy\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Database\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Vanessa\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Network\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eDecider\u003c/span\u003e\u003cspan class=\"pln\"\u003e getRecruitmentDecider\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eDecider\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eboolean\u003c/span\u003e\u003cspan class=\"pln\"\u003e decide\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eObject\u003c/span\u003e\u003cspan class=\"pln\"\u003e element\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e employee \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003eelement\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e employee\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egetDepartment\u003c/span\u003e\u003cspan class=\"pun\"\u003e().\u003c/span\u003e\u003cspan class=\"pln\"\u003eequals\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Recruitment\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e};\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getDepartment\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setDepartment\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003edepartment \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e getEmployees\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setEmployees\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eemployees \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e getContractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setContractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003econtractors \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e Employee類有兩個屬性 -\u0026nbsp;name\u0026nbsp;和\u0026nbsp;department,我們也有兩個員工名單 -\u0026nbsp;employees\u0026nbsp;和contractors。我們有一個方法叫做getRecruitmentDecider,返回Decider\u0026nbsp;對象。Decider\u0026nbsp;實現返回true,如果僱員招聘部門工作,否則返回false。\u003c/p\u003e \n\u003cp\u003e 接下來,讓我們創建一個DepartmentComparator 比較Employee對象:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eComparator\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eDepartmentComparator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eimplements\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eComparator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e compare\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e e1\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e e2\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e e1\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egetDepartment\u003c/span\u003e\u003cspan class=\"pun\"\u003e().\u003c/span\u003e\u003cspan class=\"pln\"\u003ecompareTo\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003ee2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egetDepartment\u003c/span\u003e\u003cspan class=\"pun\"\u003e());\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@Override\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e compare\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eObject\u003c/span\u003e\u003cspan class=\"pln\"\u003e arg0\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eObject\u003c/span\u003e\u003cspan class=\"pln\"\u003e arg1\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\t\u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"lit\"\u003e0\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在上面的例子所示,部門比較的基礎上按字母順序排列的部門員工進行比較。\u003c/p\u003e \n\u003ch2\u003e 創建視圖\u003c/h2\u003e \n\u003cp\u003e 創建一個文件叫做employee.jsp以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmployees\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;b\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmployees and Contractors Merged together\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/b\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;br\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:merge\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"allemployees\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"employees\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"contractors\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:merge\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:iterator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"allemployees\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e,\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"department\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 合併標記需要兩個或兩個以上的列表作爲參數。我們需要給合併一個id,這樣我們就可以重用它。在這個例子中,我們提供了作爲參數傳遞給員工和承包商的合併標籤。然後,我們使用「allemployees」ID合併列表遍歷並打印員工的細節。\u003c/p\u003e \n\u003ch2\u003e 配置文件\u003c/h2\u003e \n\u003cp\u003e struts.xml中應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"employee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.Employee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/employee.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e web.xml中,應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊\u0026nbsp;Export \u0026gt; WAR File創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/employee.action。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Struts merge tag\" src=\"https://asset.1ju.org/cmsstatic/struts2-merge-1.jpg\"\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"2a:T5d44,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 說,如果有兩個列表A和B的值A1,A2和B1,B2。合併列表,會給你的A1,A2,B1,B2,而append 名單,會有A1,A2,B1,B2。\u003c/p\u003e \n\u003ch2\u003e 創建動作類:\u003c/h2\u003e \n\u003cp\u003e 首先,讓我們創建一個簡單的類叫做Employee.java,它看起來像:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eArrayList\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e org\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eapache\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eSubsetIteratorFilter\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eDecider\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(){}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003edepartment \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n employees \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eArrayList\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"George\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Recruitment\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Danielle\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Accounts\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Melissa\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Recruitment\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Rose\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Accounts\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n contractors \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eArrayList\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Mindy\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Database\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Vanessa\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Network\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eDecider\u003c/span\u003e\u003cspan class=\"pln\"\u003e getRecruitmentDecider\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eDecider\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eboolean\u003c/span\u003e\u003cspan class=\"pln\"\u003e decide\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eObject\u003c/span\u003e\u003cspan class=\"pln\"\u003e element\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e employee \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003eelement\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e employee\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egetDepartment\u003c/span\u003e\u003cspan class=\"pun\"\u003e().\u003c/span\u003e\u003cspan class=\"pln\"\u003eequals\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Recruitment\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e};\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getDepartment\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setDepartment\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003edepartment \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e getEmployees\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setEmployees\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eemployees \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e getContractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setContractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003econtractors \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e Employee類有兩個屬性 -\u0026nbsp;name\u0026nbsp;和\u0026nbsp;department,我們也有兩個員工名單 -\u0026nbsp;employees\u0026nbsp;和contractors。我們有一個方法叫做getRecruitmentDecider,返回Decider\u0026nbsp;對象。Decider\u0026nbsp;實現返回true,如果僱員招聘部門工作,否則返回false。\u003c/p\u003e \n\u003cp\u003e 接下來,讓我們創建一個DepartmentComparator比較Employee對象:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eComparator\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eDepartmentComparator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eimplements\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eComparator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e compare\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e e1\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e e2\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e e1\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egetDepartment\u003c/span\u003e\u003cspan class=\"pun\"\u003e().\u003c/span\u003e\u003cspan class=\"pln\"\u003ecompareTo\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003ee2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egetDepartment\u003c/span\u003e\u003cspan class=\"pun\"\u003e());\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@Override\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e compare\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eObject\u003c/span\u003e\u003cspan class=\"pln\"\u003e arg0\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eObject\u003c/span\u003e\u003cspan class=\"pln\"\u003e arg1\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\t\u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"lit\"\u003e0\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在上面的例子所示,部門比較的基礎上按字母順序排列的部門員工進行比較。\u003c/p\u003e \n\u003ch2\u003e 創建視圖\u003c/h2\u003e \n\u003cp\u003e 創建一個文件叫做employee.jsp以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmployees\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;b\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmployees and Contractors Merged together\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/b\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;br\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:append\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"allemployees\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"employees\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"contractors\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:append\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:iterator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"allemployees\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e,\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"department\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e append標籤需要兩個或兩個以上列出作爲參數。我們需要給予追加一個id,這樣我們就可以重用它。在這個例子中,我們提供了作爲參數傳遞給員工和承包商的附加標籤。然後,我們使用「allemployees」ID遍歷附加列表和打印員工的細節。\u003c/p\u003e \n\u003ch2\u003e 配置文件\u003c/h2\u003e \n\u003cp\u003e struts.xml中應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"employee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.Employee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/employee.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e web.xml中,應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊Export \u0026gt; WAR File\u0026nbsp;創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/employee.action。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Struts append tag\" src=\"https://asset.1ju.org/cmsstatic/struts2-append-1.jpg\"\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"2b:T29bb,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 我們經常遇到的一些情況,必須創建列表或數組上遍歷列表。可以創建列表或數組使用scriptlet或者可以使用generator\u0026nbsp;標籤。\u0026nbsp;tag.\u003c/p\u003e \n\u003ch2\u003e 創建action類:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHelloWorldAction\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建視圖\u003c/h2\u003e \n\u003cp\u003e 下列 helloWorld.jsp 展示使用generator\u0026nbsp;標記:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;h2\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eExample of Generator Tag\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/h2\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;h3\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eThe colours of rainbow:\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/h3\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:generator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eval\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{'Violet,Indigo,Blue,\r\n Green,Yellow,Orange,Red '}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ecount\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"7\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eseparator\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\",\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:generator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\t\r\n\t\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在這裏,我們創建一個generator\u0026nbsp;標籤,我們要求它解析的字符串,其中包含逗號分隔的列表,形成了彩虹的顏色。我們告訴發電機標籤,分隔符是「,」我們希望所有七個值在列表中。如果我們只關心前三個值,然後我們會設置計數至3。發電機標記在體內,我們使用了迭代器去通過由generator\u0026nbsp;標記創建的值的打印屬性的值。\u003c/p\u003e \n\u003ch2\u003e 配置文件\u003c/h2\u003e \n\u003cp\u003e struts.xml 應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e web.xml 應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊Export \u0026gt; WAR File\u0026nbsp;創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/hello.action。這會給出以下畫面:\u0026nbsp;\u003c/p\u003e \n\u003cimg alt=\"Struts generator tag\" src=\"https://asset.1ju.org/cmsstatic/struts2-generator-1.jpg\"\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"2c:T3cd6,"])</script><script>self.__next_f.push([1,"\u003cp\u003e Struts 2 的數據標籤主要用於操作頁面上顯示的數據。下面列出的是重要的數據標籤:\u003c/p\u003e \n\u003ch2\u003e action標籤:\u003c/h2\u003e \n\u003cp\u003e 此標記使開發人員能夠直接從JSP頁面調用動作指定動作的名稱和一個可選的命名空間。標籤的主體內容是用行動來呈現結果。任何結果處理器定義在struts.xml這個動作將被忽略,指定除非executeResult參數。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;div\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eTag to execute the action\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/div\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;br\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"actionTagAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eexecuteResult\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;br\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;div\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eTo invokes special method in action class\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/div\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;br\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"actionTagAction!specialMethod\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eexecuteResult\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e action標籤實例\u003c/p\u003e \n\u003ch2\u003e include 標籤:\u003c/h2\u003e \n\u003cp\u003e 將用於另一個JSP頁面中包含另一個JSP文件。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e\u0026lt;-- First Syntax --\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:include\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myJsp.jsp\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u0026lt;-- Second Syntax --\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:include\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myJsp.jsp\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"param1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"value2\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"param2\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"value2\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:include\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u0026lt;-- Third Syntax --\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:include\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myJsp.jsp\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"param1\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003evalue1\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"param2\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003evalue2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:include\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e include 標籤實例\u003c/p\u003e \n\u003ch2\u003e bean 標籤:\u003c/h2\u003e \n\u003cp\u003e bean標籤實例化一個類,符合JavaBeans規範。此標記的主體可以包含多個元素:參數設置該類別的任何mutator方法。如果var屬性設置在BeanTag上,它會放置到堆棧上下文的bean實例。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;s:bean\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"org.apache.struts2.util.Counter\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evar\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"counter\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"first\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"20\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"last\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"25\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:bean\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e bean標籤實例\u003c/p\u003e \n\u003ch2\u003e date標籤:\u003c/h2\u003e \n\u003cp\u003e date標籤,將讓在一個快速和容易的方式格式化日期。可以指定自定義格式(如「DD/ MM / YYYY HH:MM」),可以生成易讀的符號(如「2小時,14分鐘」),或者可以依傍預定義的格式關鍵 struts.date.format 屬性文件。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;s:date\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"person.birthday\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eformat\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"dd/MM/yyyy\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:date\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"person.birthday\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eformat\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{getText('some.i18n.key')}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:date\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"person.birthday\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003enice\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:date\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"person.birthday\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e date標籤實例\u003c/p\u003e \n\u003ch2\u003e param 標籤:\u003c/h2\u003e \n\u003cp\u003e 這些參數標籤可用於參數其他標籤。該標籤具有以下兩個參數。\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e name (String) - 參數的名稱\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e value (Object) - 參數的值\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;pre\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;ui:component\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;ui:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"key\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"[0]\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;ui:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"value\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"[1]\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;ui:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"context\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"[2]\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/ui:component\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/pre\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e param標籤實例\u003c/p\u003e \n\u003ch2\u003e property 標籤:\u003c/h2\u003e \n\u003cp\u003e 這些屬性標籤是用來獲取屬性的值,這將默認堆棧的頂部,如果沒有指定。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;s:push\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myBean\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"com\"\u003e\u0026lt;!-- Example 1: --\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myBeanProperty\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"com\"\u003e\u0026lt;!-- Example 2: --\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eTextUtils\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myBeanProperty\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003edefault\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"a default value\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:push\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e property標籤實例\u003c/p\u003e \n\u003ch2\u003e push 標籤:\u003c/h2\u003e \n\u003cp\u003e 這些push標籤是用來推堆棧簡化使用。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;s:push\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"user\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:propery\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"firstName\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:propery\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"lastName\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:push\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e push標籤實例\u003c/p\u003e \n\u003ch2\u003e set 標籤:\u003c/h2\u003e \n\u003cp\u003e 這些set標籤分配一個值給一個變量在指定的範圍內。它是有用的,當想分配一個變量到複雜的表達式,然後簡單地引用變量每次而不是複雜的表達。可用的範圍是application, session, request, page和行動。\u0026nbsp;\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;s:set\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myenv\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"environment.name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myenv\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e set 標籤實例\u003c/p\u003e \n\u003ch2\u003e text 標籤:\u003c/h2\u003e \n\u003cp\u003e 這些\u0026nbsp;text\u0026nbsp;標籤是用來呈現一個i18n 文本消息。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"com\"\u003e\u0026lt;!-- First Example --\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:i18n\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.action.test.i18n.Shop\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:text\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"main.title\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:i18n\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"com\"\u003e\u0026lt;!-- Second Example --\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:text\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"main.title\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"com\"\u003e\u0026lt;!-- Third Examlpe --\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:text\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"i18n.label.greetings\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eMr Smith\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:text\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e text 標籤實例\u003c/p\u003e \n\u003ch2\u003e url 標籤:\u003c/h2\u003e \n\u003cp\u003e 這些URL標籤是用來創建一個URL。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e\u0026lt;-- Example 1 --\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:url\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"editGadget.action\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"id\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{selected}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:url\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u0026lt;-- Example 2 --\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:url\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"editGadget\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"id\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{selected}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:url\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u0026lt;-- Example 3--\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:url\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eincludeParams\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"get\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"id\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{'22'}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:url\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e url標籤實例\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"2d:T4c2d,"])</script><script>self.__next_f.push([1,"\u003cp\u003e action標記允許程序員從視圖頁面執行動作。他們可以做到這一點通過指定的動作名稱。他們可以設置的「executeResult」參數設置爲「true」,在視圖中直接呈現結果。或者他們可以將此參數設置爲「false」,但利用請求屬性暴露的操作方法。\u003c/p\u003e \n\u003ch2\u003e 創建action類:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHelloWorldAction\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建視圖\u003c/h2\u003e \n\u003cp\u003e 讓我們具有 helloWorld.jsp 展示使用generator\u0026nbsp;標記:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;h2\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eExample of Generator Tag\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/h2\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;h3\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eThe colours of rainbow:\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/h3\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:generator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eval\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{'Violet,Indigo,Blue,\r\n Green,Yellow,Orange,Red '}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ecount\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"7\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eseparator\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\",\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:generator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\t\r\n\t\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 接下來讓我們有employees.jsp包含以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmployees\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eexecuteResult\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Output from Hello: \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;br\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 配置文件\u003c/h2\u003e \n\u003cp\u003e struts.xml 應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"employee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.Employee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/employee.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e web.xml 應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊\u0026nbsp;Export \u0026gt; WAR File\u0026nbsp;創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/employee.action。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Struts action tag\" src=\"https://asset.1ju.org/cmsstatic/struts2-action-1.jpg\"\u003e \n\u003cp\u003e 正如可以看到在這個例子中,我們指定爲「true」的值executeResult。因此,hello.action結果是直接在網頁上呈現。helloWorld.jsp打印彩虹的顏色 - 這是現在employee.jsp呈現\u003c/p\u003e \n\u003cp\u003e 現在,讓我們稍微修改 HelloWorldAction.java:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eArrayList\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e org\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eapache\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eServletActionContext\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHelloWorldAction\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e names \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eArrayList\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n names\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Robert\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n names\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Page\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n names\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Kate\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eServletActionContext\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egetRequest\u003c/span\u003e\u003cspan class=\"pun\"\u003e().\u003c/span\u003e\u003cspan class=\"pln\"\u003esetAttribute\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"names\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e names\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 最後,修改employee.jsp,如下所示:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmployees\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eexecuteResult\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"false\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Output from Hello: \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;br\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:iterator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"#attr.names\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 再次右鍵點擊項目名稱,並單擊Export \u0026gt; WAR File創建一個WAR文件。然後部署此WAR在Tomcat 的 webapps目錄下。\u003cbr\u003e 最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/employee.action。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Struts action tag\" src=\"https://asset.1ju.org/cmsstatic/struts2-action-2.jpg\"\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"2e:T328b,"])</script><script>self.__next_f.push([1,"\u003cp\u003e Struts 的\u0026nbsp;include\u0026nbsp;標籤和JSP include標記非常相似,它很少使用。我們已經看到了如何將一個Struts動作到一個jsp使用\u0026lt;s:action\u0026gt;標籤的輸出。 \u0026lt;s:include\u0026gt;標籤略有不同。它可以進入一個jsp輸出包括一個jsp,servlet或任何其他資源(其他的東西比一個Struts動作)。類似\u0026lt;jsp:include\u0026gt;,但它允許您將參數傳遞給被包含的文件,它是Struts框架的一部分。\u003c/p\u003e \n\u003cp\u003e 下面的例子展示了我們如何將include輸出的helloWorld.jsp到employee.jsp。在這種情況下,動作在HelloWorldAction.java方法將不會被調用,因爲我們是直接包括JSP。\u003c/p\u003e \n\u003ch2\u003e 創建動作類:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHelloWorldAction\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建視圖\u003c/h2\u003e \n\u003cp\u003e 讓我們包含以下內容的helloWorld.jsp:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;h2\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eExample of Generator Tag\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/h2\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;h3\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eThe colours of rainbow:\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/h3\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:generator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eval\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{'Violet,Indigo,Blue,\r\n Green,Yellow,Orange,Red '}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ecount\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"7\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eseparator\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\",\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:generator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\t\r\n\t\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 接下來讓我們有employees.jsp包含以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmployees\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;p\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eAn example of the include tag: \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/p\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:include\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"HelloWorld.jsp\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 配置文件\u003c/h2\u003e \n\u003cp\u003e struts.xml 應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"employee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.Employee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/employee.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e web.xml 應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊Export \u0026gt; WAR File創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/employee.action。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Struts include tag\" src=\"https://asset.1ju.org/cmsstatic/struts2-include-1.jpg\"\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"2f:T3614,"])</script><script>self.__next_f.push([1,"\u003cp\u003e bean標籤的設置和push\u0026nbsp;標籤的組合,它可以創建一個新的對象實例,然後設置變量的值。然後,它的bean可以在值棧,因此,它可用於在JSP頁面。\u003c/p\u003e \n\u003cp\u003e bean標籤需要一個Java Bean來工作。所以,標準的java bean規律應遵循。這是bean 應該有一個無參數的構造函數。要公開和使用的所有屬性的getter和setter 方法​​。對於這個練習的目的,讓我們用下面的計數器類,在struts util包。Counter\u0026nbsp;類是一個bean,可以使用一個計數器來跟蹤。\u0026nbsp;\u003c/p\u003e \n\u003cp\u003e 因此,讓我們所有的文件保持不變,並修改的helloWorld.jsp文件。\u003c/p\u003e \n\u003ch2\u003e 創建動作類:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHelloWorldAction\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建視圖\u003c/h2\u003e \n\u003cp\u003e 讓我們包含以下內容 helloWorld.jsp:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:bean\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"org.apache.struts2.util.Counter\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evar\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"counter\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"first\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"20\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"last\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"25\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:bean\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;ul\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:iterator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"#counter\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;li\u0026gt;\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;/li\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/ul\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 接下來讓我們有employees.jsp包含以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmployees\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;p\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eAn example of the include tag: \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/p\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:include\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"HelloWorld.jsp\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 配置文件\u003c/h2\u003e \n\u003cp\u003e 你的struts.xml應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"employee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.Employee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/employee.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e web.xml中應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊Export \u0026gt; WAR File創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/hello.action。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Struts bean tag\" src=\"https://asset.1ju.org/cmsstatic/struts2-bean-1.jpg\"\u003e \n\u003cp\u003e 在這個例子中,我們實例化一個新的org.apache.struts2.util.Counter bean實例。然後我們的第一個屬性設置爲20和25最後一個屬性。這意味着計數器的值分別爲20,21,22,23,24和25。我們給一個名爲「Counter」的bean。 struts的bean標籤將bean實例化,並把它值棧中的。現在我們可以使用迭代器去,通過計數器bean的nd打印出計數器的值。.\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"30:T2922,"])</script><script>self.__next_f.push([1,"\u003cp\u003e date標籤允許在一個快速和容易的方式格式化日期。用戶可以指定自定義的格式(如「DD/ MM / YYYY HH:MM」),可以產生容易可讀的符號(如「2小時,14分鐘),或預定義的格式就可以求助於鍵struts.date.format'在屬性文件中。\u003c/p\u003e \n\u003ch2\u003e 創建動作類:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.*;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHelloWorldAction\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eDate\u003c/span\u003e\u003cspan class=\"pln\"\u003e currentDate\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n setCurrentDate\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eDate\u003c/span\u003e\u003cspan class=\"pun\"\u003e());\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setCurrentDate\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eDate\u003c/span\u003e\u003cspan class=\"pln\"\u003e date\u003c/span\u003e\u003cspan class=\"pun\"\u003e){\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ecurrentDate \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e date\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eDate\u003c/span\u003e\u003cspan class=\"pln\"\u003e getCurrentDate\u003c/span\u003e\u003cspan class=\"pun\"\u003e(){\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e currentDate\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建視圖\u003c/h2\u003e \n\u003cp\u003e 以下helloWorld.jsp的內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;h2\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eCurrent Date\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/h2\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;h3\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eDay/Month/Year Format\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/h3\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:date\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"currentDate\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eformat\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"dd/MM/yyyy\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;h3\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eMonth/Day/Year Format\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/h3\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:date\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"currentDate\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eformat\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"MM/dd/yyyy\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 配置文件\u003c/h2\u003e \n\u003cp\u003e struts.xml 應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e web.xml 應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊\u0026nbsp;Export \u0026gt; WAR File創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/hello.action。這會給出以下畫面:\u0026nbsp;\u003c/p\u003e \n\u003cimg alt=\"Struts date tag\" src=\"https://asset.1ju.org/cmsstatic/struts2-date-1.jpg\"\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"31:T3430,"])</script><script>self.__next_f.push([1,"\u003cp\u003e param標籤可用於參數其他標籤。包括標籤和bean標籤,這種標籤的例子。讓我們以同樣的例子我們已經討論,同時討論bean標籤。\u003c/p\u003e \n\u003ch2\u003e 創建動作類:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHelloWorldAction\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建視圖\u003c/h2\u003e \n\u003cp\u003e 讓我們看看包含以下內容的helloWorld.jsp:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:bean\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"org.apache.struts2.util.Counter\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evar\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"counter\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"first\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"20\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"last\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"25\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:bean\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;ul\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:iterator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"#counter\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;li\u0026gt;\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;/li\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/ul\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 接下來讓我們看看employees.jsp包含以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmployees\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;p\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eAn example of the include tag: \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/p\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:include\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"HelloWorld.jsp\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 配置文件\u003c/h2\u003e \n\u003cp\u003e struts.xml中應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"employee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.Employee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/employee.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e web.xml 應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊「導出」\u0026gt;WAR文件創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/hello.action。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Struts bean tag\" src=\"https://asset.1ju.org/cmsstatic/struts2-bean-1.jpg\"\u003e \n\u003cp\u003e 在這個例子中,我們實例化一個新的org.apache.struts2.util.Counter bean的實例。然後我們的第一個屬性設置爲20和25的最後一個屬性。這意味着計數器的值分別爲20,21,22,23,24和25。我們給一個名爲「counter」的bean。 struts的bean標籤bean的實例化,並把它值棧中的。現在我們可以使用迭代器去,通過計數器bean的nd打印出計數器的值。\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"32:T3fd4,"])</script><script>self.__next_f.push([1,"\u003cp\u003e property\u0026nbsp;標籤是用來獲取屬性的值,這將默認堆棧的頂部,如果沒有指定。這個例子顯示了三個簡單的數據標記 - 即set,\u0026nbsp;push\u0026nbsp;和\u0026nbsp;property\u0026nbsp;的用法。\u0026nbsp;\u003c/p\u003e \n\u003ch2\u003e 創建動作類:\u003c/h2\u003e \n\u003cp\u003e 對於這個練習,讓我們重用的例子在「數據類型轉換」一章,但小的修改。因此,讓我們開始創建類。考慮以下POJO類Environment.java。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 我們動作類:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eSystemDetails\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pln\"\u003e environment \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Development\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e operatingSystem \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"Windows XP SP3\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pln\"\u003e getEnvironment\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e environment\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setEnvironment\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pln\"\u003e environment\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eenvironment \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e environment\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getOperatingSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e operatingSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setOperatingSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e operatingSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eoperatingSystem \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e operatingSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建視圖\u003c/h2\u003e \n\u003cp\u003e 讓我們有System.jsp以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\tpageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eSystem Details\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;p\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eThe environment name property can be accessed in three ways:\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/p\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n (Method 1) Environment Name: \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"environment.name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n (Method 2) Environment Name: \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:push\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"environment\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:push\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n (Method 3) Environment Name:\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:set\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myenv\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"environment.name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myenv\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 現在,讓我們去逐一通過三個選項:\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e 在第一個方法中,我們使用屬性標記的環境的名稱來獲取值。由於環境變量是在動作類,它可以自動值棧中的。我們可以直接引用它使用屬性environment.name。當一個類中的屬性數有限。試想一下,如果有20個環境類中的屬性。每次需要參考這些變量需要添加「environment.」作爲前綴。push標籤記處理。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 在第二種方法中,我們把「environment」屬性的堆棧。因此,現在主體內的 push\u0026nbsp;標記,環境屬性是可堆棧的根。所以,現在引用屬性,很容易在這個例子所示。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 在最後的方法,我們使用設置的標籤來創建一個新的變量稱爲myenv。此變量的值設置爲environment.name。所以,現在我們可以使用這個變量的地方,我們是指環境的名稱。\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003ch2\u003e 配置文件\u003c/h2\u003e \n\u003cp\u003e 你的struts.xml中應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"system\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.SystemDetails\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/System.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e web.xml中應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊\u0026nbsp;Export \u0026gt; WAR File\u0026nbsp;創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/system.action。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Struts property tag\" src=\"https://asset.1ju.org/cmsstatic/struts2-property-1.jpg\"\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"33:T3ff2,"])</script><script>self.__next_f.push([1,"\u003cp\u003e property\u0026nbsp;標籤是用來獲取屬性的值,這將默認堆棧的頂部,如果沒有指定。這個例子顯示了三個簡單的數據標記 - 即set,\u0026nbsp;push\u0026nbsp;和\u0026nbsp;property\u0026nbsp;的用法。\u0026nbsp;\u003c/p\u003e \n\u003ch2\u003e 創建動作類:\u003c/h2\u003e \n\u003cp\u003e 對於這個練習,讓我們重用的例子在「數據類型轉換」一章,但小的修改。因此,讓我們開始創建類。考慮以下POJO類Environment.java。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 我們的動作類:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eSystemDetails\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pln\"\u003e environment \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Development\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e operatingSystem \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"Windows XP SP3\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pln\"\u003e getEnvironment\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e environment\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setEnvironment\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pln\"\u003e environment\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eenvironment \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e environment\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getOperatingSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e operatingSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setOperatingSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e operatingSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eoperatingSystem \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e operatingSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建視圖\u003c/h2\u003e \n\u003cp\u003e 我們有System.jsp以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\tpageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eSystem Details\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;p\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eThe environment name property can be accessed in three ways:\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/p\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n (Method 1) Environment Name: \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"environment.name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n (Method 2) Environment Name: \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:push\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"environment\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:push\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n (Method 3) Environment Name:\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:set\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myenv\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"environment.name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myenv\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 現在,讓我們去逐一通過三個選項:\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e 在第一個方法中,我們使用屬性標記的環境的名稱來獲取值。由於環境變量是在動作類,它可以自動值棧中的。我們可以直接引用它使用屬性environment.name。當一個類中的屬性數有限。試想一下,如果有20個環境類中的屬性。每次需要參考這些變量需要添加「environment.」作爲前綴。push標籤記處理。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 在第二種方法中,我們把「environment」屬性的堆棧。因此,現在主體內的 push\u0026nbsp;標記,環境屬性是可堆棧的根。所以,現在引用屬性,很容易在這個例子所示。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 在最後的方法,我們使用設置的標籤來創建一個新的變量稱爲myenv。此變量的值設置爲environment.name。所以,現在我們可以使用這個變量的地方,我們是指環境的名稱。\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003ch2\u003e 配置文件\u003c/h2\u003e \n\u003ch2\u003e \u003cspan\u003e你的struts.xml中應該像這樣:\u003c/span\u003e\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"system\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.SystemDetails\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/System.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 你的web.xml文件內容應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊\u0026nbsp;Export \u0026gt; WAR File\u0026nbsp;創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/system.action。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Struts property tag\" src=\"https://asset.1ju.org/cmsstatic/struts2-property-1.jpg\"\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"34:T2f3c,"])</script><script>self.__next_f.push([1,"\u003cp\u003e text 標籤是一個通用的標記,用來渲染一個i18n的文本消息。按照三個步驟:\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e 該消息必須在一個資源包,它與作爲動作具有相同的名稱。在實踐中,這意味着,應該爲類具有相同名稱的Java類在同一個包創建屬性文件,.properties擴展。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 如果具名的消息沒有被發現,然後主體的標記將被用作默認的消息。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 如果沒有正文被使用,那麼該消息的名稱將被使用。\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e 讓我們來檢查下面的例子來理解文本標籤的用法:\u003c/p\u003e \n\u003ch2\u003e 創建動作類:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHelloWorldAction\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建視圖\u003c/h2\u003e \n\u003cp\u003e 讓我們包含以下內容的helloWorld.jsp:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eText Tag Example\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:i18n\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:text\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name.success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:text\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name.xyz\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eMessage doesn't exists\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:text\u0026gt;\u0026lt;br\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:text\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name.msg.param\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eZARA\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:text\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:i18n\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 配置文件\u003c/h2\u003e \n\u003cp\u003e 讓我們創建一個屬性名稱相同的文件,動作類包名。因此,在這種情況下,我們將創建HelloWorldAction.properties文件,並保持在類路徑:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esuccess \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eThis\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eis\u003c/span\u003e\u003cspan class=\"pln\"\u003e success message\r\nname\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003emsg\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eparam \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eThe\u003c/span\u003e\u003cspan class=\"pln\"\u003e param example \u003c/span\u003e\u003cspan class=\"pun\"\u003e-\u003c/span\u003e\u003cspan class=\"pln\"\u003e param \u003c/span\u003e\u003cspan class=\"pun\"\u003e:\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"lit\"\u003e0\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 你的struts.xml中應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.custom.i18n.resources\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"ApplicationResources\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloaction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e web.xml中,應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊Export \u0026gt; WAR File創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/hello.action。這會給出以下畫面:\u0026nbsp;\u003c/p\u003e \n\u003cimg alt=\"Struts text tag\" src=\"https://asset.1ju.org/cmsstatic/struts2-text-1.jpg\"\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"35:T29b1,"])</script><script>self.__next_f.push([1,"\u003cp\u003e URL標籤是負責生成URL字符串。這樣做的好處是,你可以提供參數標籤。我們通過一個例子來說明使用的URL標籤。\u003c/p\u003e \n\u003ch2\u003e 創建動作類:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHelloWorldAction\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建視圖\u003c/h2\u003e \n\u003cp\u003e helloWorld.jsp包含以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:url\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"login\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"login\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evar\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myurl\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"user\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eZara\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:url\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u0026lt;a href='\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"#myurl\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e'\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"#myurl\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;/a\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在這裏,我們生成一個網址鏈接「login.action」。我們已經給這個url名稱「myurl」。這是爲了讓我們可以重用這個網址鏈接在多個地方的jsp文件。然後,我們提供的url參數調用用戶。參數值實際上追加到查詢字符串,可以看到從上面的輸出。\u0026nbsp;\u003c/p\u003e \n\u003cp\u003e 主要是有用是當你想創建一個bean屬性值的基礎上動態超鏈接的URL標籤。\u003c/p\u003e \n\u003ch2\u003e 配置文件\u003c/h2\u003e \n\u003cp\u003e 你的struts.xml中應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloaction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 你的web.xml 應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊Export \u0026gt; WAR File創建一個WAR文件。然後部署這個WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/hello.action。這會給你以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Struts url tag\" src=\"https://asset.1ju.org/cmsstatic/struts2-url-1.jpg\"\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"36:T4e8a,"])</script><script>self.__next_f.push([1,"\u003cp\u003e form 標籤的列表是Struts的UI標籤的一個子集。這些標籤可以幫助渲染中需要Struts Web應用程序和用戶界面可以分爲三類。本章將帶你通過所有三種類型的UI標籤:\u003c/p\u003e \n\u003ch2\u003e 簡單UI標籤:\u003c/h2\u003e \n\u003cp\u003e 我們已經使用這些標籤已經在我們的例子中。讓我們來看看一個簡單的一些簡單UI標籤的視圖頁面email.jsp:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\tpageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:head/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:div\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmail Form\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:div\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:text\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Please fill in the form below:\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:form\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"post\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eenctype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"multipart/form-data\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:hidden\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"secret\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"abracadabra\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:textfield\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ekey\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"email.from\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"from\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:password\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ekey\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"email.password\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"password\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:textfield\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ekey\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"email.to\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"to\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:textfield\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ekey\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"email.subject\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"subject\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:textarea\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ekey\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"email.body\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"email.body\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:label\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003efor\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"attachment\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Attachment\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:file\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"attachment\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaccept\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"text/html,text/plain\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:token\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:submit\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ekey\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"submit\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 如果你是知道的HTML,那麼所有使用的標籤是很常見的HTML標籤與一個額外前綴s:隨着每個標籤和不同的屬性。當我們執行上面的程序中,我們可以得到以下的用戶界面,只要使用所有鍵設置正確的映射。\u003c/p\u003e \n\u003cimg alt=\"Struts Simple UI tags\" src=\"https://asset.1ju.org/cmsstatic/struts2-19.jpg\"\u003e \n\u003cp\u003e 如圖所示,s:head產生Struts2的應用程序所需的javascript和樣式表元素。\u003c/p\u003e \n\u003cp\u003e 接下來,我們有s:div和s:text元素。s:div被用來渲染HTML DIV元素。這是非常有用的當混合使用HTML和Struts標籤。對於這些人來說,他們有選擇使用s:div來呈現一個div。\u0026nbsp;\u003c/p\u003e \n\u003cp\u003e s:text如圖所示用於在屏幕上呈現文本。\u003c/p\u003e \n\u003cp\u003e 接下來我們有s:form標籤。\u0026nbsp;s:form標籤決定提交表單的action屬性。因爲我們有一個文件上傳元素的形式,我們必須設置enctype屬性multipart。否則,我們就可以保留此空白。\u003c/p\u003e \n\u003cp\u003e 在表單標籤的末尾,我們有s:submit標籤。這是用來提交表單。當提交表單時,所有的表單值提交到指定的動作在s:form標籤。\u003c/p\u003e \n\u003cp\u003e s:form裏面,我們有一個隱藏的屬性稱爲secret。這使得一個隱藏的元素在HTML中。在我們的案例中,「祕密」的元素值「abracadabra」。此元素向最終用戶是不可見的,並用於承載的狀態下,從一個視圖。\u0026nbsp;\u003c/p\u003e \n\u003cp\u003e 接下來,我們有s:label, s:textfield, s:password 和 s:textarea標籤。這些用於呈現標籤,輸入字段,密碼和文本區域分別。我們所看到的這些動作「Struts - 發送電子郵件」例子。這裏要注意的最重要的事情是使用「key」屬性。 「key」屬性用於獲取這些控件從屬性文件中的標籤。\u003c/p\u003e \n\u003cp\u003e 然後,我們有\u0026nbsp;s:file標記使得輸入文件上傳組件。該組件允許用戶上傳文件。在這個例子中,我們使用了「accept」 參數位置s:file\u0026nbsp;指定允許上傳的文件類型的文件標記。\u0026nbsp;\u003c/p\u003e \n\u003cp\u003e 最後,我們有s:token\u0026nbsp;標籤。令牌的標籤,這是用來找出雙提交表單是否已經生成一個獨特的標記。\u003c/p\u003e \n\u003cp\u003e 表單呈現時,一個隱藏的變量被放置令牌值。讓我們說,例如令牌是「ABC」。當表單提交時,Struts過濾器會檢查對存儲在會話的令牌令牌。如果匹配,它消除了從會話令牌。現在,如果意外形式(無論是通過刷新或通過點擊瀏覽器的後退按鈕)重新提交,表單將被重新提交「ABC」作爲標記。在這種情況下,過濾器將檢查對再次存儲在會話中的令牌的令牌。但由於令牌「ABC」已經從會話中刪除,這將不匹配和Struts的過濾器將拒絕請求。\u003c/p\u003e \n\u003ch2\u003e 組 UI 標籤:\u003c/h2\u003e \n\u003cp\u003e 組UI標籤被用來創建單選按鈕,複選框。讓我們來看看一個簡單的視圖頁的helloWorld.jsp的複選框和單選按鈕標籤:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:head\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:form\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello.action\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:radio\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Gender\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"gender\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elist\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"{'male','female'}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:checkboxlist\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Hobbies\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hobbies\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003elist\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"{'sports','tv','shopping'}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 當我們執行上述程序的輸出將看起來類似於以下內容:\u003c/p\u003e \n\u003cimg alt=\"Struts group UI tags\" src=\"https://asset.1ju.org/cmsstatic/struts2-20.jpg\"\u003e \n\u003cp\u003e 現在讓我們來看看這個例子。在第一個例子中,我們創建了一個簡單的單選按鈕,「Gender」的標籤。單選按鈕標籤的name屬性是強制性的,所以我們指定一個名稱是「Gender」。然後我們提供一個列表的性別。這份名單是填充值「male」和「female」。因此,在輸出中,我們得到了一個單選按鈕,其具有兩個值。\u003c/p\u003e \n\u003cp\u003e 在第二個例子中,我們創建了一個複選框列表。這是收集用戶的愛好。用戶可以有一個以上的愛好,因此,我們所使用的複選框,而不是單選按鈕。該複選框被填充列表\"sports\", \"Tv\" 和 \"Shopping\"。這就提出了一個複選框列表的愛好。\u003c/p\u003e \n\u003ch2\u003e 選擇 UI 標籤:\u003c/h2\u003e \n\u003cp\u003e 讓我們來探討Struts提供的選擇標記的不同變化。讓我們來看看一個簡單的視圖頁的helloWorld.jsp的select標籤:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:head\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:form\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"login.action\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:select\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"username\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Username\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003elist\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"{'Mike','John','Smith'}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:select\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Company Office\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"mySelection\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{'America'}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003elist\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{#{'America':'America'}}\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:optgroup\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Asia\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003elist\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{#{'India':'India','China':'China'}}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:optgroup\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Europe\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003elist\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{#{'UK':'UK','Sweden':'Sweden','Italy':'Italy'}}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:select\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:combobox\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"My Sign\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"mySign\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003elist\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"#{'aries':'aries','capricorn':'capricorn'}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eheaderKey\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eheaderValue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"--- Please Select ---\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eemptyOption\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"capricorn\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:doubleselect\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Occupation\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"occupation\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003elist\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"{'Technical','Other'}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003edoubleName\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"occupations2\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003edoubleList\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"top == 'Technical' ? \r\n {'I.T', 'Hardware'} : {'Accounting', 'H.R'}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 當我們執行上述程序的輸出將看起來類似於以下內容:\u003c/p\u003e \n\u003cimg alt=\"Struts select UI tags\" src=\"https://asset.1ju.org/cmsstatic/struts2-21.jpg\"\u003e \n\u003cp\u003e 現在讓我們通過個別情況下,一個接一個。\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e 首先,select標籤生成的HTML選擇框。在第一個例子中,我們創建了一個簡單的選擇框「username」和「username」標籤。選擇框將被填充一個列表,其中包含Mike, John 和\u0026nbsp;Smith的名字。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 在第二個例子中,我們的公司總部設在美國。它還擁有全球辦事處,在亞洲和歐洲。我們要顯示一個選擇框辦事處,但大陸的名稱,我們要進行分組的全球辦事處。這是optgroup就派上用場了。我們使用s:optgroup標籤來創建新組。我們給一個標籤和一個單獨的列表。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 在第三個例子中,使用組合框。組合框是一個輸入字段和一個選擇框的組合。用戶可以選擇從選擇框中的值,在這種情況下,輸入字段自動填入用戶已選擇的值。如果用戶直接輸入一個值,然後選擇框沒有值將被選中。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 在我們的例子中,我們有太陽標誌的組合框列出。選擇框允許用戶輸入他的太陽星座,如果它不是在列表中只列出了四個條目。我們還添加一個頭項的選擇框。頭項是一個選擇框的頂部顯示。在我們的例子中,我們要顯示\u0026nbsp;\"Please Select\"。如果用戶不選擇什麼,那麼我們假設-1的值。在某些情況下,我們不希望用戶選擇一個空值。在這些條件下,一會的的「emptyOption」屬性設置爲false。最後,在我們的例子中,我們提供的「capricorn」組合框的默認值。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 第四個例子,我們有一個雙選。使用雙重選擇,當想顯示了兩個選擇框。在第一個選擇框選擇的值確定出現在第二個選擇框。在我們的例子中,第一個選擇框顯示\"Technical\" 和 \"Other\"。如果用戶選擇技術,我們將在第二個選擇框,顯示IT和硬件。否則,我們將顯示會計和人力資源。使用「list」和「doubleList」將屬性,如示例中所示,這是可能的。\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e 在上面的例子中,我們做了比較,看看如果頂部的選擇框等於介紹技術。如果確實如此,那麼,我們顯示IT和硬件。我們還需要給機頂盒的名稱(\"name='Occupations')和底下的框中(doubleName='occupations2')。\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"37:T1a7e,"])</script><script>self.__next_f.push([1,"\u003cp\u003e Struts使用Dojo框架的 AJAX標記實現。首先,這個例子中,你需要添加 struts2-dojo-plugin-2.2.3.jar。你可以得到這個文件的lib文件夾struts2的下載\u0026nbsp;(C:struts-2.2.3-allstruts-2.2.3libstruts2-dojo-plugin-2.2.3.jar)\u003c/p\u003e \n\u003cp\u003e 對於這個鍛鍊,讓我們修改 helloWorld.jsp如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"sx\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-dojo-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:head\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;sx:head\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;sx:autocompleter\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Favourite Colour\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003elist\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"{'red','green','blue'}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;br\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;sx:datetimepicker\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"deliverydate\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Delivery Date\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003edisplayFormat\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"dd/MM/yyyy\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;br\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:url\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"url\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"/hello.action\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;sx:div\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ehref\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{#url}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003edelay\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"2000\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Initial Content\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/sx:div\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;sx:tabbedpanel\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"tabContainer\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;sx:div\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Tab 1\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eTab 1\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/sx:div\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;sx:div\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Tab 2\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eTab 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/sx:div\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/sx:tabbedpanel\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 當我們運行上面的例子中,我們可以得到下面的輸出:\u003c/p\u003e \n\u003cimg alt=\"Struts Ajax tags\" src=\"https://asset.1ju.org/cmsstatic/struts2-ajax-1.jpg\"\u003e \n\u003cp\u003e 現在讓我們通過這個例子一步來。\u003c/p\u003e \n\u003cp\u003e 首先要注意的是另外一個新的標籤庫前綴\u0026nbsp;sx. \u0026nbsp;(struts-dojo-tags)是專門創建的標記庫的AJAX集成。\u003c/p\u003e \n\u003cp\u003e 然後在HTML頭,我們稱之爲sx:head。這將初始化Dojo框架,使得它準備爲所有的AJAX調用內頁。這一步很重要 - ,沒有sx:head初始化Ajax調用不會起作用。\u0026nbsp;\u003c/p\u003e \n\u003cp\u003e 首先,我們有自動完成標籤。自動完成標籤看起來很像一個選擇框。它填充了紅色,綠色和藍色的值。但之間的一個選擇框而這一次不同​​的是,它自動完成。也就是說,如果開始鍵入gr,這將填補它爲「green」。除此之外,這個標籤是非常相似s:select標籤,我們前面介紹。\u003c/p\u003e \n\u003cp\u003e 接下來,我們有一個日期時間選擇器。這個標籤創建一個輸入欄旁邊的一個按鈕。當按下按鈕時,彈出一個顯示日期和時間選擇器。當用戶選擇的日期,該日期將填充到輸入文本標記屬性中所指定的格式。在我們的例子中,我們指定dd/MM/yyyy\u0026nbsp;日期格式。\u0026nbsp;\u003c/p\u003e \n\u003cp\u003e 接下來我們創建一個URL標記的system.action在前面的練習中,我們創建的文件。它並不一定要的system.action - 它可以是任何行動您之前創建的文件。然後我們有一個div設置超鏈接的url和延遲設置爲2秒鐘。會發生什麼事而言,\"Initial Content\"將顯示2秒鐘,然後div的內容將被替換的內容從hello.action執行。\u003c/p\u003e \n\u003cp\u003e 最後,我們有一個簡單的選項卡面板有兩個選項卡。標籤的div標籤「選項卡1和Tab2。\u003c/p\u003e \n\u003cp\u003e 慢慢地隨着每一個版本,它應該是值得注意的AJAX標籤集成Struts,仍然是一個工作的進步和成熟整合。\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"38:T3f14,"])</script><script>self.__next_f.push([1,"\u003cp\u003e Spring是一個流行的Web框架,它提供易於集成與很多常見的網絡任務。所以,問題是,爲什麼我們需要Spring,當我們有Struts2?Spring是超過一個MVC框架 - 它提供了許多其它好用的東西,這是不是在Struts。例如:依賴注入可以是有用的任何框架。在本章中,我們將通過一個簡單的例子來看看如何集成Spring和Struts2一起。\u003c/p\u003e \n\u003cp\u003e 首先,需要添加下列文件到項目的構建路徑從Spring安裝。您可以下載並安裝最新版本的Spring框架從\u0026nbsp;\u003ca href=\"http://www.springsource.org/download\"\u003ehttp://www.springsource.org/download\u003c/a\u003e\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e org.springframework.asm-x.y.z.M(a).jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e org.springframework.beans-x.y.z.M(a).jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e org.springframework.context-x.y.z.M(a).jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e org.springframework.core-x.y.z.M(a).jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e org.springframework.expression-x.y.z.M(a).jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e org.springframework.web-x.y.z.M(a).jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e org.springframework.web.servlet-x.y.z.M(a).jar\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e 最後加入struts2-spring-plugin-x.y.z.jar在WEB-INF/lib從struts的lib目錄。如果使用的是Eclipse,那麼可能會面臨一個異常的java.lang.ClassNotFoundException異常:org.springframework.web.context.ContextLoaderListener。爲了解決這個問題,應該在一類依賴的標記標籤右上點擊快速修復發佈/導出所有的依賴關係。最後,確保不存在依賴衝突標記「選項卡下。\u003c/p\u003e \n\u003cimg alt=\"Struts and Sprint Integration\" src=\"https://asset.1ju.org/cmsstatic/struts2spring-1.gif\"\u003e \n\u003cp\u003e 現在讓我們來設置web.xml中的Struts-Spring集成如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n\t\u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n\thttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;listener\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;listener-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.springframework.web.context.ContextLoaderListener\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/listener-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/listener\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 這裏要注意的最重要的事情是我們已經配置了監聽器。 ContextLoaderListener的需要加載Spring上下文文件。 Spring的配置文件名爲applicationContext.xml文件,它必須放置在同一水平web.xml文件\u003c/p\u003e \n\u003cp\u003e 讓我們創建一個簡單的動作類稱爲User.java的兩個屬性 - firstName和lastName。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eUser\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e firstName\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e lastName\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getFirstName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e firstName\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setFirstName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e firstName\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003efirstName \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e firstName\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getLastName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e lastName\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setLastName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e lastName\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003elastName \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e lastName\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 現在,讓我們一起創造了applicationContext.xml spring 配置文件並創建實例User.java類。正如前面提到的,這個文件應該在WEB-INF文件夾下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE beans PUBLIC \"-//SPRING//DTD BEAN//EN\" \r\n\"http://www.springframework.org/dtd/spring-beans.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;beans\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;bean\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"userClass\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.User\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"firstName\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Michael\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"lastName\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Jackson\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/bean\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/beans\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 正如上面看到的,我們已經配置了用戶bean,我們放值\u003cb\u003eMichael\u003c/b\u003e\u003cspan\u003e和\u003c/span\u003e\u003cb\u003eJackson\u003c/b\u003e到bean。我們也給這個bean名稱「userClass」,這樣我們就可以重用在其他地方。接下來,讓我們在WebContent文件夾中創建由user.jsp:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\tpageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;h1\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World From Struts2 - Spring integration\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/h1\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:textfield\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"firstName\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"First Name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:textfield\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"lastName\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Last Name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 由user.jsp文件相當直接。它只有一個目的 - 顯示的名字和姓氏的用戶對象的值。最後,讓我們把所有的實體一起使用struts.xml文件。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"user\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"userClass\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/User.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 重要的是要注意的是,我們使用id userClass的引用類。這意味着,我們使用的是spring\u0026nbsp;做的User類的依賴注入。\u003c/p\u003e \n\u003cp\u003e 現在右擊項目名稱,並單擊Export \u0026gt; WAR File創建一個WAR文件。然後部署這個WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/User.jsp。這會給你以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Struts and Spring Integration\" src=\"https://asset.1ju.org/cmsstatic/struts2spring-2.gif\"\u003e \n\u003cp\u003e 現在我們已經看到了如何將兩個偉大的框架 Struts - Spring集成。\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"39:T54e4,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 在本章中,讓我們通過Struts2的集成Tiles框架所涉及的步驟。 Apache的Tiles是一個內置的模板框架來簡化Web應用程序用戶界面的開發。\u003c/p\u003e \n\u003cp\u003e 首先,我們需要從\u003ca href=\"http://tiles.apache.org/\"\u003eApache Tiles\u003c/a\u003e\u0026nbsp;網站下載的files jar文件。需要添加下面的jar文件添加到項目的類路徑。\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e tiles-api-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e tiles-compat-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e tiles-core-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e tiles-jsp-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e tiles-servlet-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e 除了上述,我們必須下載複製下面的jar文件到WEB-INF/lib。\u0026nbsp;.\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e commons-beanutils-x.y.zjar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e commons-digester-x.y.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e struts2-tiles-plugin-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e 現在,讓我們設置web.xml Struts-Tiles\u0026nbsp;集成。有兩個重要的點,這裏要注意的。首先,我們需要告訴tiles配置文件tiles.xml在哪裏可以找到。在我們的案例中,這將是在/WEB-INF文件夾下。接下來,我們需要初始化tiles偵聽器,配備了Struts2下載。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"2.5\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts2Example15\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;context-param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param-value\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n /WEB-INF/tiles.xml\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param-value\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/context-param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;listener\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;listener-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.tiles.StrutsTilesListener\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/listener-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/listener\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 接下來,讓我們一起創建 tiles.xml在/WEB-INF文件夾下包含以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE tiles-definitions PUBLIC\r\n \"-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN\"\r\n \"http://tiles.apache.org/dtds/tiles-config_2_0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;tiles-definitions\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;definition\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"baseLayout\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etemplate\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"/baseLayout.jsp\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;put-attribute\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"title\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Template\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;put-attribute\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"banner\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"/banner.jsp\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;put-attribute\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"menu\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"/menu.jsp\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;put-attribute\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"body\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"/body.jsp\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;put-attribute\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"footer\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"/footer.jsp\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/definition\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;definition\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"tiger\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"baseLayout\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;put-attribute\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"title\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Tiger\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;put-attribute\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"body\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"/tiger.jsp\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/definition\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;definition\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"lion\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"baseLayout\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;put-attribute\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"title\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Lion\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;put-attribute\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"body\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"/lion.jsp\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/definition\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/tiles-definitions\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 文部科學省。我們定義了一個基本框架在baseLayout.jsp佈局。它有5個可重複使用/重寫地區。即標題,橫幅,菜單,主體和頁腳。在baselayout 我們提供了默認值,然後我們創建了兩個自定義擴展的默認佈局。tiger佈局的基本佈局是相似的,除了它使用它的主體和文本「tiger」爲題的tiger.jsp。同樣,lion的佈局是相似的基本佈局,除了它使用lion.jsp,作爲其主體和「lion」作爲標題的文本。\u003c/p\u003e \n\u003cp\u003e 讓我們一起來看看在個別jsp文件。以下是內容的baseLayout.jsp文件:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"http://tiles.apache.org/tags-tiles\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"tiles\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\r\n \"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;meta\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ehttp-equiv\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Content-Type\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003econtent\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u0026lt;tiles:insertAttribute\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"title\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eignore\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;tiles:insertAttribute\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"banner\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;hr/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;tiles:insertAttribute\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"menu\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;hr/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;tiles:insertAttribute\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"body\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;hr/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;tiles:insertAttribute\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"footer\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在這裏,我們只是把一個基本的HTML頁面,瓷磚屬性。我們插入tiles\u0026nbsp;屬性,我們需要他們的地方。接下來,就讓我們創建banner.jsp文件包含以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;img\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003esrc\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.yiibai.com/images/tp-logo.gif\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 引入menu.jsp文件將有下面的線是鏈接 - TigerMenu.action和Struts動作LionMenu.action。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%\u003c/span\u003e\u003cspan class=\"lit\"\u003e@taglib\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\r\n\u0026lt;a href=\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:url\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"tigerMenu\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\" Tiger\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/a\u0026gt;\u0026lt;br\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u0026lt;a href=\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:url\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"lionMenu\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\" Lion\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/a\u0026gt;\u0026lt;br\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e lion.jsp文件將有以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;img\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003esrc\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://upload.wikimedia.org/wikipedia/commons/d/d2/Lion.jpg\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\nThe lion\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e tiger.jsp文件將有以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;img\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003esrc\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.freewebs.com/tigerofdarts/tiger.jpg\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\nThe tiger\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 接下來,讓我們來創建包含以下動作類文件MenuAction.java:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eMenuAction\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e tiger\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"tiger\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e lion\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"lion\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 這是一個相當直截了當類。我們聲明兩種方tiger()和lion()返回老虎和獅子的成果分別。讓我們把它都聚集在struts.xml文件:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"default\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result-types\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result-type\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"tiles\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"org.apache.struts2.views.tiles.TilesResult\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result-types\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"*Menu\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"{1}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.MenuAction\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"tiger\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"tiles\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003etiger\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"lion\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"tiles\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003elion\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 讓我們檢查我們所做的事情在上述文件中。首先,我們聲明一個新的結果類型,稱爲「tiles」,現在我們是用tiles,而不是簡單的JSP視圖技術。Struts2的tiles支持查看結果類型,所以我們創建的結果類型是「org.apache.struts2.view.tiles.TilesResult」類的「tiles」。\u003c/p\u003e \n\u003cp\u003e 接下來,我們想說,如果請求的是/tigerMenu.action採取「tiger tiles」頁面,用戶如果請求的是/lionMenu.action採取用戶lion tiles頁面。\u003c/p\u003e \n\u003cp\u003e 爲此,我們使用了一點的正則表達式。在我們的行動定義,我們說任何匹配模式「*菜單」,將通過這一行動來處理。匹配方法將被調用在MenuAction類。也就是說,tigerMenu.action將調用\u0026nbsp;tiger(),lionMenu.action將調用\u0026nbsp;lion()。然後,我們需要的結果的結果映射到適當的tiles\u0026nbsp;頁。\u003c/p\u003e \n\u003cp\u003e 現在右擊項目名稱,並單擊Export \u0026gt; WAR File創建一個WAR文件。然後部署這個WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/tigerMenu.jsp。這會給你以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Struts and Tiles Integration\" src=\"https://asset.1ju.org/cmsstatic/struts2tiles-1.gif\"\u003e \n\u003cp\u003e 同樣,如果你轉到lionMenu.action的頁面,你會看到獅子頁使用相同的tiles\u0026nbsp;佈局。\u0026nbsp;\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"3a:T9e4d,"])</script><script>self.__next_f.push([1,"\u003cp\u003e Hibernate是一個高性能的對象/關係持久性和查詢服務許可下的開源GNU通用公共許可證(LGPL),並免費下載。在這一章中,我們要學習如何實現Struts2與Hibernate集成。如果你不熟悉與Hibernate,那麼可以查看我們的Hibernate教程。\u003c/p\u003e \n\u003ch2\u003e 數據庫設置:\u003c/h2\u003e \n\u003cp\u003e 在本教程中,我會使用「struts2_tutorial」MySQL數據庫。我連接到我的機器上使用這個數據庫的用戶名「root」,並且沒有密碼。首先,你需要運行下面的腳本。此腳本創建稱爲student\u0026nbsp;,並創建一個新的表,此表中的記錄數:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003eCREATE TABLE IF NOT EXISTS \u003c/span\u003e\u003cspan class=\"str\"\u003e`student`\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"str\"\u003e`id`\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"lit\"\u003e11\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e NOT NULL AUTO_INCREMENT\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"str\"\u003e`first_name`\u003c/span\u003e\u003cspan class=\"pln\"\u003e varchar\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"lit\"\u003e40\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e NOT NULL\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"str\"\u003e`last_name`\u003c/span\u003e\u003cspan class=\"pln\"\u003e varchar\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"lit\"\u003e40\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e NOT NULL\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"str\"\u003e`marks`\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"lit\"\u003e11\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e NOT NULL\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n PRIMARY KEY \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e`id`\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e--\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e--\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eDumping\u003c/span\u003e\u003cspan class=\"pln\"\u003e data \u003c/span\u003e\u003cspan class=\"kwd\"\u003efor\u003c/span\u003e\u003cspan class=\"pln\"\u003e table \u003c/span\u003e\u003cspan class=\"str\"\u003e`student`\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e--\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\nINSERT INTO \u003c/span\u003e\u003cspan class=\"str\"\u003e`student`\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e`id`\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e`first_name`\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e`last_name`\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e`marks`\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n VALUES\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"lit\"\u003e1\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e'George'\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e'Kane'\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"lit\"\u003e20\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\nINSERT INTO \u003c/span\u003e\u003cspan class=\"str\"\u003e`student`\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e`id`\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e`first_name`\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e`last_name`\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e`marks`\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n VALUES\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"lit\"\u003e2\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e'Melissa'\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e'Michael'\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"lit\"\u003e91\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\nINSERT INTO \u003c/span\u003e\u003cspan class=\"str\"\u003e`student`\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e`id`\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e`first_name`\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e`last_name`\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e`marks`\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n VALUES\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"lit\"\u003e3\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e'Jessica'\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e'Drake'\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"lit\"\u003e21\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e Hibernate的配置:\u003c/h2\u003e \n\u003cp\u003e 接下來讓我們創建這是Hibernate的配置文件hibernate.cfg.xml中。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e'1.0'\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e'utf-8'\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE hibernate-configuration PUBLIC\r\n\"-//Hibernate/Hibernate Configuration DTD//EN\"\r\n\"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;hibernate-configuration\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;session-factory\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hibernate.connection.driver_class\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003ec\r\n om.mysql.jdbc.Driver\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/property\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hibernate.connection.url\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n jdbc:mysql://www.yiibai.com/struts_tutorial\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/property\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hibernate.connection.username\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eroot\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/property\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hibernate.connection.password\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u0026lt;/property\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hibernate.connection.pool_size\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e10\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/property\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"show_sql\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003etrue\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/property\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"dialect\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.hibernate.dialect.MySQLDialect\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/property\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hibernate.hbm2ddl.auto\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eupdate\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/property\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;mapping\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.hibernate.Student\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/session-factory\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/hibernate-configuration\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 讓我們通過hibernate的配置文件。首先,我們正在使用的MySQL驅動程序。然後,我們聲明 JDBC URL連接到數據庫。然後,聲明連接的用戶名,密碼以及池的大小。我們也表示,我們希望「show_sql」轉向真正看到SQL的日誌文件中。請經過Hibernate教程,瞭解這些屬性是什麼意思。最後,我們設置了的映射類com.yiibai.hibernate.Student,我們將本章中創建。\u003c/p\u003e \n\u003ch2\u003e 環境設置:\u003c/h2\u003e \n\u003cp\u003e 接下來,這個項目需要一大堆的jar文件。附所需的JAR文件的完整列表的截圖:\u003c/p\u003e \n\u003cimg alt=\"Struts and Hibernate Jars\" src=\"https://asset.1ju.org/cmsstatic/struts2hibernate-1.gif\"\u003e \n\u003cp\u003e 大部分的JAR文件可以作爲Struts的分佈的一部分。如果有一個如GlassFish應用服務器,WebSphere或JBoss安裝,那麼可以得到的大部分jar文件從應用服務器的lib文件夾。如果沒有,可以單獨下載的文件:\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e Hibernate jar files -\u0026nbsp;\u003ca href=\"http://www.hibernate.org/\"\u003eHibernate.org\u003c/a\u003e\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e Struts hibernate plugin -\u0026nbsp;\u003ca href=\"http://code.google.com/p/full-hibernate-plugin-for-struts2/downloads/list\"\u003eStruts hibernate plugin\u003c/a\u003e\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e JTA files-\u0026nbsp;\u003ca href=\"http://www.oracle.com/technetwork/java/javaee/jta/index.htmll\"\u003eJTA files\u003c/a\u003e\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e Dom4j files -\u0026nbsp;\u003ca href=\"http://dom4j.sourceforge.net/\"\u003eDom4j\u003c/a\u003e\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e SLF4J files -\u0026nbsp;\u003ca href=\"http://www.slf4j.org/\"\u003eSLF4J\u003c/a\u003e\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e log4j files -\u0026nbsp;\u003ca href=\"http://logging.apache.org/log4j/1.2/\"\u003elog4j\u003c/a\u003e\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e 其餘的文件,應該能夠從struts2的分發得到。\u003c/p\u003e \n\u003ch2\u003e Hibernate 類:\u003c/h2\u003e \n\u003cp\u003e 現在讓我們來創建Hibernate集成所需的Java類。以下內容Student.java:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ehibernate\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e javax\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003epersistence\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eColumn\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e javax\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003epersistence\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eEntity\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e javax\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003epersistence\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eGeneratedValue\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e javax\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003epersistence\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eId\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e javax\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003epersistence\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eTable\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"lit\"\u003e@Entity\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"lit\"\u003e@Table\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"student\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eStudent\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@Id\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@GeneratedValue\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e id\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@Column\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"last_name\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e lastName\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@Column\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"first_name\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e firstName\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e marks\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e getId\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e id\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setId\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e id\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eid \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e id\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getLastName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e lastName\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setLastName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e lastName\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003elastName \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e lastName\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getFirstName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e firstName\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setFirstName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e firstName\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003efirstName \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e firstName\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e getMarks\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e marks\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setMarks\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e marks\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003emarks \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e marks\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 這是一個POJO類,Hibernate的規範表。它擁有屬性id,firstName和lastName學生表中的列名對應。接下來讓我們創建StudentDAO.java文件如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ehibernate\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eArrayList\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e org\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ehibernate\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eSession\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e org\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ehibernate\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eTransaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egooglecode\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003es2hibernate\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eplugin\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n annotations\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eSessionTarget\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egooglecode\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003es2hibernate\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eplugin\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n annotations\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eTransactionTarget\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eStudentDAO\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@SessionTarget\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eSession\u003c/span\u003e\u003cspan class=\"pln\"\u003e session\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@TransactionTarget\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eTransaction\u003c/span\u003e\u003cspan class=\"pln\"\u003e transaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@SuppressWarnings\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"unchecked\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"typ\"\u003eStudent\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e getStudents\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"typ\"\u003eStudent\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e students \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eArrayList\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"typ\"\u003eStudent\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026gt;();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003etry\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n students \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e session\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ecreateQuery\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"from Student\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e).\u003c/span\u003e\u003cspan class=\"pln\"\u003elist\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ecatch\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e e\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n e\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eprintStackTrace\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e students\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e addStudent\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eStudent\u003c/span\u003e\u003cspan class=\"pln\"\u003e student\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n session\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esave\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003estudent\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e StudentDAO類,學生類是數據訪問層。它有一些方法來列出所有學生,然後保存一個新的學生記錄。\u003c/p\u003e \n\u003ch2\u003e 動作類:\u003c/h2\u003e \n\u003cp\u003e 以下文件AddStudentAction.java定義我們的動作類。我們這裏有兩個動作方法 -\u0026nbsp;execute() 和 listStudents()。 execute()方法是用來添加新的學生記錄。使用DAO的save()方法來實現這一目標。另一種方法,listStudents()用來列出學生。我們使用DAO的的列表方法得到所有學生的名單。\u0026nbsp;\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eArrayList\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eModelDriven\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ehibernate\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eStudent\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ehibernate\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eStudentDAO\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eAddStudentAction\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eimplements\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eModelDriven\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"typ\"\u003eStudent\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026gt;{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eStudent\u003c/span\u003e\u003cspan class=\"pln\"\u003e student \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eStudent\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"typ\"\u003eStudent\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e students \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eArrayList\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"typ\"\u003eStudent\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026gt;();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eStudentDAO\u003c/span\u003e\u003cspan class=\"pln\"\u003e dao \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eStudentDAO\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@Override\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eStudent\u003c/span\u003e\u003cspan class=\"pln\"\u003e getModel\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e student\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n dao\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eaddStudent\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003estudent\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e listStudents\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n students \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e dao\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egetStudents\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eStudent\u003c/span\u003e\u003cspan class=\"pln\"\u003e getStudent\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e student\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setStudent\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eStudent\u003c/span\u003e\u003cspan class=\"pln\"\u003e student\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estudent \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e student\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"typ\"\u003eStudent\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e getStudents\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e students\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setStudents\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"typ\"\u003eStudent\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e students\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estudents \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e students\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 實現ModelDriven接口你會注意到,這是用來當你的操作類處理一個具體的模型類(如學生),而不是個人屬性(如名字,姓氏)。的ModelAware接口需要實現的方法,以返回到模型。在我們的例子中,我們返回「學生」對象。\u003c/p\u003e \n\u003ch2\u003e 創建視圖文件:\u003c/h2\u003e \n\u003cp\u003e 現在讓我們創建student.jsp視圖文件包含以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:head\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:form\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"addStudent\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:textfield\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"firstName\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"First Name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:textfield\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"lastName\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Last Name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:textfield\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"marks\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Marks\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:submit/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;hr/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;table\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;tr\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;td\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eFirst Name\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/td\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;td\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eLast Name\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/td\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;td\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eMarks\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/td\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/tr\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:iterator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"students\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\t\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;tr\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;td\u0026gt;\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"firstName\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;/td\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;td\u0026gt;\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"lastName\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;/td\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;td\u0026gt;\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"marks\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;/td\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/tr\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\t\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/table\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 非常簡單student.jsp。在上面的部分,我們有一個形式提交到「addStudent.action」。這需要在名字,姓氏和備註。因爲addStudent 動作,自動綁到ModelAware的「AddSudentAction」,將創建一個學生bean的名字,姓氏和標記自動填充的值。\u003c/p\u003e \n\u003cp\u003e 在底部,我們去通過的學生名單(見AddStudentAction.java)。我們遍歷列表和顯示的值在表中的姓氏,名稱和備註。\u003c/p\u003e \n\u003ch2\u003e Struts 配置:\u003c/h2\u003e \n\u003cp\u003e 讓我們把它放在一起使用struts.xml:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myhibernate\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hibernate-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"addStudent\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.AddStudentAction\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"redirect\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n listStudents\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"listStudents\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"listStudents\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.AddStudentAction\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/students.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 這裏要注意的最重要的事情是,我們包函「myhibernate」擴展Struts2默認包稱爲「hibernate-default」。然後我們聲明兩個動作 - addStudent和listStudents。 addStudent調用execute()上AddStudentAction類,然後,它調用listStudents操作方法successs。\u003c/p\u003e \n\u003cp\u003e listStudent動作方法調用listStudents()上AddStudentAction類作爲視圖,並使用student.jsp\u003c/p\u003e \n\u003cp\u003e 現在右擊項目名稱,並單擊Export \u0026gt; WAR\u0026nbsp;文件創建一個WAR文件。然後部署這個WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/student.jsp。這會給你以下畫面:\u0026nbsp;\u003c/p\u003e \n\u003cimg alt=\"Struts and Hibernate Result\" src=\"https://asset.1ju.org/cmsstatic/struts2hibernate-2.gif\"\u003e \n\u003cp\u003e 在上面的部分,我們得到的一種形式,進入一個新的學生記錄和底部列出了學生在數據庫中的值。繼續並添加一個新的學生記錄,按提交。屏幕將刷新並顯示您的更新列表。\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"3b:T1caf,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 在這個例子中,我們將學習如何在Struts 2中創建一個Hello World例子。 \u003c/p\u003e \n\u003cp\u003e 使用以下庫或工具: \u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e MyEclipse 10 \u003c/li\u003e \n \u003cli\u003e Struts 2.1 \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e 整個工程結構如下圖所示: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts-2-hello-world-xml-1.png\" alt=\"Struts 2 hello world (XML版本)\"\u003e \u003c/p\u003e \n\u003ch2\u003e 1. 創建一個Web項目工程 \u003c/h2\u003e \n\u003cp\u003e 啓動打開 MyEclipse,創建一個Web工程名稱爲:struts2-xml-demo,選擇 File -\u0026gt; New -\u0026gt; Web Project ,如下圖所示: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts-2-hello-world-xml-2.png\" alt=\"Struts 2 hello world (XML版本)\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003c/p\u003e \n\u003cp\u003e 在這個項目上添加 struts2 的支持,右鍵點擊\u0026nbsp;struts2-xml-demo 工程,選擇 MyEclipse -\u0026gt; Add Struts Capabilities,在彈出的對話框中選擇 Strut 2.1,如下圖所示: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts-2-hello-world-xml-3.png\" alt=\"Struts 2 hello world (XML版本)\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003c/p\u003e \n\u003ch2\u003e 2. JSP視圖文件 \u003c/h2\u003e \n\u003cp\u003e 這是一個JSP登錄頁面,它使用Struts2標籤來顯示用戶名,密碼輸入框和提交按鈕。 \u003c/p\u003e \n\u003cp\u003e Fie : login.jsp \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-html\"\u003e\u0026lt;%@ page contentType=\"text/html; charset=UTF-8\"%\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\"%\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n\t\u0026lt;h1\u0026gt;Struts 2 Hello World Example\u0026lt;/h1\u0026gt;\r\n\r\n\t\u0026lt;s:form action=\"Welcome\"\u0026gt;\r\n\t\t\u0026lt;s:textfield name=\"username\" label=\"Username\" /\u0026gt;\r\n\t\t\u0026lt;s:password name=\"password\" label=\"Password\" /\u0026gt;\r\n\t\t\u0026lt;s:submit /\u0026gt;\r\n\t\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cp\u003e \u003cem\u003e文件: welcome_user.jsp\u003c/em\u003e\u0026nbsp;– 一個JSP視圖用來頁面顯示歡迎信息給用戶。 \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-html\"\u003e\u0026lt;%@ page contentType=\"text/html; charset=UTF-8\"%\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\"%\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n\t\u0026lt;h1\u0026gt;Struts 2 Hello World 示例\u0026lt;/h1\u0026gt;\r\n\r\n\t\u0026lt;h2\u0026gt;\r\n\t\tHello\r\n\t\t\u0026lt;s:property value=\"username\" /\u0026gt;\r\n\t\u0026lt;/h2\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 對 Struts1 和 Struts2 有非常相似的UI標籤語法,只是在命名HTML元素,例如,術語有一點不同: \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eStruts 1\u003c/strong\u003e \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003e \u003c/strong\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-html\"\u003e\u0026lt;%@taglib uri=\"http://struts.apache.org/tags-html\" prefix=\"html\"%\u0026gt;\r\n\u0026lt;html:form action=\"Welcome\"\u0026gt;\r\n \u0026lt;html:text property=\"username\"/\u0026gt;\r\n\u0026lt;/html:form\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eStruts 2\u003c/strong\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-html\"\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;s:form action=\"Welcome\"\u0026gt;\r\n\t\u0026lt;s:textfield name=\"username\" label=\"Username\"/\u0026gt;\r\n\u0026lt;/s:form\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. 動作,所有的業務邏輯放在這裏 \u003c/h2\u003e \n\u003cp\u003e 一個簡單的 Struts2 的 Action 類,它裏面聲明的所有業務邏輯。 \u003c/p\u003e \n\u003cp\u003e File : WelcomeUserAction.java \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-java\"\u003epackage com.yiibai.user.action;\r\n\r\n/**\r\n * \r\n * @author yiibai.com\r\n *\r\n */\r\npublic class WelcomeUserAction {\r\n\t\r\n\tprivate String username;\r\n\r\n\tpublic String getUsername() {\r\n\t\treturn username;\r\n\t}\r\n\r\n\tpublic void setUsername(String username) {\r\n\t\tthis.username = username;\r\n\t}\r\n\r\n\t// all struts logic here\r\n\tpublic String execute() {\r\n\r\n\t\treturn \"SUCCESS\";\r\n\r\n\t}\r\n}\u003c/pre\u003e \n\u003cp\u003e 在Struts2中,Action類實現任何接口或擴展任何類不是必需的,但它需要創建一個execute()方法來實現所有的業務邏輯,並返回一個字符串值,告訴用戶重定向到哪裏。 \u003c/p\u003e \n\u003cdiv\u003e\n 注意 \n \u003cbr\u003e 您可能會看到一些用戶實現 com.opensymphony.xwork2.Action 類, 但它是完全可選的(不是必須的),因爲com.opensymphony.xwork2.Action只是提供一些方便的常量。 \n\u003c/div\u003e \n\u003cdiv\u003e\n Struts1中的Action類需要擴展org.apache.struts.action.Action。 但是,Struts 2的Action類是可選的,但是仍然允許執行com.opensymphony.xwork2.Action的一些方便的常量,或者擴展com.opensymphony.xwork2.ActionSupport 對於一些常見的默認動作執行的功能。 \n\u003c/div\u003e \n\u003ch2\u003e 5. Struts配置文件 \u003c/h2\u003e \n\u003cp\u003e Strut配置文件是用來連接所有的東西在一起。 XML文件名必須是\u0026nbsp;「struts.xml」。在這個實例中,它位於\u0026nbsp; \u003c/p\u003e \n\u003cp\u003e \u003cem\u003eFile : struts.xml\u003c/em\u003e \u003c/p\u003e \n\u003cp\u003e \u003cem\u003e \u003c/em\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-xml\"\u003e\u003cem\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC \"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN\" \"http://struts.apache.org/dtds/struts-2.1.dtd\"\u0026gt;\r\n\u0026lt;struts\u0026gt;\r\n\t\u0026lt;package name=\"user\" namespace=\"/User\" extends=\"struts-default\"\u0026gt;\r\n\t\t\u0026lt;action name=\"Login\"\u0026gt;\r\n\t\t\t\u0026lt;result\u0026gt;/login.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\u0026lt;action name=\"Welcome\" class=\"com.yiibai.user.action.WelcomeUserAction\"\u0026gt;\r\n\t\t\t\u0026lt;result name=\"SUCCESS\"\u0026gt;/welcome_user.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt; \u003c/em\u003e\u003c/pre\u003e \n\u003cem\u003e \u003c/em\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cp\u003e 聲明包和包含動作類,動作類是不言自明的,但你仍可能會感興趣下面的新標籤: \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003e1. package name=」user」\u003c/strong\u003e\u003cbr\u003e 就在包名,並不真正去關心它。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003e2. namespace=」/User」\u003c/strong\u003e\u003cbr\u003e 它用於匹配「/User」URL模式。 \u003c/p\u003e \n\u003cdiv\u003e\n 注意 \n \u003cbr\u003e 實際上,Struts2的命名空間相當於Struts的1多個功能模塊 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003e3. extends=」struts-default」\u003c/strong\u003e\u003cbr\u003e 這意味着該包是擴展了struts-default 包組件和攔截器,這是在struts-default.xml中文件中聲明的,位於struts2-core.jar 文件的根目錄。 \u003c/p\u003e \n\u003ch2\u003e 6. web.xml \u003c/h2\u003e \n\u003cp\u003e 配置Web應用程序部署描述符(web.xml)文件Struts2的集成到Web項目。 \u003c/p\u003e \n\u003cp\u003e \u003cem\u003eFile web.xml\u003c/em\u003e \u003c/p\u003e \n\u003cp\u003e \u003cem\u003e \u003c/em\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-xml\"\u003e\u003cem\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\"?\u0026gt;\r\n\u0026lt;web-app version=\"3.0\" \r\n\txmlns=\"http://java.sun.com/xml/ns/javaee\" \r\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" \r\n\txsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee \r\n\thttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u0026gt;\r\n \u0026lt;display-name\u0026gt;\u0026lt;/display-name\u0026gt;\t\r\n \u0026lt;welcome-file-list\u0026gt;\r\n \u0026lt;welcome-file\u0026gt;index.jsp\u0026lt;/welcome-file\u0026gt;\r\n \u0026lt;/welcome-file-list\u0026gt;\r\n \u0026lt;filter\u0026gt;\r\n \t\u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n \t\u0026lt;filter-class\u0026gt;\r\n \t\torg.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter\r\n \t\u0026lt;/filter-class\u0026gt;\r\n \u0026lt;/filter\u0026gt;\r\n \u0026lt;filter-mapping\u0026gt;\r\n \t\u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n \t\u0026lt;url-pattern\u0026gt;*.action\u0026lt;/url-pattern\u0026gt;\r\n \u0026lt;/filter-mapping\u0026gt;\u0026lt;/web-app\u0026gt;\u003c/em\u003e\u003c/pre\u003e \n\u003ch2\u003e 7. 運行測試結果 \u003c/h2\u003e \n\u003cp\u003e 在Struts2中,可以直接使用.action後綴訪問操作類。如下URL: \u003c/p\u003e \n\u003cp\u003e http://localhost:8080/struts2-xml-demo/User/Login.action \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts-2-hello-world-xml-4.png\" alt=\"Struts 2 hello world (XML版本)\"\u003e \u003c/p\u003e \n\u003cp\u003e 提交後到 http://localhost:8080/Struts2Example/User/Welcome.action 顯示如下: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts-2-hello-world-xml-5.png\" alt=\"Struts 2 hello world (XML版本)\"\u003e \u003c/p\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"3c:T2078,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e\n 在這個教程,我們重複使用以前 STRUST2 \u0026nbsp;Hello\u0026nbsp;World(XML版本)的例子,並將其轉換成註解版本。 \n\u003c/div\u003e \n\u003ch2\u003e Struts2\u0026nbsp;註解概念 \u003c/h2\u003e \n\u003cdiv\u003e\n Struts2註解是由Struts\u0026nbsp;2的約定插件的支持,所以,必須要了解其背後的「掃描方法」和「命名轉換」機制的魔力。 \n\u003c/div\u003e \n\u003ch2\u003e 1.\u0026nbsp;掃描方法 \u003c/h2\u003e \n\u003cdiv\u003e\n 許多Struts\u0026nbsp;2的文章或書籍說,可以配置過濾器的「init-param」或「struts.convention.action.packages」告訴Struts2,其中掃描註解的類。\u0026nbsp;例如, \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eweb.xml\u003c/strong\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-xml\"\u003e\u0026lt;filter\u0026gt;\r\n \u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n \u0026lt;filter-class\u0026gt;org.apache.struts2.dispatcher.FilterDispatcher\u0026lt;/filter-class\u0026gt;\r\n \u0026lt;init-param\u0026gt;\r\n\t\u0026lt;param-name\u0026gt;actionPackages\u0026lt;/param-name\u0026gt;\r\n\t\u0026lt;param-value\u0026gt;com.yiibai.common\u0026lt;/param-value\u0026gt;\r\n \u0026lt;/init-param\u0026gt;\r\n\u0026lt;/filter\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 從測試(Struts22.1.6和2.1.8版本),這是不正確的,不管你把在「param-value」還是\u0026nbsp;「struts.convention.action.packages「,\u0026nbsp;在Struts\u0026nbsp;2會忽略它,並只掃描指定的文件夾命名:struts,\u0026nbsp;struts2,\u0026nbsp;action\u0026nbsp;或\u0026nbsp;actions\u0026nbsp;。 \u003c/p\u003e \n\u003cdiv\u003e\n 下面是掃描工作 \n\u003c/div\u003e \n\u003col\u003e \n \u003cli\u003e 掃描其位於包的命名註解的類\u0026nbsp;「struts, struts2, action 或 actions「. \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 接着,掃描相匹配下列任一條件的文件: \n \u003c/div\u003e \n \u003cul\u003e \n \u003cli\u003e 實例了\u0026nbsp;com.opensymphony.xwork2.Action\u0026nbsp;接口。 \u003c/li\u003e \n \u003cli\u003e 擴展了\u0026nbsp;com.opensymphony.xwork2.ActionSupport\u0026nbsp;類 \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 文件名用動作(例如:UserAction,LoginAction)結束 \n \u003c/div\u003e \u003c/li\u003e \n \u003c/ul\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e 詳細請查看這裏\u003ca href=\"http://struts.apache.org/docs/convention-plugin.html#ConventionPlugin-Codebehindhelloworld\"\u003eStruts 2\u0026nbsp;約定插件文件\u003c/a\u003e \u003c/p\u003e \n\u003ch2\u003e 2.\u0026nbsp;命名轉換器 \u003c/h2\u003e \n\u003cdiv\u003e\n Struts\u0026nbsp;2的約定插件將所有的註解操作文件名轉換爲指定的格式。 \n\u003c/div\u003e \n\u003cp\u003e 例如 :\u0026nbsp;LoginAction.java \u003c/p\u003e \n\u003col\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 首先,去掉「Action」字符在文件名的末尾,如果存在的話。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 其次,轉換文件名的第一個字母爲小寫。 \n \u003c/div\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv\u003e\n 因此,去除結束並轉換第一個字母爲小寫後,LoginAction.action 將變爲 login.action。 \n\u003c/div\u003e \n\u003cdiv\u003e\n Struts2約定插件的「掃描方法」和「命名轉換」特性真正帶來了很多的便利和好處,只有當你的Struts2項目正確下面的命名約定纔會帶來好處; 否則,這將是一場災難。 \n\u003c/div\u003e \n\u003ch2\u003e Struts 2\u0026nbsp;註解例子 \u003c/h2\u003e \n\u003cdiv\u003e\n 現在是時候開始轉換過程了,我們使用MyEclipse 10 創建一個工程爲:struts2example。 \n\u003c/div\u003e \n\u003ch2\u003e \u003cp\u003e 最終的項目結構 \u003c/p\u003e \u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-1.png\" alt=\"Struts2註解示例\"\u003e \u003c/p\u003e \u003c/h2\u003e \n\u003ch2\u003e 2. LoginAction \u003c/h2\u003e \n\u003cp\u003e 擴展ActionSupport並創建了LoginAction,什麼也不做,ActionSupport\u0026nbsp;默認返回 「success」 字符串,這將匹配\u0026nbsp;@Result 並重定位到 「pages/login.jsp「. \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003e註解版本\u003c/strong\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-java\"\u003epackage com.yiibai.user.action;\r\n\r\nimport org.apache.struts2.convention.annotation.Namespace;\r\nimport org.apache.struts2.convention.annotation.Result;\r\nimport org.apache.struts2.convention.annotation.ResultPath;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\n@Namespace(\"/User\")\r\n@ResultPath(value=\"/\")\r\n@Result(name=\"success\",location=\"/login.jsp\")\r\npublic class LoginAction extends ActionSupport{\r\n\r\n}\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eXML 實現版本\u003c/strong\u003e \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003e \u003c/strong\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-xml\"\u003e\u003cstrong\u003e\u0026lt;package name=\"user\" namespace=\"/User\" extends=\"struts-default\"\u0026gt;\r\n\t\u0026lt;action name=\"Login\"\u0026gt;\r\n\t\t\u0026lt;result\u0026gt;/login.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\u0026lt;/package\u0026gt;\u003c/strong\u003e\u003c/pre\u003e \n\u003ch2\u003e 3. WelcomeUserAction \u003c/h2\u003e \n\u003cp\u003e 重寫execute()方法並指定\u0026nbsp;@Action 和 @Result 註解。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003e註解版本\u003c/strong\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-java\"\u003epackage com.yiibai.user.action;\r\n\r\nimport org.apache.struts2.convention.annotation.Action;\r\nimport org.apache.struts2.convention.annotation.Namespace;\r\nimport org.apache.struts2.convention.annotation.Result;\r\nimport org.apache.struts2.convention.annotation.ResultPath;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\n@Namespace(\"/User\")\r\n@ResultPath(value=\"/\")\r\npublic class WelcomeUserAction extends ActionSupport{\r\n\r\n\tprivate String username;\r\n\t \r\n\tpublic String getUsername() {\r\n\t\treturn username;\r\n\t}\r\n\r\n\tpublic void setUsername(String username) {\r\n\t\tthis.username = username;\r\n\t}\r\n\r\n\t@Action(value=\"Welcome\", results={\r\n\t\t@Result(name=\"success\",location=\"welcome_user.jsp\")\r\n\t})\r\n\tpublic String execute() {\r\n\r\n\t\treturn SUCCESS;\r\n\r\n\t}\r\n}\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003e\u003cstrong\u003eXML 實現版本\u003c/strong\u003e\u003c/strong\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-xml\"\u003e\u0026lt;package name=\"user\" namespace=\"/User\" extends=\"struts-default\"\u0026gt;\r\n \u0026lt;action name=\"Welcome\" class=\"com.yiibai.user.action.WelcomeUserAction\"\u0026gt;\r\n\t\u0026lt;result name=\"SUCCESS\"\u0026gt;/welcome_user.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\u0026lt;/package\u0026gt;\u003c/pre\u003e \n\u003cdiv\u003e\n Struts 2 註解 –\u0026nbsp;@Action,\u0026nbsp;@Result\u0026nbsp;和\u0026nbsp;@Namespace\u0026nbsp;不言自明,可以將它與XML比較。@ResultPath\u0026nbsp;可能需要一點點的解釋,請參閱本\u0026nbsp;@ResultPath示例 \n\u003c/div\u003e \n\u003ch2\u003e 4. JSP視圖頁面 \u003c/h2\u003e \n\u003cdiv\u003e\n 普通JSP視圖頁面來接受用戶名和密碼後點擊提交按鈕,並重定向到一個歡迎頁面。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003elogin.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-html\"\u003e\u0026lt;%@ page contentType=\"text/html; charset=UTF-8\"%\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\"%\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n\t\u0026lt;h1\u0026gt;Struts 2 註解示例\u0026lt;/h1\u0026gt;\r\n\r\n\t\u0026lt;s:form action=\"Welcome\"\u0026gt;\r\n\t\t\u0026lt;s:textfield name=\"username\" label=\"用戶名\" /\u0026gt;\r\n\t\t\u0026lt;s:password name=\"password\" label=\"密碼\" /\u0026gt;\r\n\t\t\u0026lt;s:submit value=\"提交\"/\u0026gt;\r\n\t\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003ewelcome_user.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-html\"\u003e\u0026lt;%@ page contentType=\"text/html; charset=UTF-8\" %\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 註解示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h4\u0026gt;您好, \u0026lt;s:property value=\"username\"/\u0026gt;\u0026lt;/h4\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. struts.xml \u003c/h2\u003e \n\u003cdiv\u003e\n 所有類註解無需創建 struts.xml 文件。 \n\u003c/div\u003e \n\u003ch2\u003e 6. web.xml \u003c/h2\u003e \n\u003cp\u003e 只要創建一個典型的web.xml文件,並聲明FilterDispatcher過濾器標準。 \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-xml\"\u003e\u0026lt;!DOCTYPE web-app PUBLIC\r\n \"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN\"\r\n \"http://java.sun.com/dtd/web-app_2_3.dtd\" \u0026gt;\r\n\r\n\u0026lt;web-app\u0026gt;\r\n \u0026lt;display-name\u0026gt;Struts 2 Web Application\u0026lt;/display-name\u0026gt;\r\n \r\n \u0026lt;filter\u0026gt;\r\n\t\u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n\t\u0026lt;filter-class\u0026gt;org.apache.struts2.dispatcher.FilterDispatcher\u0026lt;/filter-class\u0026gt;\r\n \u0026lt;/filter\u0026gt;\r\n \r\n \u0026lt;filter-mapping\u0026gt;\r\n\t\u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n\t\u0026lt;url-pattern\u0026gt;/*\u0026lt;/url-pattern\u0026gt;\r\n \u0026lt;/filter-mapping\u0026gt;\r\n \r\n\u0026lt;/web-app\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 7. 運行測試 \u003c/h2\u003e \n\u003cdiv\u003e\n LoginAction.action 改爲 login.action,請參閱上面的「命名轉換器」。 \n\u003c/div\u003e \n\u003cp\u003e \u003ca href=\"http://localhost:8080/struts2example/User/login.action\"\u003ehttp://localhost:8080/struts2example/User/login.action\u003c/a\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-2.png\" alt=\"Struts2註解示例\"\u003e \u003c/p\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003cp\u003e 提交到\u0026nbsp;\u003ca href=\"http://localhost:8080/Struts2Example/User/Welcome.action\"\u003ehttp://localhost:8080/Struts2Example/User/Welcome.action\u003c/a\u003e\u0026nbsp;後顯示: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-3.png\" alt=\"Struts2註解示例\"\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/convention-plugin.html\"\u003eStruts 2 約定插件文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e Strust 2 Hello World (XML 版本) \u003c/li\u003e \n\u003c/ol\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"3d:Tb63,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e\n 在Struts 2中,\u0026nbsp;@ResultPath 註解用於控制Struts2找到存儲的結果或JSP頁面。默認情況下,它會找到結果頁在\u0026nbsp;「WEB-INF/content/」 文件夾。 \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003cspan\u003e不知道爲什麼在Struts2註解設置\u003c/span\u003e\u0026nbsp;「WEB-INF/content/」 作爲默認目錄, 但是大部分的應用並不將結果頁放入到 「WEB-INF/content/」 目錄. 可能 \n \u003cspan\u003eStruts2慣例也並不是一個標準的文件夾結構。\u003c/span\u003e \n \u003cspan\u003e\u0026nbsp;\u003c/span\u003e \n \u003cspan\u003e我一般是在 Struts\u0026nbsp;2 根路徑作爲默認的文件夾。\u003c/span\u003e \n\u003c/div\u003e \n\u003ch2\u003e @ResultPath 示例 \u003c/h2\u003e \n\u003ch2\u003e 1. 默認結果路徑 \u003c/h2\u003e \n\u003cp\u003e 在登錄動作類,設置 「/User」 作爲命名空間, 並重定向到 「pages/login.jsp」 頁面。 \u003c/p\u003e \n\u003cp\u003e P.S\u0026nbsp;假設struts2example是上下文servlet名稱 \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-java\"\u003e@Namespace(\"/User\")\r\n@Result(name=\"success\",location=\"pages/login.jsp\")\r\npublic class LoginAction extends ActionSupport{\r\n}\u003c/pre\u003e \n\u003cp\u003e 訪問它,如下: \u003c/p\u003e \n\u003cpre\u003ehttp\u003cspan\u003e:\u003c/span\u003e\u003cspan\u003e/\u003c/span\u003e\u003cspan\u003e/\u003c/span\u003elocalhost\u003cspan\u003e:\u003c/span\u003e\u003cspan\u003e8080\u003c/span\u003e\u003cspan\u003e/\u003c/span\u003estruts2example\u003cspan\u003e/\u003c/span\u003eUser\u003cspan\u003e/\u003c/span\u003elogin\u003cspan\u003e.\u003c/span\u003eaction\u003c/pre\u003e \n\u003cdiv\u003e\n Struts\u0026nbsp;2將從默認位置找到「login.jsp」結果頁面: \n\u003c/div\u003e \n\u003cpre\u003e\u003cspan\u003e/\u003c/span\u003estruts2example\u003cspan\u003e/\u003c/span\u003eWEB\u003cspan\u003e-\u003c/span\u003eINF\u003cspan\u003e/\u003c/span\u003econtent\u003cspan\u003e/\u003c/span\u003eUser\u003cspan\u003e/\u003c/span\u003epages\u003cspan\u003e/\u003c/span\u003elogin\u003cspan\u003e.\u003c/span\u003ejsp\u003c/pre\u003e \n\u003ch2\u003e 2. 定製結果路徑 \u003c/h2\u003e \n\u003cp\u003e 如果JSP結果頁面存儲在其他位置,那麼可以使用 @ResultPath註釋設置改變它。 \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-java\"\u003e@Namespace(\"/User\")\r\n@ResultPath(value=\"/\")\r\n@Result(name=\"success\",location=\"pages/login.jsp\")\r\npublic class LoginAction extends ActionSupport{\r\n}\u003c/pre\u003e \n\u003cp\u003e 再一次訪問: \u003c/p\u003e \n\u003cpre\u003ehttp\u003cspan\u003e:\u003c/span\u003e\u003cspan\u003e/\u003c/span\u003e\u003cspan\u003e/\u003c/span\u003elocalhost\u003cspan\u003e:\u003c/span\u003e\u003cspan\u003e8080\u003c/span\u003e\u003cspan\u003e/s\u003c/span\u003etruts2example\u003cspan\u003e/\u003c/span\u003eUser\u003cspan\u003e/\u003c/span\u003elogin\u003cspan\u003e.\u003c/span\u003eaction\u003c/pre\u003e \n\u003cdiv\u003e\n 現在Struts2將從不同的位置找到「login.jsp」結果頁面: \n\u003c/div\u003e \n\u003cpre\u003e\u003cspan\u003e/\u003c/span\u003eStruts2Example\u003cspan\u003e/\u003c/span\u003eUser\u003cspan\u003e/\u003c/span\u003epages\u003cspan\u003e/\u003c/span\u003elogin\u003cspan\u003e.\u003c/span\u003ejsp\u003c/pre\u003e \n\u003ch2\u003e 全局@ResultPath \u003c/h2\u003e \n\u003cp\u003e @ResultPath只適用於類級別。在全局範圍內應用它,可以在 struts.xml 文件中進行配置。 \u003c/p\u003e \n\u003cp\u003e struts.xml \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-xml\"\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n\u0026lt;struts\u0026gt;\r\n\t\u0026lt;constant name=\"struts.convention.result.path\" value=\"/\"/\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8.1/docs/convention-plugin.html#ConventionPlugin-ResultPathannotation\"\u003eStruts 2 @ResultPath 註解文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"3e:Td77,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e \n \u003cspan\u003eStruts\u0026nbsp;2自帶有「包含文件」功能,包含多個Struts配置文件合併爲一個單元。\u003c/span\u003e \n \u003c/div\u003e \n\u003c/div\u003e \n\u003ch2\u003e \n \u003cdiv\u003e\n 單個Struts配置文件 \n \u003c/div\u003e \u003c/h2\u003e \n\u003cdiv\u003e\n 讓我們來看看一個糟糕的 Struts\u0026nbsp;2 配置示例。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003estruts.xml\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \r\n\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\u0026lt;/package\u0026gt;\r\n\r\n\u0026lt;package name=\"audit\" namespace=\"/audit\" extends=\"struts-default\"\u0026gt;\r\n\t\u0026lt;action name=\"WelcomeAudit\"\u0026gt;\r\n\t\t\u0026lt;result\u0026gt;pages/welcome_audit.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\u0026lt;/package\u0026gt;\r\n\r\n\u0026lt;package name=\"user\" namespace=\"/user\" extends=\"struts-default\"\u0026gt;\r\n\t\u0026lt;action name=\"WelcomeUser\"\u0026gt;\r\n\t\t\u0026lt;result\u0026gt;pages/welcome_user.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\u0026lt;/package\u0026gt;\r\n\r\n\u0026lt;/struts\u0026gt;\u0026nbsp;\u003c/pre\u003e \n\u003cp\u003e 在上面的Struts配置文件中,組織所有「用戶」和「審覈」配置設置在一個文件中,這不是建議的,必須迴避。應該打破這種形式,而將struts.xml文件分成更小的模塊相關的部分。 \u003c/p\u003e \n\u003ch2\u003e \n \u003cdiv\u003e\n 多個Struts配置文件 \n \u003c/div\u003e \u003c/h2\u003e \n\u003cdiv\u003e\n 在Struts2,應該給每個模塊一個Struts配置文件。在這種情況下,可以創建三個文件: \n\u003c/div\u003e \n\u003col\u003e \n \u003cli\u003e audit-struts.xml –\u0026nbsp;將所有審計模塊設置在這裏。 \u003c/li\u003e \n \u003cli\u003e user-struts.xml –\u0026nbsp;將所有用戶模塊設置在這裏。 \u003c/li\u003e \n \u003cli\u003e struts.xml –\u0026nbsp;默認設置,包含 struts-audit.xml 和 Struts-user.xml 兩個文件。 \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e \u003cstrong\u003estruts-audit.xml\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n\u0026lt;package name=\"audit\" namespace=\"/audit\" extends=\"struts-default\"\u0026gt;\r\n\t\u0026lt;action name=\"WelcomeAudit\"\u0026gt;\r\n\t\t\u0026lt;result\u0026gt;pages/welcome_audit.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\u0026lt;/package\u0026gt;\r\n\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003estruts-user.xml\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \r\n\u0026lt;package name=\"user\" namespace=\"/user\" extends=\"struts-default\"\u0026gt;\r\n\t\u0026lt;action name=\"WelcomeUser\"\u0026gt;\r\n\t\t\u0026lt;result\u0026gt;pages/welcome_user.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\u0026lt;/package\u0026gt;\r\n\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003estruts.xml\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \r\n\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\u0026lt;/package\u0026gt;\r\n\r\n\u0026lt;include file=\"conf/user-struts.xml\"\u0026gt;\u0026lt;/include\u0026gt;\r\n\u0026lt;include file=\"conf/audit-struts.xml\"\u0026gt;\u0026lt;/include\u0026gt;\r\n\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 現在文件夾結構看起來如下: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-include-1.png\" alt=\"Struts2 include(包含)多個配置文件\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"3f:T12e2,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e\n Struts\u0026nbsp;2的命名空間是一個新的概念,用來處理多個模塊。由下式給出一個命名空間的每個模塊。此外,它還可以用來避免位於不同的模塊相同的操作名稱之間的衝突。 \n\u003c/div\u003e \n\u003cp\u003e 看下面的一張圖來了解一個URL匹配Struts\u0026nbsp;2的動作命名空間。 \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-4.png\" alt=\"Struts2命名空間配置和解釋\"\u003e \u003c/p\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003ch2\u003e 1. 命名空間配置 \u003c/h2\u003e \n\u003cdiv\u003e\n 讓我們通過一個Struts2的命名空間配置的例子來了解它是如何與URL和文件夾相匹配。 \n\u003c/div\u003e \n\u003cp\u003e P.S\u0026nbsp;包中的「name」不會影響結果,只是給一個有意義的名字。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003estruts.xml\u003c/strong\u003e \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003e \u003c/strong\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-xml\"\u003e\u003cstrong\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC \"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN\" \"http://struts.apache.org/dtds/struts-2.1.dtd\"\u0026gt;\r\n\u0026lt;struts\u0026gt;\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\u0026lt;action name=\"SayWelcome\"\u0026gt;\r\n\t\t\t\u0026lt;result\u0026gt;/pages/welcome.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\u0026lt;/package\u0026gt;\r\n\r\n\t\u0026lt;package name=\"common\" namespace=\"/common\" extends=\"struts-default\"\u0026gt;\r\n\t\t\u0026lt;action name=\"SayWelcome\"\u0026gt;\r\n\t\t\t\u0026lt;result\u0026gt;/common/pages/welcome.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\u0026lt;/package\u0026gt;\r\n\r\n\t\u0026lt;package name=\"user\" namespace=\"/user\" extends=\"struts-default\"\u0026gt;\r\n\t\t\u0026lt;action name=\"SayWelcome\"\u0026gt;\r\n\t\t\t\u0026lt;result\u0026gt;/common/user/welcome.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt; \u003c/strong\u003e\u003c/pre\u003e \n\u003cp\u003e Struts\u0026nbsp;2的動作命名空間映射到文件夾結構。 \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-5.png\" alt=\"Struts2命名空間配置和解釋\"\u003e \u003c/p\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003ch2\u003e 2. JSP視圖頁面 \u003c/h2\u003e \n\u003cp\u003e 3\u0026nbsp;JSP頁面視圖具有相同的文件名,但是在不同的模塊位置。 \u003c/p\u003e \n\u003cp\u003e 根 – \u0026nbsp;pages/welcome.jsp \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-html\"\u003e\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;title\u0026gt;Struts2命名空間示例 - yiibai.com\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n\t\u0026lt;h1\u0026gt;Struts2命名空間示例\u0026lt;/h1\u0026gt;\r\n\t\u0026lt;h4\u0026gt;Welcome - namespace = \"root\"\u0026lt;/h4\u0026gt;\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e Common 模塊 – \u0026nbsp;common/pages/welcome.jsp \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-html\"\u003e\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;title\u0026gt;Struts2命名空間示例 - yiibai.com\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n\t\u0026lt;h1\u0026gt;Struts2命名空間示例\u0026lt;/h1\u0026gt;\r\n\t\u0026lt;h4\u0026gt;Welcome - namespace = \"common\"\u0026lt;/h4\u0026gt;\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e User 模塊 – \u0026nbsp;user/pages/welcome.jsp \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-html\"\u003e\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;title\u0026gt;Struts2命名空間示例 - yiibai.com\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n\t\u0026lt;h1\u0026gt;Struts2命名空間示例\u0026lt;/h1\u0026gt;\r\n\r\n\t\u0026lt;h4\u0026gt;Welcome - namespace = \"user\"\u0026lt;/h4\u0026gt;\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. 映射 – 如何工作? \u003c/h2\u003e \n\u003cp\u003e \u003cstrong\u003e示例 1\u003c/strong\u003e\u003cbr\u003e URL :\u0026nbsp;http://localhost:8080/Struts2Example/SayWelcome.action \u003c/p\u003e \n\u003cp\u003e 將匹配根命名空間。 \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-xml\"\u003e\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\u0026lt;action name=\"SayWelcome\"\u0026gt;\r\n\t\t\t\u0026lt;result\u0026gt;/pages/welcome.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\u0026lt;/package\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 這會顯示\u0026nbsp;pages/welcome.jsp 頁面的內容 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003e示例 2\u003c/strong\u003e\u003cbr\u003e URL :\u0026nbsp;http://localhost:8080/Struts2Example/common/SayWelcome.action\u003cbr\u003e 這會匹配\u0026nbsp;common 命名空間的內容: \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-xml\"\u003e\t\u0026lt;package name=\"common\" namespace=\"/common\" extends=\"struts-default\"\u0026gt;\r\n\t\t\u0026lt;action name=\"SayWelcome\"\u0026gt;\r\n\t\t\t\u0026lt;result\u0026gt;/common/pages/welcome.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\u0026lt;/package\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 這會顯示\u0026nbsp;\u003cstrong\u003e\u003cstrong\u003ecommon/pages/welcome.jsp\u003c/strong\u003e\u0026nbsp;\u003c/strong\u003e頁面的內容 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003e示例 3\u003c/strong\u003e\u003cbr\u003e URL :\u0026nbsp;http://localhost:8080/Struts2Example/user/SayWelcome.action\u003cbr\u003e 這會匹配 common 命名空間的內容: \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-xml\"\u003e\u0026lt;package name=\"user\" namespace=\"/user\" extends=\"struts-default\"\u0026gt;\r\n\t\u0026lt;action name=\"SayWelcome\"\u0026gt;\r\n\t\t\u0026lt;result\u0026gt;/common/user/welcome.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\u0026lt;/package\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 這會顯示\u0026nbsp;\u003cstrong\u003euser/pages/welcome.jsp\u003c/strong\u003e\u0026nbsp;頁面的內容. \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003cp\u003e \u003c/p\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/namespace-configuration.html\"\u003eStruts2命名空間配置參考\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e 代碼下載:\u003ca href=\"http://pan.baidu.com/s/1hqe1nZe\"\u003ehttp://pan.baidu.com/s/1hqe1nZe\u003c/a\u003e \u003c/p\u003e \n\u003cp\u003e\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"40:T737,"])</script><script>self.__next_f.push([1,"\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cp\u003e 在Struts2開發中,這應該是第一個學習配置的值。爲了啓用 Struts\u0026nbsp;2 的開發模式,可以通過自動配置顯著增加Struts2的開發速度和屬性文件加載,以及額外的日誌和調試功能。 \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e \n \u003cem\u003e\u003cstrong\u003e注:\u003c/strong\u003e自動重新加載功能真的是一個方便的功能。\u003c/em\u003e \n \u003cem\u003e每次修改屬性或XML配置文件更改,應用程序不再需要重啓才能生效。\u003c/em\u003e \n \u003c/div\u003e \n \u003cdiv\u003e \n \u003cdiv\u003e \n \u003cem\u003e默認情況下,Struts\u0026nbsp;2的開發模式是禁用的。\u003c/em\u003e \n \u003c/div\u003e \n \u003c/div\u003e \n \u003ch2\u003e \n \u003cdiv\u003e\n 啓用Struts2開發模式 \n \u003c/div\u003e \u003c/h2\u003e \n \u003cdiv\u003e\n 將「struts.devMode」的值設置爲true,可以在Struts的屬性文件或XML配置文件。 \n \u003c/div\u003e \n \u003cp\u003e \u003cstrong\u003estruts.properties\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003estruts.devMode = true\r\u003c/pre\u003e \n \u003cp\u003e \u003cstrong\u003estruts.xml\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003e\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n \u003ch2\u003e \n \u003cdiv\u003e\n 禁用Struts\u0026nbsp;2的開發模式 \n \u003c/div\u003e \u003c/h2\u003e \n \u003cp\u003e 設置「struts.devMode」爲false,無論是在Struts屬性文件或XML配置文件。 \u003c/p\u003e \n \u003cp\u003e \u003cstrong\u003estruts.properties\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003estruts.devMode = false\r\u003c/pre\u003e \n \u003cp\u003e \u003cstrong\u003estruts.xml\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003e\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"false\" /\u0026gt;\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n \u003cdiv\u003e\n 開發模式只適合於開發和調試環境。在生產環境中,你必須禁用它。因爲整個應用程序的配置 \n \u003cspan\u003e它會引起對性能顯著影響\u003c/span\u003e,屬性文件將在每次請求重新加載,許多額外的日誌和調試信息也將提供。 \n \u003c/div\u003e \n \u003ch2\u003e 參考 \u003c/h2\u003e \n \u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/devmode.html\"\u003eStruts 2 開發模式文檔\u003c/a\u003e \u003c/li\u003e \n \u003c/ol\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"41:T742,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e\n 在Struts2中,所有動作類有一個默認的後綴 .action 擴展。\u0026nbsp;例如, \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;struts\u0026gt;\r\n \u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\u0026lt;action name=\"SayStruts2\"\u0026gt;\r\n\t\t\u0026lt;result\u0026gt;pages/printStruts2.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003cdiv\u003e\n 如要訪問「SayStruts2」動作類,需要使用以下網址: \n\u003c/div\u003e \n\u003cpre\u003eAction URL : http://localhost:8080/Struts2Example/SayStruts2.action\u003c/pre\u003e \n\u003ch2\u003e \n \u003cdiv\u003e\n 配置動作擴展 \n \u003c/div\u003e \u003c/h2\u003e \n\u003cdiv\u003e\n Struts\u0026nbsp;2是允許配置擴展名的,要對其進行更改,只需要聲明一個常數「struts.action.extension」值: \n\u003c/div\u003e \n\u003ch2\u003e 1. html 擴展 \u003c/h2\u003e \n\u003cdiv\u003e\n 更改動作類爲 .html 的擴展名。 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;struts\u0026gt;\r\n\t \r\n \u0026lt;constant name=\"struts.action.extension\" value=\"html\"/\u0026gt; \r\n\t\r\n \u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\u0026lt;action name=\"SayStruts2\"\u0026gt;\r\n\t\t\u0026lt;result\u0026gt;pages/printStruts2.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003cdiv\u003e\n 現在,可以通過訪問「SayStruts2」動作類,使用如下URL: \n\u003c/div\u003e \n\u003cpre\u003eAction URL : http://localhost:8080/Struts2Example/SayStruts2.html\u003c/pre\u003e \n\u003ch2\u003e 2. 不使用擴展 \u003c/h2\u003e \n\u003cdiv\u003e\n 動作類更改爲空的擴展。 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;struts\u0026gt;\r\n\t \r\n \u0026lt;constant name=\"struts.action.extension\" value=\"\"/\u0026gt; \r\n\t\r\n \u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\u0026lt;action name=\"SayStruts2\"\u0026gt;\r\n\t\t\u0026lt;result\u0026gt;pages/printStruts2.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003cdiv\u003e\n 現在,可以通過如下的URL來訪問「SayStruts2' 動作類: \n\u003c/div\u003e \n\u003cpre\u003eAction URL : http://localhost:8080/Struts2Example/SayStruts2\u003c/pre\u003e \n\u003cbr\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"42:T15f8,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n 在Struts2中,會花大部分的時間用在用動作來處理工作。動作類包含業務邏輯,獲取資源包,保存數據,驗證,並選擇應發回給用戶的視圖的結果頁面。這是Struts2的核心,所以必須要了解動作的基本概念。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003ch2\u003e 1. 動作 - Action \u003c/h2\u003e \n\u003cp\u003e Struts\u0026nbsp;2動作不強迫你實現任何接口或擴展類,它只是需要你實現一個 execute()方法返回一個字符串來表示其應該返回的結果頁面。 \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-java\"\u003epackage com.yiibai.user.action; \r\npublic class LoginAction{\r\n //business logic\r\n public String execute() {\r\n return \"success\";\r\n }\r\n}\u003c/pre\u003e \n\u003cp\u003e 在struts.xml中,配置使用Action類動作(action)標記和類屬性。定義結果頁面用結果的標籤和動作名稱返回給用戶,可以用它來訪問動作類的名稱屬性。 \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-java\"\u003e\u0026lt;package name=\"user\" namespace=\"/User\" extends=\"struts-default\"\u0026gt;\r\n \u0026lt;action name=\"validateUser\" class=\"com.yiibai.user.action.LoginAction\"\u0026gt;\r\n \u0026lt;result name=\"success\"\u0026gt;pages/welcome.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\u0026lt;package\u0026gt;\u003c/pre\u003e \n\u003cdiv\u003e\n 現在,可以通過 .action 擴展名後綴訪問動作。 \n\u003c/div\u003e \n\u003cpre\u003ehttp\u003cspan\u003e:\u003c/span\u003e\u003cspan\u003e/\u003c/span\u003e\u003cspan\u003e/\u003c/span\u003elocalhost\u003cspan\u003e:\u003c/span\u003e\u003cspan\u003e8080\u003c/span\u003e\u003cspan\u003e/\u003c/span\u003eStruts2Example\u003cspan\u003e/\u003c/span\u003eUser\u003cspan\u003e/\u003c/span\u003evalidateUser\u003cspan\u003e.\u003c/span\u003eaction\u0026nbsp;\u003c/pre\u003e \n\u003cdiv\u003e\n 默認.action是可配置的,只需要設置「struts.action.extension」的值,以滿足您的需要。 \n\u003c/div\u003e \n\u003ch2\u003e 2.\u0026nbsp;可選動作接口 \u003c/h2\u003e \n\u003cp\u003e Struts\u0026nbsp;2帶有一個可選的動作接口(com.opensymphony.xwork2.Action)。通過實現這個接口,它帶來了一些方便和好處,看下面的源代碼: \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-java\"\u003epackage com.opensymphony.xwork2;\r\npublic interface Action {\r\n public static final String SUCCESS = \"success\";\r\n public static final String NONE = \"none\";\r\n public static final String ERROR = \"error\";\r\n public static final String INPUT = \"input\";\r\n public static final String LOGIN = \"login\";\r\n public String execute() throws Exception;\r\n}\u003c/pre\u003e \n\u003cp\u003e 這個接口是非常簡單的,配有5常用常數值:\u003cstrong\u003e\u0026nbsp;\u003c/strong\u003e\u003cstrong\u003esuccess, error, none, input and logic\u003c/strong\u003e。現在的動作類可以直接使用常量。 \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-java\"\u003epackage com.yiibai.user.action;\r\nimport com.opensymphony.xwork2.Action;\r\npublic class LoginAction{\r\n //business logic\r\n public String execute() {\r\n return SUCCESS;\r\n }\r\n}\u003c/pre\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 不明白爲什麼很多Struts開發人員喜歡實現此動作接口,它更好地擴展了ActionSupport。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003ch2\u003e 3. ActionSupport \u003c/h2\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n Support\u0026nbsp;類,通常的做法是提供接口的默認實現。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e \u0026nbsp;ActionSupport (\u003cstrong\u003ecom.opensymphony.xwork2.ActionSupport\u003c/strong\u003e),\u0026nbsp;\u003cspan\u003e一個非常強大和方便的類,它提供了幾個重要接口的缺省實現:\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cspan\u003e \u003c/span\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-java\"\u003epublic class ActionSupport implements Action, Validateable, \r\n ValidationAware, TextProvider, LocaleProvider, Serializable {\r\n ...\r\n}\u003c/pre\u003e \n\u003cp\u003e ActionSupport\u0026nbsp;類提供一些功能: \u003c/p\u003e \n\u003cp\u003e 1. 驗證\u0026nbsp;–\u0026nbsp;聲明一個validate()方法,並在裏面實現驗證代碼。 \u003c/p\u003e \n\u003cp\u003e 2.\u0026nbsp;文字本地化\u0026nbsp;–\u0026nbsp;使用gettext()方法來獲得資源包的消息。 \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-java\"\u003epackage com.yiibai.user.action;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\npublic class LoginAction extends ActionSupport{\r\n private String username;\r\n private String password;\r\n public String getPassword() {\r\n return password;\r\n }\r\n public void setPassword(String password) {\r\n this.password = password;\r\n }\r\n public String getUsername() {\r\n return username;\r\n }\r\n public void setUsername(String username) {\r\n this.username = username;\r\n }\r\n //business logic\r\n public String execute() {\r\n return \"SUCCESS\";\r\n }\r\n //simple validation\r\n public void validate(){\r\n if(\"\".equals(getUsername())){\r\n addFieldError(\"username\", getText(\"username.required\"));\r\n }\r\n if(\"\".equals(getPassword())){\r\n addFieldError(\"password\", getText(\"password.required\"));\r\n }\r\n }\r\n}\u003c/pre\u003e \n\u003cdiv\u003e\n 在大多數情況下,應該擴展此類妥當,方便提供功能,除非你有理由不這樣做。這也是一個很不錯的學習類,以瞭解如何做一些重要的Struts2接口的實現。 \n\u003c/div\u003e \n\u003ch2\u003e 4. 動作註釋 \u003c/h2\u003e \n\u003cp\u003e Struts\u0026nbsp;2對註解有很好的支持,你可以擺脫XML文件,並使用@action在動作類上替換。 \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-java\"\u003epackage com.yiibai.user.action;\r\nimport org.apache.struts2.convention.annotation.Action;\r\nimport org.apache.struts2.convention.annotation.Namespace;\r\nimport org.apache.struts2.convention.annotation.Result;\r\nimport org.apache.struts2.convention.annotation.ResultPath;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n@Namespace(\"/User\")\r\n@ResultPath(value=\"/\")\r\npublic class ValidateUserAction extends ActionSupport{\r\n @Action(value=\"Welcome\", results={\r\n @Result(name=\"success\",location=\"pages/welcome_user.jsp\")\r\n })\r\n public String execute() {\r\n return SUCCESS;\r\n }\r\n}\u003c/pre\u003e \n\u003ch2\u003e 總結 \u003c/h2\u003e \n\u003cdiv\u003e\n 擴展ActionSupport類,它適合在大多數情況下。 \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"43:T1ac0,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n 本教程顯示使用Struts2的 ActionError 和 ActionMessage 類。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e 1.\u0026nbsp;ActionError\u0026nbsp;–\u0026nbsp;是用來發送錯誤信息反饋給用戶\u0026nbsp;- 通過\u0026nbsp;\u0026lt;s:actionerror/\u0026gt;\u0026nbsp;來顯示。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:if test=\"hasActionErrors()\"\u0026gt;\r\n \u0026lt;div class=\"errors\"\u0026gt;\r\n \u0026lt;s:actionerror/\u0026gt;\r\n \u0026lt;/div\u0026gt;\r\n\u0026lt;/s:if\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 2.\u0026nbsp;\u003cstrong\u003eActionMessage\u003c/strong\u003e\u0026nbsp;–\u0026nbsp;\u003cspan\u003e用於發送信息的反饋消息給用戶,\u003c/span\u003e\u003cspan\u003e\u003cspan\u003e通過\u0026nbsp;\u003c/span\u003e\u003c/span\u003e\u003cstrong\u003e\u0026lt;s:actionmessage/\u0026gt;\u0026nbsp;\u003c/strong\u003e\u003cspan\u003e來顯示。\u003c/span\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:if test=\"hasActionMessages()\"\u0026gt;\r\n \u0026lt;div class=\"welcome\"\u0026gt;\r\n \u0026lt;s:actionmessage/\u0026gt;\r\n \u0026lt;/div\u0026gt;\r\n\u0026lt;/s:if\u0026gt;\u0026nbsp;\u003c/pre\u003e \n\u003cp\u003e 這裏有一個簡單的登錄表單,如果用戶名不等於「yiibai.com」將顯示錯誤消息(actionerror),否則重定向到另一個頁面,顯示歡迎信息(ActionMessage)。此外,所有的標籤和錯誤消息檢索來自資源包(屬性文件)。 \u003c/p\u003e \n\u003ch2\u003e 1. 文件夾結構 \u003c/h2\u003e \n\u003cp\u003e 在MyEclipse中創建一個web工程,名稱爲:struts2-errormsg,看這個項目結構,如下圖: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2actionerroractionmessage-1.png\" alt=\"Struts2的ActionError&ActionMessage示例\"\u003e \u003c/p\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003ch2\u003e 2.\u0026nbsp;屬性文件 \u003c/h2\u003e \n\u003cdiv\u003e\n 一共有兩個屬性文件用來存儲信息,其中 LoginAction.properties 文件放在\u0026nbsp;com.yiibai.user.action 包下。 \n\u003c/div\u003e \n\u003cp\u003e LoginAction.properties \u003c/p\u003e \n\u003cpre class=\"prettyprint\"\u003e#Welcome messages\r\nwelcome.hello = 你好\r\n#error message\r\nusername.required = 用戶名不可以爲空\r\npassword.required = 密碼不可以爲空\u003c/pre\u003e \n\u003cp\u003e global.properties \u003c/p\u003e \n\u003cpre class=\"prettyprint\"\u003e#Global messages\r\nglobal.username = 用戶名\r\nglobal.password = 密碼\r\nglobal.submit = 提交\r\nglobal.reset = 重置\u003c/pre\u003e \n\u003ch2\u003e 3. 動作-Action \u003c/h2\u003e \n\u003cp\u003e 一個經典的動作類,做一個簡單的檢查,以確認用戶名是否等於「yiibai.com\",並使用\u0026nbsp;addActionError()設置錯誤信息或addActionMessage()設置成功的消息。 \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.user.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class LoginAction extends ActionSupport{\r\n\r\n\tprivate String username;\r\n\tprivate String password;\r\n\t \r\n\tpublic String getPassword() {\r\n\t\treturn password;\r\n\t}\r\n\r\n\tpublic void setPassword(String password) {\r\n\t\tthis.password = password;\r\n\t}\r\n\r\n\tpublic String getUsername() {\r\n\t\treturn username;\r\n\t}\r\n\r\n\tpublic void setUsername(String username) {\r\n\t\tthis.username = username;\r\n\t}\r\n\r\n\t//business logic\r\n\tpublic String execute() {\r\n\r\n\t\treturn \"SUCCESS\";\r\n\r\n\t}\r\n\r\n\t//simple validation\r\n\tpublic void validate(){\r\n\t\tif(\"yiibai.com\".equals(getUsername())){\r\n\t\t\taddActionMessage(\"You are valid user!\");\r\n\t\t}else{\r\n\t\t\taddActionError(\"I don't know you, dont try to hack me!\");\r\n\t\t}\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 4. JSP頁面視圖 \u003c/h2\u003e \n\u003cdiv\u003e\n 兩個簡單的JSP頁面以及CSS樣式自定義錯誤消息。 \n\u003c/div\u003e \n\u003cp\u003e login.jsp \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-html\"\u003e\u0026lt;%@ page contentType=\"text/html; charset=UTF-8\" %\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;title\u0026gt;Struts2 ActionError \u0026amp; ActionMessage 示例\u0026lt;/title\u0026gt;\r\n\u0026lt;style type=\"text/css\"\u0026gt;\r\n.errors {\r\n background-color:#FFCCCC;\r\n border:1px solid #CC0000;\r\n width:400px;\r\n margin-bottom:8px;\r\n}\r\n.errors li{ \r\n list-style: none; \r\n}\r\n\u0026lt;/style\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2 ActionError \u0026amp; ActionMessage 示例\u0026lt;/h1\u0026gt;\r\n\u0026lt;s:if test=\"hasActionErrors()\"\u0026gt;\r\n \u0026lt;div class=\"errors\"\u0026gt;\r\n \u0026lt;s:actionerror/\u0026gt;\r\n \u0026lt;/div\u0026gt;\r\n\u0026lt;/s:if\u0026gt;\r\n\u0026lt;s:form action=\"validateUser\"\u0026gt;\r\n \u0026lt;s:textfield key=\"global.username\" name=\"username\"/\u0026gt;\r\n \u0026lt;s:password key=\"global.password\" name=\"password\"/\u0026gt;\r\n \u0026lt;s:submit key=\"global.submit\" name=\"submit\"/\u0026gt;\r\n\u0026lt;/s:form\u0026gt;\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003ewelcome.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003e \u003c/strong\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-html\"\u003e\u003cstrong\u003e\u0026lt;%@ page contentType=\"text/html; charset=UTF-8\"%\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\"%\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;title\u0026gt;Struts2 ActionError \u0026amp; ActionMessage 示例\u0026lt;/title\u0026gt;\r\n\u0026lt;style type=\"text/css\"\u0026gt;\r\n.welcome {\r\n background-color: #DDFFDD;\r\n border: 1px solid #009900;\r\n width: 200px;\r\n}\r\n.welcome li {\r\n list-style: none;\r\n}\r\n\u0026lt;/style\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n \u0026lt;h1\u0026gt;Struts 2 ActionError \u0026amp; ActionMessage示例\u0026lt;/h1\u0026gt;\r\n \u0026lt;s:if test=\"hasActionMessages()\"\u0026gt;\r\n \u0026lt;div class=\"welcome\"\u0026gt;\r\n \u0026lt;s:actionmessage /\u0026gt;\r\n \u0026lt;/div\u0026gt;\r\n \u0026lt;/s:if\u0026gt;\r\n \u0026lt;h4\u0026gt;\r\n \u0026lt;s:property value=\"getText('welcome.hello')\" /\u0026gt;\r\n \u0026lt;s:property value=\"username\" /\u0026gt;\r\n \u0026lt;/h4\u0026gt;\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/strong\u003e\u003c/pre\u003e \n\u003ch2\u003e 5. struts.xml \u003c/h2\u003e \n\u003cp\u003e 鏈接所有的在一起 \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-xml\"\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n\r\n\u0026lt;struts\u0026gt;\r\n \u0026lt;constant name=\"struts.custom.i18n.resources\" value=\"global\" /\u0026gt;\r\n\r\n \u0026lt;package name=\"user\" namespace=\"/user\" extends=\"struts-default\"\u0026gt;\r\n \u0026lt;action name=\"login\"\u0026gt;\r\n\t \u0026lt;result\u0026gt;/pages/login.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n \u0026lt;action name=\"validateUser\" class=\"com.yiibai.user.action.LoginAction\"\u0026gt;\r\n\t \u0026lt;result name=\"SUCCESS\"\u0026gt;/pages/welcome.jsp\u0026lt;/result\u0026gt;\r\n\t \u0026lt;result name=\"input\"\u0026gt;/pages/login.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 在Struts2,ActionError和ActionMessage功能和用法與Struts1非常相似。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003ch2\u003e 6. 運行並測試 \u003c/h2\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/struts2-errormsg/user/login.action\u003c/em\u003e \u003c/p\u003e \n\u003cp\u003e \u003cem\u003e\u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2actionerroractionmessage-2.png\" alt=\"Struts2的ActionError&ActionMessage示例\"\u003e\u003cbr\u003e \u003c/em\u003e \u003c/p\u003e \n\u003cp\u003e \u003cspan\u003e用戶名是無效的,顯示錯誤信息:\u003c/span\u003e\u0026lt;s:actionerror/\u0026gt; \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2actionerroractionmessage-3.png\" alt=\"Struts2的ActionError&ActionMessage示例\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003cspan\u003e用戶名是有效的,顯示歡迎信息:\u003c/span\u003e\u0026lt;s:actionmessage/\u0026gt; \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2actionerroractionmessage-4.png\" alt=\"Struts2的ActionError&ActionMessage示例\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003cspan\u003e\u003cbr\u003e \u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cspan\u003e源代碼下載 –\u0026nbsp;\u003c/span\u003e\u003ca href=\"http://pan.baidu.com/s/1pJkYCPH\"\u003eStruts2-ActionError-ActionMessage.zip\u003c/a\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"44:T1066,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n 這裏我們創建一個web工程爲:struts2-modeldrive ,用於講解演示Struts2模型驅動這一章內容的學習。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e 如果一個動作實現了「模型驅動」- ModelDriven\u0026nbsp;接口,它就獲得了表單數據自動傳輸到對象的額外能力。請參見下面的完整的例子: \u003c/p\u003e \n\u003ch2\u003e 1.\u0026nbsp;域對象 \u003c/h2\u003e \n\u003cp\u003e 一個顧客(customer)對象,有 setter 和 getter 方法。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eCustomer.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common;\r\n\r\npublic class Customer{\r\n\t\r\n\tString name;\r\n\tint age;\r\n\t\r\n\tpublic String getName() {\r\n\t\treturn name;\r\n\t}\r\n\tpublic void setName(String name) {\r\n\t\tthis.name = name;\r\n\t}\r\n\tpublic int getAge() {\r\n\t\treturn age;\r\n\t}\r\n\tpublic void setAge(int age) {\r\n\t\tthis.age = age;\r\n\t}\r\n\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. 動作 - Action \u003c/h2\u003e \n\u003cp\u003e Action類,實現了模型驅動ModelDriven\u0026nbsp;接口,聲明getModel()方法返回客戶的對象。當表單數據提交到這個動作,它會自動將表單數據傳輸到客戶的屬性。 \u003c/p\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 客戶對象必須手動初始化。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eCustomerAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.yiibai.common.Customer;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\nimport com.opensymphony.xwork2.ModelDriven;\r\n \r\npublic class CustomerAction extends ActionSupport \r\n\timplements ModelDriven{\r\n\r\n\t//have to initialize it\r\n\tCustomer customer = new Customer();\r\n\t\r\n\tpublic String execute() throws Exception {\r\n\t\r\n\t\treturn SUCCESS;\r\n\t\t\r\n\t}\r\n\r\n\tpublic Object getModel() {\r\n\t\t\r\n\t\treturn customer;\r\n\t\t\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 3. JSP頁面 \u003c/h2\u003e \n\u003cdiv\u003e\n JSP頁面的模型驅動(ModelDriven)的示範。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eaddCustomer.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 ModelDriven example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;Add Customer\u0026lt;/h2\u0026gt;\r\n\u0026lt;s:form action=\"customerAction\" \u0026gt;\r\n \u0026lt;s:textfield name=\"name\" label=\"Name\" /\u0026gt;\r\n \u0026lt;s:textfield name=\"age\" label=\"Age\" value=\"\"/\u0026gt;\r\n \u0026lt;s:submit /\u0026gt;\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003esuccess.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 ModelDriven example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;Customer Details\u0026lt;/h2\u0026gt;\r\nName : \u0026lt;s:property value=\"name\" /\u0026gt;\u0026lt;br\u0026gt;\r\nAge : \u0026lt;s:property value=\"age\" /\u0026gt;\u0026lt;br\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \t\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\r\n\t\t\u0026lt;action name=\"addCustomerAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.CustomerAction\" \u0026gt;\r\n\t\t \u0026lt;result name=\"success\"\u0026gt;pages/addCustomer.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\r\n\t\t\u0026lt;action name=\"customerAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.CustomerAction\" \u0026gt;\r\n\t\t \u0026lt;result name=\"success\"\u0026gt;pages/success.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. 示例 \u003c/h2\u003e \n\u003cp\u003e 訪問客戶表,填寫表格\u0026nbsp;(name : 「yiibai.com」, age 」 「26」)\u0026nbsp;並點擊提交按鈕,表單數據(name\u0026nbsp;\u0026amp;\u0026nbsp;age)\u0026nbsp;將自動轉移到客戶的屬性(name\u0026nbsp;\u0026amp;\u0026nbsp;age)\u0026nbsp;(按屬性名稱匹配)。 \u003c/p\u003e \n\u003cp\u003e http://localhost:8080/struts2-modeldrive/addCustomerAction.action \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-6.png\" alt=\"Struts2模型驅動實例\"\u003e \u003c/p\u003e \n\u003cp\u003e http://localhost:8080/struts2-modeldrive/customerAction.action \u003c/p\u003e \n\u003cdiv\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-7.png\" alt=\"Struts2模型驅動實例\"\u003e \n \u003cbr\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003cbr\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003cspan\u003e\u003cspan\u003e工程源代碼下載 -\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1hqxyjf2\"\u003ehttp://pan.baidu.com/s/1hqxyjf2\u003c/a\u003e\u003c/span\u003e\u003c/span\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"45:T8e4,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e\n Struts\u0026nbsp;2的開發者用來聲明行爲屬於一個包,擴展\u0026nbsp;「struts-default「,\u0026nbsp;其中包含默認設置的攔截。 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\u0026lt;action name=\"testingAction\" \r\n\t\tclass=\"com.yiibai.common.action.TestingAction\" \u0026gt;\r\n\t\t\u0026lt;result name=\"success\"\u0026gt;pages/result.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\u0026lt;/package\u0026gt;\u0026nbsp;\u003c/pre\u003e \n\u003cp\u003e 攔截器的默認設置進行分組爲「defaultStack」在struts-default.xml文件中,它位於\u0026nbsp;struts2-core.jar\u0026nbsp;文件,「defaultStack」提供所有的核心Struts2功能,這是最適合應用的需要。 \u003c/p\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 試着學習struts-default.xml文件,它總是最好的攔截器的參考。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003ch2\u003e \n \u003cdiv\u003e\n 映射攔截動作 \n \u003c/div\u003e \u003c/h2\u003e \n\u003cdiv\u003e\n 爲了其它的攔截器映射到動作,請使用「interceptor-ref」元素。 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\u0026lt;action name=\"testingAction\" \r\n\t\tclass=\"com.yiibai.common.action.TestingAction\" \u0026gt;\r\n\t\t\u0026lt;interceptor-ref name=\"timer\"/\u0026gt;\r\n\t\t\u0026lt;interceptor-ref name=\"logger\"/\u0026gt;\r\n\t\t\u0026lt;result name=\"success\"\u0026gt;pages/result.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\u0026lt;/package\u0026gt;\u003c/pre\u003e \n\u003cdiv\u003e\n 在上面的代碼片段,將其映射「timer」\u0026nbsp;和\u0026nbsp;「logger」通過「interceptor-ref」元素攔截到「TestingAction」動作類。 \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 攔截器會按它們聲明的順序觸發。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e 由於「TestingAction」它聲明自己的攔截器,它的直接失去攔截器的所有繼承默認設置,你必須明確才能使用它,見下面聲明「defaultStack」的例子。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\u0026lt;action name=\"testingAction\" \r\n\t\tclass=\"com.yiibai.common.action.TestingAction\" \u0026gt;\r\n\t\t\u0026lt;interceptor-ref name=\"timer\"/\u0026gt;\r\n\t\t\u0026lt;interceptor-ref name=\"logger\"/\u0026gt;\r\n\t\t\u0026lt;interceptor-ref name=\"defaultStack\"/\u0026gt;\r\n\t\t\u0026lt;result name=\"success\"\u0026gt;pages/result.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\u0026lt;/package\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/docs/interceptors.htmll\"\u003eStruts 2 攔截器文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"46:T697,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n 在Struts2中,可以設置或通過普通的\u0026lt;param\u0026gt;標籤重寫攔截器的參數。見下面的例子: \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003cpre\u003e\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n \u0026lt;action name=\"whateverAction\" \r\n\tclass=\"com.yiibai.common.action.WhateverAction\" \u0026gt;\r\n\t\u0026lt;interceptor-ref name=\"workflow\"\u0026gt;\r\n\t\t\u0026lt;param name=\"excludeMethods\"\u0026gt;whateverMethod\u0026lt;/param\u0026gt;\r\n\t\u0026lt;/interceptor-ref\u0026gt;\r\n\t\u0026lt;result name=\"success\"\u0026gt;pages/whatever.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\t\t\r\n\u0026lt;/package\u0026gt;\u0026nbsp;\u003c/pre\u003e \n \u003cp\u003e 然而,在上面的代碼片段,動作類被聲明爲自己的攔截器,\u0026nbsp;它會導致繼承「defaultStack」攔截器的直接丟失。 \u003c/p\u003e \n \u003cp\u003e 如果你想保持「defaultStack」攔截器,並覆蓋工作流的excludeMethods參數呢?沒問題,試試這個: \u003c/p\u003e \n \u003cpre\u003e\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n \u0026lt;action name=\"whateverAction\" \r\n\tclass=\"com.yiibai.common.action.WhateverAction\" \u0026gt;\r\n\t\u0026lt;interceptor-ref name=\"defaultStack\"\u0026gt;\r\n\t\t\u0026lt;param name=\"workflow.excludeMethods\"\u0026gt;whateverMethod\u0026lt;/param\u0026gt;\r\n\t\u0026lt;/interceptor-ref\u0026gt;\r\n\t\u0026lt;result name=\"success\"\u0026gt;pages/whatever.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\t\t\r\n\u0026lt;/package\u0026gt;\u003c/pre\u003e \n \u003cdiv\u003e\n 上面的代碼片段將保持「defaultStack」攔截並覆蓋「workflow」參數。 \n \u003c/div\u003e \n \u003ch2\u003e 參考 \u003c/h2\u003e \n \u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/interceptors.html\"\u003eStruts2攔截器文檔\u003c/a\u003e\u0026nbsp; \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/workflow-interceptor.html\"\u003eStruts2流程攔截器文檔\u003c/a\u003e \u003c/li\u003e \n \u003c/ol\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"47:Ta61,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e \n \u003cspan\u003e很多時候,相同的一組攔截器可以適用於不同的動作類,例如,\u003c/span\u003e \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003cpre\u003e\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n \u0026lt;action name=\"checkInAction\" \r\n\tclass=\"com.yiibai.common.action.CheckInAction\" \u0026gt;\r\n\t\u0026lt;interceptor-ref name=\"timer\"/\u0026gt;\r\n \u0026lt;interceptor-ref name=\"logger\"/\u0026gt;\r\n\t\u0026lt;interceptor-ref name=\"defaultStack\" /\u0026gt;\r\n\t\u0026lt;result name=\"success\"\u0026gt;/pages/checkIn.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\r\n \u0026lt;action name=\"checkOutAction\" \r\n\tclass=\"com.yiibai.common.action.CheckOutAction\" \u0026gt;\r\n\t\u0026lt;interceptor-ref name=\"timer\"/\u0026gt;\r\n \u0026lt;interceptor-ref name=\"logger\"/\u0026gt;\r\n\t\u0026lt;interceptor-ref name=\"defaultStack\" /\u0026gt;\r\n\t\u0026lt;result name=\"success\"\u0026gt;/pages/checkOut.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\t\r\n\u0026lt;/package\u0026gt;\u003c/pre\u003e \n \u003cdiv\u003e\n 在上述情況下,它有許多重複工作以及不能重複使用。 \n \u003c/div\u003e \n \u003cp\u003e 幸運的是,在Struts\u0026nbsp;2自帶的攔截器棧,使開發人員建立一組攔截到一個單元名爲「棧名字」,\u0026nbsp;和可以通過「棧名字」引用操作它。 \u003c/p\u003e \n \u003cdiv\u003e \n \u003cdiv\u003e\n 最佳做法 \n \u003c/div\u003e 建議組合相同的一組攔截器到一個攔截器棧擺脫重複的工作,並增加了項目的可重用性。 \n \u003c/div\u003e \n \u003cpre\u003e\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n \u0026lt;interceptors\u0026gt;\r\n \t\u0026lt;interceptor-stack name=\"defaultStackWithLog\"\u0026gt;\r\n \u0026lt;interceptor-ref name=\"timer\"/\u0026gt;\r\n \u0026lt;interceptor-ref name=\"logger\"/\u0026gt;\r\n\t \u0026lt;interceptor-ref name=\"defaultStack\" /\u0026gt;\r\n \u0026lt;/interceptor-stack\u0026gt;\r\n \u0026lt;/interceptors\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"checkInAction\" \r\n\tclass=\"com.yiibai.common.action.CheckInAction\" \u0026gt;\r\n\t\u0026lt;interceptor-ref name=\"defaultStackWithLog\"/\u0026gt;\r\n\t\u0026lt;result name=\"success\"\u0026gt;/pages/checkIn.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\r\n \u0026lt;action name=\"checkOutAction\" \r\n\tclass=\"com.yiibai.common.action.CheckOutAction\" \u0026gt;\r\n\t\u0026lt;interceptor-ref name=\"defaultStackWithLog\"/\u0026gt;\r\n\t\u0026lt;result name=\"success\"\u0026gt;/pages/checkOut.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\t\r\n\u0026lt;/package\u0026gt;\u0026nbsp;\u003c/pre\u003e \n \u003cp\u003e 在上面的例子更新,聲明一個攔截器棧,命名爲「defaultStackWithLog」其中包括「timer「,\u0026nbsp;「logger」\u0026nbsp;和\u0026nbsp;「defaultStack」\u0026nbsp;攔截器,並且它通過「interceptor-ref」元素引用一個正常的攔截器。 \u003c/p\u003e \n \u003ch2\u003e 參考 \u003c/h2\u003e \n \u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/interceptors.html\"\u003eStruts2攔截器文檔\u003c/a\u003e \u003c/li\u003e \n \u003c/ol\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"48:T1311,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n 在Struts2中附帶一個名爲「execAndWait」一個非常有趣的「執行和等待」攔截器,這是一個非常方便的攔截器長時間運行操作在後臺,顯示用戶的自定義的等待頁面。在本教程中,它顯示了一個完整的使用 Struts2\u0026nbsp;execAndWait 攔截器的例子。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003ch2\u003e 1. 動作 \u003c/h2\u003e \n\u003cdiv\u003e\n 一個普通的動作類,有一個長時間運行進程,證明了execAndWait效果。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eLongProcessAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class LongProcessAction extends ActionSupport{\r\n\r\n\tpublic String execute() throws Exception {\r\n\t\r\n\t\t//it should be delay few seconds, \r\n\t\t//unless you have a super powerful computer.\r\n\t\tfor(int i =0; i\u0026lt;1000000; i++){\r\n\t\t\tSystem.out.println(i);\r\n\t\t}\r\n\t\treturn SUCCESS;\r\n\t\t\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. JSP頁面 \u003c/h2\u003e \n\u003cdiv\u003e\n 創建兩個頁面: \n\u003c/div\u003e \n\u003col\u003e \n \u003cli\u003e wait.jsp\u0026nbsp;-\u0026nbsp;顯示給用戶,長時間運行的進程。 \u003c/li\u003e \n \u003cli\u003e success.jsp\u0026nbsp;-\u0026nbsp;顯示給用戶的過程完成之後。 \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv\u003e\n HTML meta refresh \n \u003cbr\u003e 記得把元刷新的等待頁面頂部;\u0026nbsp;否則,該網頁將不重定向到成功頁面,即使該過程完成。 \n\u003c/div\u003e \n\u003cp\u003e 在這個wait.jsp,元刷新設置在每5秒網頁重新加載,如果該過程完成後,將重定向到\u0026nbsp;success.jsp,\u0026nbsp;否則留在同一個頁面。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003ewait.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-html\"\u003e\u0026lt;%@ page contentType=\"text/html; charset=UTF-8\"%\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;title\u0026gt;Struts 2 execAndWait 示例\u0026lt;/title\u0026gt;\r\n\u0026lt;meta http-equiv=\"refresh\" content=\"5;url=\u0026lt;s:url includeParams=\"all\" /\u0026gt;\"/\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 execAndWait 示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h3\u0026gt;Please wait while we process your request...\u0026lt;/h3\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003esuccess.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-html\"\u003e\u0026lt;%@ page contentType=\"text/html; charset=UTF-8\"%\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;title\u0026gt;Struts 2 execAndWait 示例\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 execAndWait 示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h3\u0026gt;Done\u0026lt;/h3\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3.\u0026nbsp;執行和等待攔截器 \u003c/h2\u003e \n\u003cdiv\u003e\n 鏈接動作類並聲明「execAndWait」攔截器。 \n\u003c/div\u003e \n\u003cdiv\u003e\n execAndWait 參數 \n \u003col\u003e \n \u003cli\u003e delay (optional)\u0026nbsp;:\u0026nbsp;以毫秒爲單位初始延遲顯示在wait.jsp。默認是沒有延遲的。 \u003c/li\u003e \n \u003cli\u003e delaySleepInterval (optional)\u0026nbsp;:\u0026nbsp;時間間隔是以毫秒爲單位來檢查後臺進程\u003cspan\u003e是否\u003c/span\u003e已經完成,默認值是100毫秒。 \u003c/li\u003e \n \u003c/ol\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003estruts.xml\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\u0026lt;action name=\"longProcessAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.LongProcessAction\" \u0026gt;\r\n\t\t\t\r\n\t\t\t\u0026lt;interceptor-ref name=\"execAndWait\"\u0026gt;\r\n\t\t \u0026lt;param name=\"delay\"\u0026gt;1000\u0026lt;/param\u0026gt;\r\n\t\t \u0026lt;param name=\"delaySleepInterval\"\u0026gt;500\u0026lt;/param\u0026gt;\r\n\t\t \u0026lt;/interceptor-ref\u0026gt;\r\n\t\t \r\n\t\t \u0026lt;result name=\"wait\"\u0026gt;/pages/wait.jsp\u0026lt;/result\u0026gt;\r\n\t\t \u0026lt;result name=\"success\"\u0026gt;/pages/success.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\r\n\t\u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u0026nbsp;\u003c/pre\u003e \n\u003cp\u003e 在這種情況下,將延遲1秒顯示至wait.jsp,並檢查後臺進程是否在每500毫秒完成。即使這個過程完成後,它仍然需要等待 wait.jsp 元刷新來觸發頁面重載。 \u003c/p\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e 訪問網址:\u0026nbsp;http://localhost:8080/struts2execandwait/longProcessAction.action \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-execandwait-1.png\" alt=\"Struts2 execAndWait攔截器例子\"\u003e \u003c/p\u003e \n\u003cdiv\u003e\n 延時1秒,顯示在 wait.jsp 。 \n\u003c/div\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003cp\u003e 當該過程完成時,自動顯示在 success.jsp。 \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-execandwait-2.png\" alt=\"Struts2 execAndWait攔截器例子\"\u003e\u003cspan\u003e\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003c/p\u003e 代碼下載: \n\u003ca href=\"http://pan.baidu.com/s/1o62BHGY\"\u003ehttp://pan.baidu.com/s/1o62BHGY\u003c/a\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/execute-and-wait-interceptor.html\"\u003eStruts2 execAndWait攔截器文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://en.wikipedia.org/wiki/Meta_refresh\"\u003eHTML Meta Refresh\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"49:T11da,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 爲了比較直觀的學習,這裏創建一個web工程爲:struts2textfield。整個工程的目錄結構如下: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/textfield-1.png\" alt=\"Struts2 \u003cs:textfield\u003e文本示例\"\u003e \u003c/p\u003e \n\u003cp\u003e 在Struts2中,\u0026lt;s:textfield\u0026gt;文本範例,\u0026nbsp;例如,可以聲明「s:textfield」鍵屬性或標籤和名稱屬性。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:textfield key=\"username\" /\u0026gt;\r\n// 或\r\n\u0026lt;s:textfield label=\"Username\" name=\"username\" /\u0026gt;\u003c/pre\u003e \n\u003cdiv\u003e\n 兩者都產生相同的HTML輸出(默認的XHTML主題)。類似如下的結果: \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;td class=\"tdLabel\"\u0026gt;\r\n \u0026lt;label for=\"registerUser_username\" class=\"label\"\u0026gt;Username:\u0026lt;/label\u0026gt;\r\n\u0026lt;/td\u0026gt;\r\n\u0026lt;td\u0026gt;\r\n \u0026lt;input type=\"text\" name=\"username\" value=\"\" id=\"registerUser_username\"/\u0026gt;\r\n\u0026lt;/td\u0026gt;\u0026nbsp;\u003c/pre\u003e \n\u003cdiv\u003e\n 在Struts2中,「name」將自動映射到JavaBean屬性。\u0026nbsp;在這種情況下,表格提交時,文本框的值使用「name=’username'」將調用對應動作的setUsername(String\u0026nbsp;xx)來設置值。 \n\u003c/div\u003e \n\u003ch2\u003e Struts2 \u0026lt;s:textfield\u0026gt; 示例 \u003c/h2\u003e \n\u003cdiv\u003e\n 在Struts2中創建一個文本框輸入字段示例教程。 \n\u003c/div\u003e \n\u003ch2\u003e 1. 屬性文件 \u003c/h2\u003e \n\u003cdiv\u003e\n 兩個屬性文件用來存儲信息。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eglobal.properties\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e#Global messages\r\nusername = 用戶名\r\nsubmit = 提交\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eRegisterAction.properties\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e#error message\r\nusername.required = 用戶名不可以爲空\u003c/pre\u003e \n\u003ch2\u003e 2. Action \u003c/h2\u003e \n\u003cdiv\u003e\n 使用一個簡單的動作類驗證以確保用戶名不爲空,否則返回錯誤信息。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eRegisterAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.user.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class RegisterAction extends ActionSupport{\r\n\r\n\tprivate String username;\r\n\r\n\tpublic String getUsername() {\r\n\t\treturn username;\r\n\t}\r\n\r\n\tpublic void setUsername(String username) {\r\n\t\tthis.username = username;\r\n\t}\r\n\r\n\t//business logic\r\n\tpublic String execute() {\r\n\r\n\t\treturn \"SUCCESS\";\r\n\r\n\t}\r\n\r\n\t//simple validation\r\n\tpublic void validate(){\r\n\t\tif(\"\".equals(getUsername())){\r\n\t\t\taddFieldError(\"username\", getText(\"username.required\"));\r\n\t\t}\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 3. 視圖文件 \u003c/h2\u003e \n\u003cdiv\u003e\n 結果頁面使用Struts2\u0026nbsp;「s:textfield」來創建一個HTML文本框輸入字段。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eregister.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 - textbox 示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:form action=\"registerUser\" namespace=\"/user\"\u0026gt;\r\n\r\n\t\u0026lt;s:textfield key=\"username\" /\u0026gt;\r\n\t\u0026lt;s:submit key=\"submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003ewelcome.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ page contentType=\"text/html;charset=UTF-8\" %\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 - textbox 示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\u0026lt;s:property value=\"username\"/\u0026gt;\u0026lt;/h2\u0026gt;\r\nor\r\n\u0026lt;h2\u0026gt;\u0026lt;s:property value=\"%{username}\"/\u0026gt;\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \u0026lt;constant name=\"struts.custom.i18n.resources\" value=\"global\" /\u0026gt;\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \t\r\n \u0026lt;package name=\"user\" namespace=\"/user\" extends=\"struts-default\"\u0026gt;\r\n\t\u0026lt;action name=\"register\"\u0026gt;\r\n\t\t\u0026lt;result\u0026gt;/pages/register.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\t\u0026lt;action name=\"registerUser\" \r\n class=\"com.yiibai.user.action.RegisterAction\"\u0026gt;\r\n\t\t\u0026lt;result name=\"SUCCESS\"\u0026gt;/pages/welcome.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;result name=\"input\"\u0026gt;/pages/register.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. 示例顯示 \u003c/h2\u003e \n\u003cp\u003e http://localhost:8080/struts2textfield/user/register.action \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/textfield-2.png\" alt=\"Struts2 \u003cs:textfield\u003e文本示例\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/textfield-3.png\" alt=\"Struts2 \u003cs:textfield\u003e文本示例\"\u003e \u003c/p\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.x/docs/textfield.html\"\u003eStruts2文本文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv\u003e \n \u003cbr\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"4a:T144a,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cp\u003e \u003cspan\u003e在這一章節中,我們創建一個Web工程爲:\u003c/span\u003e\u003cspan\u003estruts2passwd,演示\u003c/span\u003e\u003cspan\u003e\u0026lt;s:password\u0026gt;的使用。完整的工程目錄結構如下:\u003c/span\u003e \u003c/p\u003e \n \u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/password-1.png\" alt=\"Struts2 \u003cs:password\u003e密碼示例\"\u003e \u003c/p\u003e \n\u003c/div\u003e \n\u003cp\u003e 在Struts2中,可以使用\u0026lt;s:password\u0026gt;來創建HTML密碼字段。例如,可以聲明「s:password」鍵屬性或者標籤和名稱屬性。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:password key=\"password\" /\u0026gt;\r\n//or\r\n\u0026lt;s:textfield label=\"Password\" name=\"password\" /\u0026gt;\u003c/pre\u003e \n\u003cdiv\u003e\n 兩者都產生相同的HTML輸出(在默認的XHTML主題)。 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;td class=\"tdLabel\"\u0026gt;\r\n \u0026lt;label for=\"registerUser_password\" class=\"label\"\u0026gt;Password:\u0026lt;/label\u0026gt;\r\n\u0026lt;/td\u0026gt; \r\n\u0026lt;td\u0026gt;\r\n \u0026lt;input type=\"password\" name=\"password\" id=\"registerUser_password\"/\u0026gt;\r\n\u0026lt;/td\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e Struts2 \u0026lt;s:password\u0026gt; 示例 \u003c/h2\u003e \n\u003cdiv\u003e\n 一個頁面,「密碼」和「確認密碼」字段,並做了驗證,以確保「確認密碼」是與「密碼」相匹配。 \n\u003c/div\u003e \n\u003ch2\u003e 1.\u0026nbsp;屬性文件 \u003c/h2\u003e \n\u003cp\u003e \u003cstrong\u003eglobal.properties\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e#Global messages\r\nusername = 用名名\r\npassword = 密碼\r\nconfirmPassword = 確認密碼\r\nsubmit = 提交\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eRegisterAction.properties\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e#error message\r\nusername.required = Username is required\r\npassword.required = Password is required\r\ncpassword.required = Confirm password is required\r\ncpassword.notmatch = Confirm password is not match\u003c/pre\u003e \n\u003ch2\u003e 2. 動作 - Action \u003c/h2\u003e \n\u003cp\u003e \u003cstrong\u003eRegisterAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.user.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class RegisterAction extends ActionSupport{\r\n\r\n\tprivate String username;\r\n\tprivate String password;\r\n\tprivate String confirmPassword;\r\n\t\r\n\tpublic String getPassword() {\r\n\t\treturn password;\r\n\t}\r\n\r\n\tpublic void setPassword(String password) {\r\n\t\tthis.password = password;\r\n\t}\r\n\r\n\tpublic String getConfirmPassword() {\r\n\t\treturn confirmPassword;\r\n\t}\r\n\r\n\tpublic void setConfirmPassword(String confirmPassword) {\r\n\t\tthis.confirmPassword = confirmPassword;\r\n\t}\r\n\r\n\tpublic String getUsername() {\r\n\t\treturn username;\r\n\t}\r\n\r\n\tpublic void setUsername(String username) {\r\n\t\tthis.username = username;\r\n\t}\r\n\r\n\t//business logic\r\n\tpublic String execute() {\r\n\r\n\t\treturn \"SUCCESS\";\r\n\r\n\t}\r\n\r\n\t//simple validation\r\n\tpublic void validate(){\r\n\t\tif(\"\".equals(getUsername())){\r\n\t\t\taddFieldError(\"username\", getText(\"username.required\"));\r\n\t\t}\r\n\t\tif(\"\".equals(getPassword())){\r\n\t\t\taddFieldError(\"password\", getText(\"password.required\"));\r\n\t\t}\r\n\t\tif(\"\".equals(getConfirmPassword())){\r\n\t\t\taddFieldError(\"confirmPassword\", getText(\"cpassword.required\"));\r\n\t\t}\r\n\t\t\r\n\t\tif(!(getPassword().equals(getConfirmPassword()))){\r\n\t\t\taddFieldError(\"confirmPassword\", getText(\"cpassword.notmatch\"));\r\n\t\t}\r\n\t}\r\n\r\n}\u003c/pre\u003e \n\u003ch2\u003e 3. 視圖頁面 \u003c/h2\u003e \n\u003cdiv\u003e\n 結果頁面使用 Struts2\u0026nbsp;的「s:password」標籤來創建一個HTML密碼字段。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eregister.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 - password 示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:form action=\"registerUser\" namespace=\"/user\"\u0026gt;\r\n\r\n\t\u0026lt;s:textfield key=\"username\" /\u0026gt;\r\n\t\u0026lt;s:password key=\"password\" /\u0026gt;\r\n\t\u0026lt;s:password key=\"confirmPassword\" /\u0026gt;\r\n\t\r\n\t\u0026lt;s:submit key=\"submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003ewelcome.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ page contentType=\"text/html;charset=UTF-8\" %\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 - password 示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;Password : \u0026lt;s:property value=\"password\"/\u0026gt;\u0026lt;/h2\u0026gt;\r\n\u0026lt;h2\u0026gt;Confirm Password : \u0026lt;s:property value=\"%{confirmPassword}\"/\u0026gt;\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \u0026lt;constant name=\"struts.custom.i18n.resources\" value=\"global\" /\u0026gt;\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \t\r\n \u0026lt;package name=\"user\" namespace=\"/user\" extends=\"struts-default\"\u0026gt;\r\n\t\u0026lt;action name=\"register\"\u0026gt;\r\n\t\t\u0026lt;result\u0026gt;/pages/register.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\t\u0026lt;action name=\"registerUser\" \r\n class=\"com.yiibai.user.action.RegisterAction\"\u0026gt;\r\n\t\t\u0026lt;result name=\"SUCCESS\"\u0026gt;/pages/welcome.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;result name=\"input\"\u0026gt;/pages/register.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. 運行示例 \u003c/h2\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/struts2passwd/user/register.action\u003c/em\u003e \u003c/p\u003e \n\u003cp\u003e \u003cem\u003e\u003cimg src=\"https://asset.1ju.org/cmsstatic/password-2.png\" alt=\"Struts2 \u003cs:password\u003e密碼示例\"\u003e\u003cbr\u003e \u003c/em\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.x/docs/password.html\"\u003eStruts2密碼文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"4b:Tca1,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n 在這一章節中,我們創建一個Web工程爲:struts2hidden,演示\u0026lt;s:hidden\u0026gt;的使用。完整的工程目錄結構如下: \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/hidden-1.png\" alt=\"Struts2 \u003cs:hidden\u003e隱藏值例子\"\u003e \n \u003cbr\u003e \n\u003c/div\u003e \n\u003cdiv\u003e\n 在Struts2中可以使用\u0026lt;s:hidden\u0026gt;標籤來創建一個HTML隱藏字段。 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;s:hidden name=\"url\" value=\"http://www.yiibai.com\" /\u0026gt;\u003c/pre\u003e \n\u003cdiv\u003e\n 它會呈現爲下面的HTML代碼。 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;input type=\"hidden\" name=\"url\" value=\"http://www.yiibai.com\" /\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e Struts2 \u0026lt;s:hidden\u0026gt; 示例 \u003c/h2\u003e \n\u003cdiv\u003e\n 一個頁面的URL隱藏值,並顯示隱藏值表示在提交後。 \n\u003c/div\u003e \n\u003ch2\u003e 1. Action \u003c/h2\u003e \n\u003cp\u003e \u003cstrong\u003eHiddenAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class HiddenAction extends ActionSupport{\r\n\r\n\tprivate String url;\r\n\r\n\tpublic String getUrl() {\r\n\t\treturn url;\r\n\t}\r\n\r\n\tpublic void setUrl(String url) {\r\n\t\tthis.url = url;\r\n\t}\r\n\r\n\tpublic String execute() {\r\n\t\treturn SUCCESS;\r\n\t}\r\n\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. 視圖頁面 \u003c/h2\u003e \n\u003cdiv\u003e\n Struts2\u0026nbsp;「s:hidden」標籤來創建一個隱藏值字段。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003ehidden.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 - 隱藏值字段\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:form action=\"helloHidden\" namespace=\"/\"\u0026gt;\r\n\r\n\t\u0026lt;h2\u0026gt;This page has a hidden value (view source): \r\n\t\u0026lt;s:hidden name=\"url\" value=\"http://www.yiibai.com\" /\u0026gt;\u0026lt;/h2\u0026gt; \r\n\r\n\t\u0026lt;s:submit value=\"submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003ewelcome.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ page contentType=\"text/html;charset=UTF-8\" %\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 - 隱藏值字段\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n The hidden value :\r\n \u0026lt;s:property value=\"url\"/\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \t\r\n \u0026lt;package name=\"\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\u0026lt;action name=\"hidden\"\u0026gt;\r\n\t\t\u0026lt;result\u0026gt;/pages/hidden.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\t\u0026lt;action name=\"helloHidden\" class=\"com.yiibai.common.action.HiddenAction\"\u0026gt;\r\n\t\t\u0026lt;result name=\"success\"\u0026gt;/pages/welcome.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e http://localhost:8080/struts2hidden/hidden.action \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/hidden-2.png\" alt=\"Struts2 \u003cs:hidden\u003e隱藏值例子\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/hidden-3.png\" alt=\"Struts2 \u003cs:hidden\u003e隱藏值例子\"\u003e \u003c/p\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.x/docs/hidden.html\"\u003eStruts2隱藏字段\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"4c:Tc29,"])</script><script>self.__next_f.push([1,"\u003cp\u003e \u003cspan\u003e在Struts2,你可以使用\u0026lt;s:textarea\u0026gt;創建HTML textarea文本域。\u003c/span\u003e\u003cspan\u003e爲了比較直觀的學習,這裏創建一個web工程爲:struts2textarea。整個工程的目錄結構如下:\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cspan\u003e\u003cimg src=\"https://asset.1ju.org/cmsstatic/textarea-1.png\" alt=\"Struts2 \u003cs:textarea\u003e文本域實例\"\u003e\u003cbr\u003e \u003c/span\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:textarea label=\"Address\" name=\"address\" cols=\"40\" rows=\"10\"/\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 它會呈現爲如下面的HTML代碼。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;textarea name=\"address\" cols=\"40\" rows=\"10\" id=\"formaction_address\"\u0026gt;\u0026lt;/textarea\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e Struts 2 \u0026lt;s:textarea\u0026gt; 示例 \u003c/h2\u003e \n\u003cp\u003e 頁面包含一個地址textarea字段域,並顯示 textarea的值在表單提交後。 \u003c/p\u003e \n\u003ch2\u003e 1. Action \u003c/h2\u003e \n\u003cp\u003e \u003cstrong\u003eTextAreaAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class TextAreaAction extends ActionSupport{\r\n\r\n\tprivate String address;\r\n\r\n\tpublic String getAddress() {\r\n\t\treturn address;\r\n\t}\r\n\r\n\tpublic void setAddress(String address) {\r\n\t\tthis.address = address;\r\n\t}\r\n\r\n\tpublic String execute() {\r\n\t\treturn SUCCESS;\r\n\t}\r\n\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. 視圖頁面 \u003c/h2\u003e \n\u003cp\u003e Struts2的「s:textarea」標籤來創建一個textarea文本域字段。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003etextarea.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2 文本域實例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:form action=\"helloTextarea\" namespace=\"/\"\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n \u0026lt;s:textarea label=\"Address\" name=\"address\" cols=\"40\" rows=\"10\"/\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;s:submit value=\"submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003ewelcome.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2文本域實例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n \u0026lt;s:property value=\"address\"/\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \t\r\n \u0026lt;package name=\"\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\u0026lt;action name=\"textarea\"\u0026gt;\r\n\t \u0026lt;result\u0026gt;/pages/textarea.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\t\u0026lt;action name=\"helloTextarea\" \r\n class=\"com.yiibai.common.action.TextAreaAction\"\u0026gt;\r\n\t \u0026lt;result name=\"success\"\u0026gt;/pages/welcome.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 運行結果 \u003c/h2\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/struts2textarea/textarea.action\u003c/em\u003e \u003c/p\u003e \n\u003cp\u003e \u003cem\u003e\u003cimg src=\"https://asset.1ju.org/cmsstatic/textarea-2.png\" alt=\"Struts2 \u003cs:textarea\u003e文本域實例\"\u003e\u003cbr\u003e \u003c/em\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.x/docs/textarea.html\"\u003eStruts 2 textarea文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"4d:T165f,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 在Struts2,可以使用\u0026lt;s:radio\u0026gt;標籤來創建一個HTML單選按鈕。有很多方法來填充數據到單選按鈕,可以通過List, OGNL 或 Object。請查看下面的例子就知道了。 \u003c/p\u003e \n\u003ch2\u003e Struts2 \u0026lt;s:radio\u0026gt; 示例 \u003c/h2\u003e \n\u003cp\u003e 舉個例子來說明如何使用列表,OGNL和對象數據填充到Struts2中,使用\u0026lt;s:radio\u0026gt;標籤創建一個單選按鈕。 \u003c/p\u003e \n\u003ch2\u003e 1. 動作 - Action \u003c/h2\u003e \n\u003cp\u003e Action類來創建性別和語言值單選按鈕列表。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eRadioButtonAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\n\r\nimport com.yiibai.common.model.Language;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class RadioButtonAction extends ActionSupport{\r\n\r\n\tprivate List\u0026lt;String\u0026gt; genders;\r\n\tprivate List\u0026lt;Language\u0026gt; languages ;\r\n\t\r\n\tprivate String yourGender;\r\n\tprivate String yourAnswer;\r\n\tprivate String yourLanguage;\r\n\t\r\n\tprivate static final String MALE = \"male\";\r\n\tprivate static final String FEMALE = \"female\";\r\n\tprivate static final String UNKNOWN = \"unknown\";\r\n\t\r\n\tpublic RadioButtonAction(){\r\n\t\t\r\n\t\tgenders = new ArrayList\u0026lt;String\u0026gt;();\r\n\t\tgenders.add(MALE);\r\n\t\tgenders.add(FEMALE);\r\n\t\tgenders.add(UNKNOWN);\r\n\t\t\r\n\t\tlanguages = new ArrayList\u0026lt;Language\u0026gt;();\r\n\t\tlanguages.add( new Language(\"EN\", \"English\") );\r\n\t\tlanguages.add( new Language(\"FR\", \"France\") );\r\n\t\tlanguages.add( new Language(\"CN_ZH\", \"Chinese\") );\r\n\t\tlanguages.add( new Language(\"DE\", \"German\") );\r\n\t\t\r\n\t}\r\n\t\r\n\t//return default gender value\r\n\tpublic String getDefaultGenderValue(){\r\n\t\treturn UNKNOWN;\r\n\t}\r\n\r\n\t//return default language value\r\n\tpublic String getDefaultLanguageValue(){\r\n\t\treturn \"CN_ZH\";\r\n\t}\r\n\t\r\n\tpublic String execute() {\r\n\t\treturn SUCCESS;\r\n\t}\r\n\tpublic String display() {\r\n\t\treturn NONE;\r\n\t}\r\n\t\r\n\t//getter ad setter methods\r\n}\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eLanguage.java\u003c/strong\u003e \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003e \u003c/strong\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-java\"\u003e\u003cstrong\u003epackage com.yiibai.common.model;\r\n\r\npublic class Language{\r\n\r\n\tprivate String languageCode;\r\n\tprivate String languageDisplay;\r\n\t\r\n\tpublic String getLanguageCode() {\r\n\t\treturn languageCode;\r\n\t}\r\n\tpublic void setLanguageCode(String languageCode) {\r\n\t\tthis.languageCode = languageCode;\r\n\t}\r\n\tpublic String getLanguageDisplay() {\r\n\t\treturn languageDisplay;\r\n\t}\r\n\tpublic void setLanguageDisplay(String languageDisplay) {\r\n\t\tthis.languageDisplay = languageDisplay;\r\n\t}\r\n\t\r\n\tpublic Language(String languageCode, String languageDisplay) {\r\n\t\tthis.languageCode = languageCode;\r\n\t\tthis.languageDisplay = languageDisplay;\r\n\t}\r\n}\u003c/strong\u003e\u003c/pre\u003e \n\u003ch2\u003e 2. 結果頁面 \u003c/h2\u003e \n\u003cp\u003e 結果頁面是使用Struts2 「s:radio」 通過List, OGNL 和 object來創建的三個單選按鈕。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eradiobutton.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 radio button example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:form action=\"resultAction\" namespace=\"/\"\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n \u0026lt;s:radio label=\"Gender\" name=\"yourGender\" list=\"genders\" value=\"defaultGenderValue\" /\u0026gt;\r\n \u0026lt;s:radio label=\"Gender\" name=\"yourLanguage\" list=\"languages\" \r\n listKey=\"languageCode\" listValue=\"languageDisplay\" value=\"defaultLanguageValue\" /\u0026gt;\r\n \u0026lt;s:radio label=\"Answer\" name=\"yourAnswer\" list=\"#{'1':'Yes','2':'No'}\" value=\"2\" /\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;s:submit value=\"submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;a\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eresult.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 radio button example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n Your Selected Gender : \u0026lt;s:property value=\"yourGender\"/\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\u0026lt;h2\u0026gt;\r\n Your Selected Language : \u0026lt;s:property value=\"yourLanguage\"/\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\u0026lt;h2\u0026gt;\r\n Your Selected Answer : \u0026lt;s:property value=\"yourAnswer\"/\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \t\r\n \u0026lt;package name=\"com.yiibai.common.action\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"radioButtonAction\" \r\n class=\"com.yiibai.common.action.RadioButtonAction\" method=\"display\"\u0026gt;\r\n\t\t\u0026lt;result name=\"none\"\u0026gt;/pages/radiobutton.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"resultAction\" class=\"com.yiibai.common.action.RadioButtonAction\"\u0026gt;\r\n\t\t\u0026lt;result name=\"success\"\u0026gt;/pages/result.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. 示例 \u003c/h2\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/struts2radio/radioButtonAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/radio-1.png\" alt=\"Struts2 \u003cs:radio\u003e單選按鈕例子\"\u003e \n \u003cbr\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/struts2radio/resultAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/radio-2.png\" alt=\"Struts2 \u003cs:radio\u003e單選按鈕例子\"\u003e \n \u003cbr\u003e \n\u003c/div\u003e \n\u003cdiv class=\"note\"\u003e\n 要了解如何預選值,讀這篇文章 –\u0026nbsp;在Struts2的單選按鈕預選值 \n\u003c/div\u003e \n\u003ch2\u003e 參數 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.11.2/docs/radio.html\"\u003ehttp://struts.apache.org/2.0.11.2/docs/radio.html\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8.1/docs/struts-2-form-tags.html\"\u003ehttp://struts.apache.org/2.1.8.1/docs/struts-2-form-tags.html\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"4e:T1205,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 下面是幾個Struts2的例子來說明如何通過List, OGNL 和對象生成一個單選按鈕默認值(預先選擇)。 \u003c/p\u003e \n\u003ch2\u003e 1. 列表 - List \u003c/h2\u003e \n\u003cp\u003e 在Java代碼中創建一個列表返回單選按鈕的值。 \u003c/p\u003e \n\u003cpre\u003e//...\r\n\tList\u0026lt;String\u0026gt; genders = new ArrayList\u0026lt;String\u0026gt;();\r\n\t\tgenders.add(\"male\");\r\n\t\tgenders.add(\"female\");\r\n\t\tgenders.add(\"unknown\");\r\n\t//...\r\n\tpublic List\u0026lt;String\u0026gt; getGenders() {\r\n\t\treturn genders;\r\n\t}\r\n\tpublic String getDefaultGenderValue(){\r\n\t\treturn \"unknown\";\r\n\t}\r\n\t//...\u003c/pre\u003e \n\u003cp\u003e 在結果頁面中,\u0026lt;s:radio\u0026gt;標籤, list=」genders」將調用 getGenders()方法返回列表單選按鈕的鍵和值。以及\u0026nbsp;value=」defaultGenderValue」\u0026nbsp;會調用\u0026nbsp;getDefaultGenderValue()\u0026nbsp;方法來\u0026nbsp;預先選擇「unknown」值作爲單選按鈕的默認值。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:radio label=\"Gender\" name=\"yourGender\" list=\"genders\" value=\"defaultGenderValue\" /\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 它會生成以下HTML代碼... \u003c/p\u003e \n\u003cpre\u003e\u0026lt;input type=\"radio\" name=\"yourGender\" id=\"resultAction_yourGendermale\" value=\"male\"/\u0026gt;\r\n\u0026lt;label for=\"resultAction_yourGendermale\"\u0026gt;male\u0026lt;/label\u0026gt; \r\n\r\n\u0026lt;input type=\"radio\" name=\"yourGender\" id=\"resultAction_yourGenderfemale\" value=\"female\"/\u0026gt;\r\n\u0026lt;label for=\"resultAction_yourGenderfemale\"\u0026gt;female\u0026lt;/label\u0026gt; \r\n\r\n\u0026lt;input type=\"radio\" name=\"yourGender\" id=\"resultAction_yourGenderunknown\" \r\n checked=\"checked\" value=\"unknown\"/\u0026gt;\r\n\u0026lt;label for=\"resultAction_yourGenderunknown\"\u0026gt;unknown\u0026lt;/label\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 2. OGNL \u003c/h2\u003e \n\u003cp\u003e 在結果頁面中,通過創建OGNL表達式單選按鈕,並預先選擇「2」爲默認值。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:radio label=\"Answer\" name=\"yourAnswer\" list=\"#{'1':'Yes','2':'No'}\" value=\"2\" /\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 它會生成以下HTML代碼... \u003c/p\u003e \n\u003cpre\u003e\u0026lt;input type=\"radio\" name=\"yourAnswer\" id=\"resultAction_yourAnswer1\" value=\"1\"/\u0026gt;\r\n\u0026lt;label for=\"resultAction_yourAnswer1\"\u0026gt;Yes\u0026lt;/label\u0026gt; \r\n\r\n\u0026lt;input type=\"radio\" name=\"yourAnswer\" id=\"resultAction_yourAnswer2\" \r\nchecked=\"checked\" value=\"2\"/\u0026gt;\r\n\u0026lt;label for=\"resultAction_yourAnswer2\"\u0026gt;No\u0026lt;/label\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. Object \u003c/h2\u003e \n\u003cp\u003e 在Java代碼中,創建語言對象languageCode和languageDisplay的屬性。 \u003c/p\u003e \n\u003cpre\u003e//...\r\n public class Language{\r\n\r\n\t private String languageCode;\r\n\t private String languageDisplay;\r\n\t //getter and setter methods\r\n }\u003c/pre\u003e \n\u003cpre\u003e//...\r\n\tList\u0026lt;Language\u0026gt; languages = new ArrayList\u0026lt;Language\u0026gt;();\r\n\t\tlanguages.add( new Language(\"EN\", \"English\") );\r\n\t\tlanguages.add( new Language(\"FR\", \"France\") );\r\n\t\tlanguages.add( new Language(\"CN_ZH\", \"Chinese\") );\r\n\t\tlanguages.add( new Language(\"DE\", \"German\") );\r\n\t//...\r\n\tpublic List\u0026lt;Language\u0026gt; getLanguages() {\r\n\t\treturn languages;\r\n\t}\r\n\tpublic String getDefaultLanguageValue(){\r\n\t\treturn \"CN_ZH\";\r\n\t}\r\n\t//...\u003c/pre\u003e \n\u003cp\u003e 在結果頁面中,\u0026lt;s:radio\u0026gt; 標籤,list=」languages」 會調用 getLanguages()方法返回單選按鈕鍵和值的列表。\u0026nbsp;\u0026nbsp;listKey=」languageCode」\u0026nbsp;表示語言的 languageCode屬性爲單選按鈕的鍵;\u0026nbsp;listValue=」languageDisplay」\u0026nbsp;表示語言的languageDisplay屬性爲單選按鈕的值。最後\u0026nbsp;value=」defaultLanguageValue」\u0026nbsp;會調用\u0026nbsp;\u0026nbsp;getDefaultLanguageValue()\u0026nbsp;方法預先選擇「CN_ZH」 作爲單選按鈕的默認值。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:radio label=\"Gender\" name=\"yourLanguage\" list=\"languages\" \r\n listKey=\"languageCode\" listValue=\"languageDisplay\" value=\"defaultLanguageValue\" /\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 它會生成以下HTML代碼... \u003c/p\u003e \n\u003cpre\u003e\u0026lt;input type=\"radio\" name=\"yourLanguage\" id=\"resultAction_yourLanguageEN\" value=\"EN\"/\u0026gt;\r\n\u0026lt;label for=\"resultAction_yourLanguageEN\"\u0026gt;English\u0026lt;/label\u0026gt; \r\n\r\n\u0026lt;input type=\"radio\" name=\"yourLanguage\" id=\"resultAction_yourLanguageFR\" value=\"FR\"/\u0026gt;\r\n\u0026lt;label for=\"resultAction_yourLanguageFR\"\u0026gt;France\u0026lt;/label\u0026gt; \r\n\r\n\u0026lt;input type=\"radio\" name=\"yourLanguage\" id=\"resultAction_yourLanguageCN_ZH\" \r\nchecked=\"checked\" value=\"CN_ZH\"/\u0026gt;\r\n\u0026lt;label for=\"resultAction_yourLanguageCN_ZH\"\u0026gt;Chinese\u0026lt;/label\u0026gt; \r\n\r\n\u0026lt;input type=\"radio\" name=\"yourLanguage\" id=\"resultAction_yourLanguageDE\" value=\"DE\"/\u0026gt;\r\n\u0026lt;label for=\"resultAction_yourLanguageDE\"\u0026gt;German\u0026lt;/label\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.11.2/docs/radio.html\"\u003ehttp://struts.apache.org/2.0.11.2/docs/radio.html\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8.1/docs/struts-2-form-tags.html\"\u003ehttp://struts.apache.org/2.1.8.1/docs/struts-2-form-tags.html\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"4f:T11dc,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 創建一個Web工程,它的工程名稱爲:struts2chechbox,其完整的項目工程結構如下: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/checkbox-1.png\" alt=\"Struts2 \u003cs:checkbox\u003e複選框例子\"\u003e \u003c/p\u003e \n\u003cp\u003e 在Struts2,可以使用\u0026lt;s:checkbox\u0026gt;標籤來創建一個HTML複選框。fieldValue=」true」是將要提交的複選框的實際值。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:checkbox name=\"checkMe\" fieldValue=\"true\" label=\"Check Me for testing\"/\u0026gt;\u003c/pre\u003e \n\u003cdiv class=\"note\"\u003e\n 一般情況下,不需要聲明fieldValue=「true」,因爲true是默認值。 \n\u003c/div\u003e \n\u003cp\u003e 它會生成下面的HTML。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;input type=\"checkbox\" name=\"checkMe\" value=\"true\" id=\"xx_checkMe\"/\u0026gt;\r\n\u0026lt;input type=\"hidden\" id=\"__checkbox_xx_checkMe\" name=\"__checkbox_checkMe\" value=\"true\"/\u0026gt;\r\n\u0026lt;label for=\"resultAction_checkMe\" class=\"checkboxLabel\"\u0026gt;Check Me for testing\u0026lt;/label\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 預先選擇一個複選框 \u003c/h2\u003e \n\u003cp\u003e 如果想預先選擇一個複選框,只需添加一個value屬性,並將其設置爲true。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:checkbox name=\"checkMe\" fieldValue=\"true\" value=\"true\" label=\"Check Me for testing\"/\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 它會生成下面的HTML。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;input type=\"checkbox\" name=\"checkMe\" value=\"true\" checked=\"checked\" id=\"xx_checkMe\"/\u0026gt;\r\n\u0026lt;input type=\"hidden\" id=\"__checkbox_xx_checkMe\" name=\"__checkbox_checkMe\" value=\"true\" /\u0026gt;\r\n\u0026lt;label for=\"resultAction_checkMe\" class=\"checkboxLabel\"\u0026gt;Check Me for testing\u0026lt;/label\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e Struts2\u0026nbsp;\u0026lt;s:checkbox\u0026gt;\u0026nbsp;示例 \u003c/h2\u003e \n\u003cp\u003e 一個完整的例子,通過Struts 2中創建一個複選框\u0026lt;s:checkbox\u0026gt;, 並指派提交複選框值到Action類並顯示它。 \u003c/p\u003e \n\u003ch2\u003e 1. 動作 - Action \u003c/h2\u003e \n\u003cp\u003e Action類有checkMe布爾屬性來保存複選框值。\u003cbr\u003e \u003cstrong\u003eCheckBoxAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class CheckBoxAction extends ActionSupport{\r\n\r\n\tprivate boolean checkMe;\r\n\r\n\tpublic boolean isCheckMe() {\r\n\t\treturn checkMe;\r\n\t}\r\n\r\n\tpublic void setCheckMe(boolean checkMe) {\r\n\t\tthis.checkMe = checkMe;\r\n\t}\r\n\r\n\tpublic String execute() {\r\n\t\r\n\t\treturn SUCCESS;\r\n\t\r\n\t}\r\n\t\r\n\tpublic String display() {\r\n\t\t\r\n\t\treturn NONE;\r\n\t\r\n\t}\r\n\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. 結果頁面 \u003c/h2\u003e \n\u003cp\u003e 結果頁面使用Struts2的「s:checkbox」標籤來創建一個複選框。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003echeckBox.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 複選框示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:form action=\"resultAction\" namespace=\"/\"\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n\t\u0026lt;s:checkbox name=\"checkMe\" fieldValue=\"true\" label=\"Check Me for testing\"/\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;s:submit value=\"submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eresult.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 複選框示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n CheckBox (CheckMe) value : \u0026lt;s:property value=\"checkMe\"/\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \t\r\n\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"checkBoxAction\" \r\n class=\"com.yiibai.common.action.CheckBoxAction\" method=\"display\"\u0026gt;\r\n\t\u0026lt;result name=\"none\"\u0026gt;/pages/checkBox.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"resultAction\" class=\"com.yiibai.common.action.CheckBoxAction\"\u0026gt;\r\n\t\u0026lt;result name=\"success\"\u0026gt;/pages/result.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. 示例 \u003c/h2\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/struts2checkbox/checkBoxAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/checkbox-2.png\" alt=\"Struts2 \u003cs:checkbox\u003e複選框例子\"\u003e \n \u003cbr\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/\u003cem\u003estruts2checkbox\u003c/em\u003e/resultAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/checkbox-3.png\" alt=\"Struts2 \u003cs:checkbox\u003e複選框例子\"\u003e \n \u003cbr\u003e \n\u003c/div\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/checkbox.html\"\u003eStruts2 複選框文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"50:T1085,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 在Struts2,可以通過\u0026lt;s:checkboxlist\u0026gt;標籤創建多個複選框具有相同名稱。棘手的問題是如何設置的默認值在多個複選框。例如,複選框以「紅色」,「黃色」,「藍色」,「綠色」選項的列表,並且要同時設置「紅色」和「綠色」爲默認選中的值。這裏創建一個Web工程:struts2setcheckboxes,來演示\u003cspan\u003e在多個複選框\u003c/span\u003e\u003cspan\u003e如何設置的默認值,整個項目的結構如下圖所示:\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cspan\u003e\u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-8.png\" alt=\"Struts2設置多個複選框缺省值\"\u003e\u003cbr\u003e \u003c/span\u003e \u003c/p\u003e \n\u003cdiv class=\"download\"\u003e\n 下載代碼 –\u0026nbsp; \n \u003ca href=\"http://pan.baidu.com/s/1bnfrCUr\"\u003ehttp://pan.baidu.com/s/1bnfrCUr\u003c/a\u003e \n\u003c/div\u003e \n\u003ch2\u003e 1. \u0026lt;s:checkboxlist\u0026gt; 實例 \u003c/h2\u003e \n\u003cp\u003e 一個\u0026nbsp;\u0026lt;s:checkboxlist\u0026gt;\u0026nbsp;示例 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:checkboxlist label=\"What's your favor color\" list=\"colors\" name=\"yourColor\" /\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 產生下面的HTML代碼 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;td class=\"tdLabel\"\u0026gt;\u0026lt;label for=\"resultAction_yourColor\" class=\"label\"\u0026gt;\r\nWhat's your favor color:\u0026lt;/label\u0026gt;\r\n\u0026lt;/td\u0026gt; \r\n\u0026lt;td \u0026gt; \r\n\u0026lt;input type=\"checkbox\" name=\"yourColor\" value=\"red\" id=\"yourColor-1\" /\u0026gt; \r\n\u0026lt;label for=\"yourColor-1\" class=\"checkboxLabel\"\u0026gt;red\u0026lt;/label\u0026gt; \r\n\u0026lt;input type=\"checkbox\" name=\"yourColor\" value=\"yellow\" id=\"yourColor-2\" /\u0026gt; \r\n\u0026lt;label for=\"yourColor-2\" class=\"checkboxLabel\"\u0026gt;yellow\u0026lt;/label\u0026gt; \r\n\u0026lt;input type=\"checkbox\" name=\"yourColor\" value=\"blue\" id=\"yourColor-3\" /\u0026gt; \r\n\u0026lt;label for=\"yourColor-3\" class=\"checkboxLabel\"\u0026gt;blue\u0026lt;/label\u0026gt; \r\n\u0026lt;input type=\"checkbox\" name=\"yourColor\" value=\"green\" id=\"yourColor-4\" /\u0026gt; \r\n\u0026lt;label for=\"yourColor-4\" class=\"checkboxLabel\"\u0026gt;green\u0026lt;/label\u0026gt; \r\n\u0026lt;input type=\"hidden\" id=\"__multiselect_resultAction_yourColor\" \r\n name=\"__multiselect_yourColor\" value=\"\" /\u0026gt; \r\n\u0026lt;/td\u0026gt;\u003c/pre\u003e \n\u003cp\u003e Action類提供顏色選項的複選框的列表。 \u003c/p\u003e \n\u003cpre\u003e//...\r\npublic class CheckBoxListAction extends ActionSupport{\r\n\r\n\tprivate List\u0026lt;String\u0026gt; colors;\r\n\tprivate String yourColor;\r\n\r\n\tpublic CheckBoxListAction(){\r\n\t\t\r\n\t\tcolors = new ArrayList\u0026lt;String\u0026gt;();\r\n\t\tcolors.add(\"red\");\r\n\t\tcolors.add(\"yellow\");\r\n\t\tcolors.add(\"blue\");\r\n\t\tcolors.add(\"green\");\r\n\t}\r\n\t\r\n\tpublic List\u0026lt;String\u0026gt; getColors() {\r\n\t\treturn colors;\r\n\t}\r\n\t//...\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. 單個默認選中值 \u003c/h2\u003e \n\u003cp\u003e 要作爲默認選中的值設爲「紅」選項,只是在行動類中添加一個方法,並返回一個「red」的值。 \u003c/p\u003e \n\u003cpre\u003e//...\r\npublic class CheckBoxListAction extends ActionSupport{\r\n\r\n\t//add a new method\r\n\tpublic String getDefaultColor(){\r\n\t\treturn \"red\";\r\n\t}\r\n}\u003c/pre\u003e \n\u003cp\u003e 在\u0026lt;s:checkboxlist\u0026gt;標籤中,添加一個value屬性並指向 getDefaultColor()方法。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:checkboxlist label=\"What's your favor color\" list=\"colors\" \r\n name=\"yourColor\" value=\"defaultColor\" /\u0026gt;\u003c/pre\u003e \n\u003cdiv class=\"note\"\u003e\n Struts 2將「defaultColor」值匹配到對應Java屬性getDefaultColor()。 \n\u003c/div\u003e \n\u003cp\u003e 再次運行它,「紅」選項將被默認選中。 \u003c/p\u003e \n\u003ch2\u003e 2. 多個默認選中的值 \u003c/h2\u003e \n\u003cp\u003e 要設置多個值「紅色」和「綠色」作爲默認選中的值,就返回一個「String []」,而不是「String\u0026nbsp;」,在Struts 2將相應匹配。 \u003c/p\u003e \n\u003cpre\u003e//...\r\npublic class CheckBoxListAction extends ActionSupport{\r\n\r\n\t//now return a String[]\r\n\tpublic String[] getDefaultColor(){\r\n\t\treturn new String [] {\"red\", \"green\"};\r\n\t}\r\n}\u003c/pre\u003e \n\u003cpre\u003e\u0026lt;s:checkboxlist label=\"What's your favor color\" list=\"colors\" \r\n name=\"yourColor\" value=\"defaultColor\" /\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 再次運行它,「紅色」和「綠色」的選項將被默認選中。 \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cp\u003e \u003ca href=\"http://localhost:8080/struts2setcheckboxes/checkBoxListAction.action\"\u003ehttp://localhost:8080/struts2setcheckboxes/checkBoxListAction.action\u003c/a\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-9.png\" alt=\"Struts2設置多個複選框缺省值\"\u003e \u003c/p\u003e \n\u003cp\u003e 點擊提交後,顯示結果如下圖所示: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-10.png\" alt=\"Struts2設置多個複選框缺省值\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"51:T13fe,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 這裏創建一個Web工程:struts2checkboxlist,來演示在多個複選框如何設置的默認值,整個項目的結構如下圖所示: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/checkboxlist-1.png\" alt=\"Struts2 \u003cs:checkboxlist\u003e多個複選框例子\"\u003e \u003c/p\u003e \n\u003cp\u003e 在Struts2,可以使用\u0026lt;s:checkboxlist\u0026gt;標籤來使用相同的名稱來創建多個複選框。唯一的問題是如何把握變量中的多個檢查值? 例如, \u003c/p\u003e \n\u003cpre\u003epublic List\u0026lt;String\u0026gt; getColors() {\r\n\tcolors = new ArrayList\u0026lt;String\u0026gt;();\r\n\tcolors.add(\"red\");\r\n\tcolors.add(\"yellow\");\r\n\tcolors.add(\"blue\");\r\n\tcolors.add(\"green\");\r\n\treturn colors;\r\n}\u003c/pre\u003e \n\u003cpre\u003e\u0026lt;s:checkboxlist label=\"What's your favor color\" list=\"colors\" \r\nname=\"yourColor\" value=\"defaultColor\" /\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 一個多複選框以「紅」,「黃」,「藍」和「綠色」爲選項。如果有多個選項被選中,可以通過一個String對象存儲。 \u003c/p\u003e \n\u003cp\u003e 例如,如果「紅」「黃」選項被選中,選中的值將用逗號相結合連接,yourColor = 「red,yellow」. \u003c/p\u003e \n\u003cpre\u003eprivate String yourColor;\r\n\t\r\npublic void setYourColor(String yourColor) {\r\n\tthis.yourColor = yourColor;\r\n}\u003c/pre\u003e \n\u003cdiv class=\"note\"\u003e\n 閱讀這篇文章,有關如何設置多個複選框的默認值。 \n\u003c/div\u003e \n\u003ch2\u003e Struts2\u0026nbsp;\u0026lt;s:checkboxlist\u0026gt;\u0026nbsp;示例 \u003c/h2\u003e \n\u003cp\u003e 一個完整的Struts2實例,通過\u0026lt;s:checkboxlist\u0026gt;用相同的名稱創建多個複選框,存儲檢選中的值,並在另一頁面中顯示。 \u003c/p\u003e \n\u003ch2\u003e 1. 動作 - Action \u003c/h2\u003e \n\u003cp\u003e Action類來生成和保持的多個複選框值。\u003cbr\u003e \u003cstrong\u003eCheckBoxListAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class CheckBoxListAction extends ActionSupport{\r\n\r\n\tprivate List\u0026lt;String\u0026gt; colors;\r\n\r\n\tprivate String yourColor;\r\n\t\r\n\tpublic String getYourColor() {\r\n\t\treturn yourColor;\r\n\t}\r\n\r\n\tpublic void setYourColor(String yourColor) {\r\n\t\tthis.yourColor = yourColor;\r\n\t}\r\n\r\n\tpublic CheckBoxListAction(){\r\n\t\tcolors = new ArrayList\u0026lt;String\u0026gt;();\r\n\t\tcolors.add(\"red\");\r\n\t\tcolors.add(\"yellow\");\r\n\t\tcolors.add(\"blue\");\r\n\t\tcolors.add(\"green\");\r\n\t}\r\n\t\r\n\tpublic String[] getDefaultColor(){\r\n\t\treturn new String [] {\"red\", \"green\"};\r\n\t}\r\n\t\r\n\tpublic List\u0026lt;String\u0026gt; getColors() {\r\n\t\treturn colors;\r\n\t}\r\n\r\n\tpublic void setColors(List\u0026lt;String\u0026gt; colors) {\r\n\t\tthis.colors = colors;\r\n\t}\r\n\r\n\tpublic String execute() {\r\n\t\treturn SUCCESS;\r\n\t}\r\n\t\r\n\tpublic String display() {\r\n\t\treturn NONE;\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. 結果頁面 \u003c/h2\u003e \n\u003cp\u003e 通過「s:checkboxlist」標籤渲染多個複選框。\u003cbr\u003e \u003cstrong\u003echeckBoxlist.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 multiple check boxes example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:form action=\"resultAction\" namespace=\"/\"\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n\t\u0026lt;s:checkboxlist label=\"What's your favor color\" list=\"colors\" \r\n\t name=\"yourColor\" value=\"defaultColor\" /\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;s:submit value=\"submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eresult.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 multiple check boxes example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n Favor colors : \u0026lt;s:property value=\"yourColor\"/\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \t\r\n\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"checkBoxListAction\" \r\n class=\"com.yiibai.common.action.CheckBoxListAction\" method=\"display\"\u0026gt;\r\n\t\u0026lt;result name=\"none\"\u0026gt;/pages/checkBoxlist.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"resultAction\" class=\"com.yiibai.common.action.CheckBoxListAction\"\u0026gt;\r\n\t\u0026lt;result name=\"success\"\u0026gt;/pages/result.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. 實例 \u003c/h2\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/struts2checkboxlist/checkBoxListAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/checkboxlist-2.png\" alt=\"Struts2 \u003cs:checkboxlist\u003e多個複選框例子\"\u003e \n \u003cbr\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/struts2checkboxlist/resultAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cp\u003e \u003cem\u003e\u003cimg src=\"https://asset.1ju.org/cmsstatic/checkboxlist-3.png\" alt=\"Struts2 \u003cs:checkboxlist\u003e多個複選框例子\"\u003e\u003cbr\u003e \u003c/em\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/checkboxlist.html\"\u003eStruts 2 checkboxlist 文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv class=\"download\"\u003e\n 下載代碼 –\u0026nbsp; \n \u003ca href=\"http://pan.baidu.com/s/1dDCxAiH\"\u003ehttp://pan.baidu.com/s/1dDCxAiH\u003c/a\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"52:T17ad,"])</script><script>self.__next_f.push([1,"\u003cp\u003e \u003cspan\u003e這裏創建一個Web工程:strut2selectdropdown,來演示\u003c/span\u003e\u003cspan\u003e在多個複選框\u003c/span\u003e\u003cspan\u003e如何設置的默認值,整個項目的結構如下圖所示:\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/select-1.png\" alt=\"Struts2 \u003cs:select\u003e下拉框例子\"\u003e \u003c/p\u003e \n\u003cp\u003e 在Struts2,可以使用 \u0026lt;s:select\u0026gt; 標籤來創建一個HTML下拉框。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:select label=\"What's your favor search engine\" \r\n\t\theaderKey=\"-1\" headerValue=\"Select Search Engines\"\r\n\t\tlist=\"searchEngine\" \r\n\t\tname=\"yourSearchEngine\" /\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 產生下面的HTML代碼... \u003c/p\u003e \n\u003cpre\u003e\u0026lt;td class=\"tdLabel\"\u0026gt;\r\n \u0026lt;label for=\"resultAction_yourSearchEngine\" class=\"label\"\u0026gt;\r\n What's your favor search engine:\r\n \u0026lt;/label\u0026gt;\r\n\u0026lt;/td\u0026gt; \r\n\u0026lt;td\u0026gt;\r\n\u0026lt;select name=\"yourSearchEngine\" id=\"resultAction_yourSearchEngine\"\u0026gt; \r\n \u0026lt;option value=\"-1\"\u0026gt;Select Search Engines\u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"google.com\"\u0026gt;google.com\u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"bing.com\"\u0026gt;bing.com\u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"yahoo.com\"\u0026gt;yahoo.com\u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"baidu.com\"\u0026gt;baidu.com\u0026lt;/option\u0026gt; \r\n\u0026lt;/select\u0026gt; \r\n\u0026lt;/td\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 其語法不需要太多解釋,只不過是「headerKey」和「headerValue」。「headerKey」是一個在下拉列表中項用來表示鍵,而「headerValue」是在下拉列表中的項目表示值。 \u003c/p\u003e \n\u003cdiv class=\"note\"\u003e\n 要自動選擇下拉框中的默認值,看看這篇文章:自動選擇Struts2下拉框的值 \n\u003c/div\u003e \n\u003ch2\u003e Struts 2\u0026nbsp;\u0026lt;s:select\u0026gt;\u0026nbsp;示例 \u003c/h2\u003e \n\u003cp\u003e 一個通過\u0026lt;s:select\u0026gt;創建下拉框完整的Struts2的例子,和填充通過Java列表,OGNL列表中選擇選項,保存所選的值,並在另一頁顯示。 \u003c/p\u003e \n\u003ch2\u003e 1. 動作 - Action \u003c/h2\u003e \n\u003cp\u003e Action類來生成並按住選定的下拉框中選項。\u003cbr\u003e \u003cstrong\u003eSelectAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class SelectAction extends ActionSupport{\r\n\r\n\tprivate List\u0026lt;String\u0026gt; searchEngine;\r\n\r\n\tprivate String yourSearchEngine;\r\n\tprivate String yourMonth;\r\n\t\r\n\tpublic String getYourMonth() {\r\n\t\treturn yourMonth;\r\n\t}\r\n\r\n\tpublic void setYourMonth(String yourMonth) {\r\n\t\tthis.yourMonth = yourMonth;\r\n\t}\r\n\r\n\tpublic List\u0026lt;String\u0026gt; getSearchEngine() {\r\n\t\treturn searchEngine;\r\n\t}\r\n\r\n\tpublic void setSearchEngine(List\u0026lt;String\u0026gt; searchEngine) {\r\n\t\tthis.searchEngine = searchEngine;\r\n\t}\r\n\r\n\tpublic String getYourSearchEngine() {\r\n\t\treturn yourSearchEngine;\r\n\t}\r\n\r\n\tpublic void setYourSearchEngine(String yourSearchEngine) {\r\n\t\tthis.yourSearchEngine = yourSearchEngine;\r\n\t}\r\n\r\n\tpublic String getDefaultSearchEngine() {\r\n\t\treturn \"yahoo.com\";\r\n\t}\r\n\t\r\n\tpublic SelectAction(){\r\n\t\t\r\n\t\tsearchEngine = new ArrayList\u0026lt;String\u0026gt;();\r\n\t\tsearchEngine.add(\"google.com\");\r\n\t\tsearchEngine.add(\"bing.com\");\r\n\t\tsearchEngine.add(\"yahoo.com\");\r\n\t\tsearchEngine.add(\"baidu.com\");\r\n\t}\r\n\r\n\tpublic String execute() {\r\n\t\treturn SUCCESS;\r\n\t}\r\n\t\r\n\tpublic String display() {\r\n\t\treturn NONE;\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. 結果頁面 \u003c/h2\u003e \n\u003cp\u003e 渲染下拉框中通過「\u0026lt;s:select\u0026gt;」標籤,並填充通過Java列表,OGNL列表中的選擇選項 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eselect.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 drop down box example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:form action=\"resultAction\" namespace=\"/\"\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n\t\u0026lt;s:select label=\"What's your favor search engine\" \r\n\t\theaderKey=\"-1\" headerValue=\"Select Search Engines\"\r\n\t\tlist=\"searchEngine\" \r\n\t\tname=\"yourSearchEngine\" \r\n\t\tvalue=\"defaultSearchEngine\" /\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;h2\u0026gt;\r\n\t\u0026lt;s:select label=\"Select a month\" \r\n\t\theaderKey=\"-1\" headerValue=\"Select Month\"\r\n\t\tlist=\"#{'1':'Jan', '2':'Feb', '3':'Mar', '4':'Apr'}\" \r\n\t\tname=\"yourMonth\" \r\n\t\tvalue=\"2\" /\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;s:submit value=\"submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eresult.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 drop down box example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n Favor search engine : \u0026lt;s:property value=\"yourSearchEngine\"/\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;h2\u0026gt;\r\n Selected month : \u0026lt;s:property value=\"yourMonth\"/\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \t\r\n\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"selectAction\" \r\n class=\"com.yiibai.common.action.SelectAction\" method=\"display\"\u0026gt;\r\n\t\u0026lt;result name=\"none\"\u0026gt;/pages/select.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"resultAction\" class=\"com.yiibai.common.action.SelectAction\"\u0026gt;\r\n\t\u0026lt;result name=\"success\"\u0026gt;/pages/result.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. 運行實例 \u003c/h2\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/strut2selectdropdown/selectAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/select-2.png\" alt=\"Struts2 \u003cs:select\u003e下拉框例子\"\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/strut2selectdropdown/resultAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/select-3.png\" alt=\"Struts2 \u003cs:select\u003e下拉框例子\"\u003e \n\u003c/div\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.x/docs/select.html\"\u003eStruts 2 select 文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cdiv class=\"download\"\u003e\n 下載代碼 –\u0026nbsp; \n \u003ca href=\"http://pan.baidu.com/s/1eQGzqHO\"\u003ehttp://pan.baidu.com/s/1eQGzqHO\u003c/a\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"53:T817,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 在Struts2中,HTML下拉框可以通過\u0026lt;s:select\u0026gt;標籤呈現。要自動選擇一個下拉框的默認值,只是聲明\u0026lt;s:select\u0026gt;值」屬性標記,並設置相應的默認值。 \u003c/p\u003e \n\u003cp\u003e 這裏創建一個Web工程:strut2autoselectdropdown,來演示在多個複選框如何設置的默認值,整個項目的結構如下圖所示: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-11.png\" alt=\"Struts2自動選擇下拉框的值\"\u003e \u003c/p\u003e \n\u003ch2\u003e 1. Java List 示例 \u003c/h2\u003e \n\u003cp\u003e Java列表生成選擇選項的下拉框。 \u003c/p\u003e \n\u003cpre\u003e//...\r\npublic class SelectAction extends ActionSupport{\r\n\r\n\tprivate List\u0026lt;String\u0026gt; searchEngine;\r\n\tprivate String yourSearchEngine;\r\n\t\r\n\t//set default value\r\n\tpublic String getDefaultSearchEngine() {\r\n\t\treturn \"yahoo.com\";\r\n\t}\r\n\tpublic SelectAction(){\t\r\n\t\tsearchEngine = new ArrayList\u0026lt;String\u0026gt;();\r\n\t\tsearchEngine.add(\"google.com\");\r\n\t\tsearchEngine.add(\"bing.com\");\r\n\t\tsearchEngine.add(\"yahoo.com\");\r\n\t\tsearchEngine.add(\"baidu.com\");\r\n\t}\r\n\t//...\r\n}\u003c/pre\u003e \n\u003cp\u003e \u0026lt;s:select\u0026gt;標記呈現HTML下拉框。value=「defaultSearchEngine」將調用對應動作類的getDefaultSearchEngine()方法返回一個默認搜索引擎的值。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:select label=\"What's your favor search engine\" \r\n\t\theaderKey=\"-1\" headerValue=\"Select Search Engines\"\r\n\t\tlist=\"searchEngine\" \r\n\t\tname=\"yourSearchEngine\" \r\n\t\tvalue=\"defaultSearchEngine\" /\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 在這個例子中,下拉框將自動選擇「yahoo.com」作爲默認選項。 \u003c/p\u003e \n\u003ch2\u003e 2. OGNL List 實例 \u003c/h2\u003e \n\u003cp\u003e 通過創建OGNL表達式一個下拉框,並直接在「value」屬性設置的默認值。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:select label=\"Select a month\" \r\n\t\theaderKey=\"-1\" headerValue=\"Select Month\"\r\n\t\tlist=\"#{'1':'Jan', '2':'Feb', '3':'Mar', '4':'Apr'}\" \r\n\t\tname=\"yourMonth\" \r\n\t\tvalue=\"2\" /\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 在這個例子中,下拉框將自動選擇「2」 (Feb)爲默認選項。 \u003c/p\u003e \n\u003cdiv class=\"download\"\u003e\n 下載代碼 –\u0026nbsp; \n \u003ca href=\"http://pan.baidu.com/s/1mgq49nU\"\u003ehttp://pan.baidu.com/s/1mgq49nU\u003c/a\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"54:T1984,"])</script><script>self.__next_f.push([1,"\u003cp\u003e \u003cspan\u003e這裏創建一個Web工程:strut2\u003cspan\u003ecombobox\u003c/span\u003e,來演示\u003c/span\u003e\u003cspan\u003e在多個複選框\u003c/span\u003e\u003cspan\u003e如何設置的默認值,整個項目的結構如下圖所示:\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/combobox-1.png\" alt=\"Struts2 \u003cs:combobox\u003e組合框的例子\"\u003e \u003c/p\u003e \n\u003cp\u003e 在Struts2, \u0026lt;s:combobox\u0026gt;標籤是一個下拉列表單文本框組合在一起,允許用戶直接輸入一個值在文本框中,或選擇從下拉列表中選擇值,並選定值將自動填充到文本框中。 \u003c/p\u003e \n\u003cdiv class=\"note\"\u003e\n 如果下拉列表和組合框列表,請閱讀 \n \u003ca href=\"http://en.wikipedia.org/wiki/Combo_box\"\u003e維基組合框\u003cspan\u003e定義\u003c/span\u003e\u003c/a\u003e以免混淆。 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;s:combobox label=\"What's your favor fruit\" \r\n\t\theaderKey=\"-1\" headerValue=\"--- Select ---\"\r\n\t\tlist=\"fruits\" \r\n\t\tname=\"yourFruits\" /\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 產生下面的HTML代碼... \u003c/p\u003e \n\u003cpre\u003e\u0026lt;td class=\"tdLabel\"\u0026gt;\r\n \u0026lt;label for=\"resultAction_yourFruits\" class=\"label\"\u0026gt;\r\n What's your favor fruit:\r\n \u0026lt;/label\u0026gt;\r\n\u0026lt;/td\u0026gt; \r\n\u0026lt;td\u0026gt; \r\n\u0026lt;script type=\"text/javascript\"\u0026gt; \r\nfunction autoPopulate_resultAction_yourFruits(targetElement) {\r\n\tif (targetElement.options[targetElement.selectedIndex].value == '-1') {\r\n\t\treturn;\r\n\t}\r\n\ttargetElement.form.elements['yourFruits'].value=\r\n targetElement.options[targetElement.selectedIndex].value;\r\n}\r\n\u0026lt;/script\u0026gt; \r\n\u0026lt;input type=\"text\" name=\"yourFruits\" value=\"\" id=\"resultAction_yourFruits\"/\u0026gt;\r\n\u0026lt;br /\u0026gt; \r\n\u0026lt;select onChange=\"autoPopulate_resultAction_yourFruits(this);\"\u0026gt; \r\n \u0026lt;option value=\"-1\"\u0026gt;--- Select ---\u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"Apple\"\u0026gt;Apple\u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"Banana\"\u0026gt;Banana\u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"Orange\"\u0026gt;Orange\u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"Watermelon\"\u0026gt;Watermelon\u0026lt;/option\u0026gt; \r\n\u0026lt;/select\u0026gt; \r\n\u0026lt;/td\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u0026lt;s:combobox\u0026gt; 標記將產生輸入文本框,下拉列表中有「onChange()」方法調用來生成的JavaScript 來從下拉列表中選擇的值到\u003cspan\u003e自動填充\u003c/span\u003e生成的文本框中。 \u003c/p\u003e \n\u003cdiv class=\"note\"\u003e\n 如要創建一個下拉列表,應該使用\u0026nbsp;\u0026lt;s:select\u0026gt;標籤來代替。 \n\u003c/div\u003e \n\u003ch2\u003e Struts 2\u0026nbsp;\u0026lt;s:combobox\u0026gt;\u0026nbsp;示例 \u003c/h2\u003e \n\u003cp\u003e 一個完整的Struts2示例,通過利用\u0026lt;s:combobox\u0026gt;說明組合框。 \u003c/p\u003e \n\u003ch2\u003e 1. 動作 -\u0026nbsp;Action \u003c/h2\u003e \n\u003cp\u003e Action類來生成並按住選定的組合框的選項。\u003cbr\u003e \u003cstrong\u003eComboBoxAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class ComboBoxAction extends ActionSupport{\r\n\r\n\tprivate List\u0026lt;String\u0026gt; fruits;\r\n\r\n\tprivate String yourFruits;\r\n\tprivate String yourMonth;\r\n\t\r\n\tpublic String getYourMonth() {\r\n\t\treturn yourMonth;\r\n\t}\r\n\r\n\tpublic void setYourMonth(String yourMonth) {\r\n\t\tthis.yourMonth = yourMonth;\r\n\t}\r\n\r\n\tpublic List\u0026lt;String\u0026gt; getFruits() {\r\n\t\treturn fruits;\r\n\t}\r\n\r\n\tpublic void setFruits(List\u0026lt;String\u0026gt; fruits) {\r\n\t\tthis.fruits = fruits;\r\n\t}\r\n\r\n\tpublic String getYourFruits() {\r\n\t\treturn yourFruits;\r\n\t}\r\n\r\n\tpublic void setYourFruits(String yourFruits) {\r\n\t\tthis.yourFruits = yourFruits;\r\n\t}\r\n\r\n\tpublic ComboBoxAction(){\r\n\t\t\r\n\t\tfruits = new ArrayList\u0026lt;String\u0026gt;();\r\n\t\tfruits.add(\"Apple\");\r\n\t\tfruits.add(\"Banana\");\r\n\t\tfruits.add(\"Orange\");\r\n\t\tfruits.add(\"Watermelon\");\r\n\t}\r\n\r\n\tpublic String execute() {\r\n\t\treturn SUCCESS;\r\n\t}\r\n\t\r\n\tpublic String display() {\r\n\t\treturn NONE;\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. 結果頁面 \u003c/h2\u003e \n\u003cp\u003e 通過「\u0026lt;s:combobox\u0026gt;」標籤渲染組合框,並填充通過Java列表,OGNL列表中選擇選項 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003ecombobox.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 \u0026lt;s:combobox\u0026gt; example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:form action=\"resultAction\" namespace=\"/\"\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n\t\u0026lt;s:combobox label=\"What's your favor fruit\" \r\n\t\theaderKey=\"-1\" headerValue=\"--- Select ---\"\r\n\t\tlist=\"fruits\" \r\n\t\tname=\"yourFruits\" /\u0026gt;\r\n\u0026lt;/h2\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n\t\u0026lt;s:combobox label=\"Select a month\" \r\n\t\theaderKey=\"-1\" headerValue=\"--- Select ---\"\r\n\t\tlist=\"#{'1':'Jan', '2':'Feb', '3':'Mar', '4':'Apr'}\" \r\n\t\tname=\"yourMonth\" /\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;s:submit value=\"submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eresult.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 \u0026lt;s:combobox\u0026gt; example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n Favor fruit : \u0026lt;s:property value=\"yourFruits\"/\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;h2\u0026gt;\r\n Selected month : \u0026lt;s:property value=\"yourMonth\"/\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \t\r\n\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"comboBoxAction\" \r\n class=\"com.yiibai.common.action.ComboBoxAction\" method=\"display\"\u0026gt;\r\n\t\u0026lt;result name=\"none\"\u0026gt;pages/combobox.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"resultAction\" class=\"com.yiibai.common.action.ComboBoxAction\"\u0026gt;\r\n\t\u0026lt;result name=\"success\"\u0026gt;pages/result.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\r\n\u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. 示例 \u003c/h2\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/strut2combobox/comboBoxAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cspan\u003e\u003c/span\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/combobox-2.png\" alt=\"Struts2 \u003cs:combobox\u003e組合框的例子\"\u003e \n \u003cbr\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/strut2combobox/resultAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/combobox-3.png\" alt=\"Struts2 \u003cs:combobox\u003e組合框的例子\"\u003e \n \u003cbr\u003e \n\u003c/div\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.x/docs/combobox.html\"\u003eStruts 2 combobox文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e \u003c/p\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://en.wikipedia.org/wiki/Combo_box\"\u003eWiki combo box 定義\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e \u003cspan\u003e下載代碼:\u003ca href=\"http://pan.baidu.com/s/1qW8Ds5Y\"\u003ehttp://pan.baidu.com/s/1qW8Ds5Y\u003c/a\u003e\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"55:T68e,"])</script><script>self.__next_f.push([1,"\u003cp\u003e \u0026lt;s:head\u0026gt;標籤是用來輸出如編碼,CSS或JavaScript文件的HTML頭信息。請參見下面的代碼片段: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;s:head /\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n..\u003c/pre\u003e \n\u003cp\u003e 假設使用的是默認XHTML主題,它會根據「template\\xhtml\\head.ftl」文件渲染輸出: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;link rel=\"stylesheet\" href=\"/your_project/struts/xhtml/styles.css\" type=\"text/css\"/\u0026gt; \r\n\u0026lt;script src=\"/your_project/struts/utils.js\" type=\"text/javascript\"\u0026gt;\u0026lt;/script\u0026gt; \r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n..\u003c/pre\u003e \n\u003cp\u003e 要包括新的JS和CSS文件,只需將其添加到「template\\xhtml\\head.ftl」模板文件,並通過\u0026lt;s:head\u0026gt;標籤輸出。其實,這個\u0026lt;S:head\u0026gt;標籤並不需要HTML \u0026lt;head\u0026gt;標籤, \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003e\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;head\u0026gt;\r\n\u0026lt;s:head /\u0026gt;\r\n\u0026lt;/head\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 可以把它放在任何地方,它只是輸出 CSS 和 JS 文件路徑(默認情況下,XHTML的主題)。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;s:head /\u0026gt;\r\n...\u003c/pre\u003e \n\u003cdiv class=\"note\"\u003e \n \u003cstrong\u003e良好實踐\u003c/strong\u003e \n \u003cp\u003e 爲了提高網站的性能,良好的做法是把CSS文件在頁面頂部;\u0026nbsp;而JS文件在頁面底部。 So, the\u0026nbsp;因此,\u0026lt;s:head\u0026gt;標籤可能不適合,一個很好的做法應該是創創建新的標籤將CSS和JS文件輸出分開。例如,\u0026lt;s:css\u0026gt;\u0026nbsp;和\u0026nbsp;\u0026lt;s:javascript\u0026gt;。 \u003c/p\u003e \n\u003c/div\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.x/docs/head.html\"\u003eStruts 2 \u0026lt;s:head\u0026gt; 示例\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"56:T202f,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 在Struts2, \u0026lt;s:file\u0026gt; 標籤用於創建一個HTML文件上傳組件,允許用戶從本地磁盤選擇文件,並將其上傳到服務器。在本教程中,您將創建與文件上傳組件JSP頁面,設置最大大小和允許上傳文件的內容類型,並顯示上傳文件的詳細信息。 \u003c/p\u003e \n\u003cp\u003e \u003cspan\u003e這裏創建一個Web工程:strut2uploadfile,來演示\u003c/span\u003e\u003cspan\u003e在多個複選框\u003c/span\u003e\u003cspan\u003e如何設置的默認值,整個項目的結構如下圖所示:\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-12.png\" alt=\"Struts2文件上傳例子\"\u003e \u003c/p\u003e \n\u003ch2\u003e 1. 動作類 \u003c/h2\u003e \n\u003cp\u003e Action類的文件上傳,聲明「File」變量來存儲用戶上傳的文件,兩個字符串變量以存儲文件名和內容類型。「文件上傳攔截器」通過設置「X」的ContentType(),並設置「X」FileName()會自動注入上傳的文件細節,確保方法名拼寫正確。 \u003c/p\u003e \n\u003cp\u003e P.S X是以存儲上傳的文件中的變量。 \u003c/p\u003e \n\u003cdiv class=\"note\"\u003e\n 文件上傳功能是依賴於「文件上傳攔截器」,確保將其納入行動的堆棧。幸運的是,默認的堆棧已經包含了「文件上傳攔截器」。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eFileUploadAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.io.File;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class FileUploadAction extends ActionSupport{\r\n\r\n\tprivate File fileUpload;\r\n\tprivate String fileUploadContentType;\r\n\tprivate String fileUploadFileName;\r\n\r\n\tpublic String getFileUploadContentType() {\r\n\t\treturn fileUploadContentType;\r\n\t}\r\n\r\n\tpublic void setFileUploadContentType(String fileUploadContentType) {\r\n\t\tthis.fileUploadContentType = fileUploadContentType;\r\n\t}\r\n\r\n\tpublic String getFileUploadFileName() {\r\n\t\treturn fileUploadFileName;\r\n\t}\r\n\r\n\tpublic void setFileUploadFileName(String fileUploadFileName) {\r\n\t\tthis.fileUploadFileName = fileUploadFileName;\r\n\t}\r\n\r\n\tpublic File getFileUpload() {\r\n\t\treturn fileUpload;\r\n\t}\r\n\r\n\tpublic void setFileUpload(File fileUpload) {\r\n\t\tthis.fileUpload = fileUpload;\r\n\t}\r\n\r\n\tpublic String execute() throws Exception{\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t\t\r\n\t}\r\n\t\r\n\tpublic String display() {\r\n\t\treturn NONE;\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. 結果頁面 \u003c/h2\u003e \n\u003cp\u003e 使用\u0026lt;s:file\u0026gt;標籤來渲染一個文件上傳組件,並設置表單的enctype類型爲:「multipart/form-data」。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003efileupload.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;s:head /\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 \u0026lt;s:file\u0026gt; file upload example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:form action=\"resultAction\" namespace=\"/\" \r\nmethod=\"POST\" enctype=\"multipart/form-data\"\u0026gt;\r\n\r\n\u0026lt;s:file name=\"fileUpload\" label=\"Select a File to upload\" size=\"40\" /\u0026gt;\r\n\r\n\u0026lt;s:submit value=\"submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eresult.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 \u0026lt;s:file\u0026gt; file upload example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;div\u0026gt;\u0026lt;div class=\"ads-in-post hide_if_width_less_800\"\u0026gt;\r\n\u0026lt;script async src=\"//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\"\u0026gt;\u0026lt;/script\u0026gt;\r\n\u0026lt;!-- 728x90 - After2ndH4 --\u0026gt;\r\n\u0026lt;ins class=\"adsbygoogle hide_if_width_less_800\" \r\n style=\"display:inline-block;width:728px;height:90px\"\r\n data-ad-client=\"ca-pub-2836379775501347\"\r\n data-ad-slot=\"3642936086\"\r\n\t data-ad-region=\"yiibairegion\"\u0026gt;\u0026lt;/ins\u0026gt;\r\n\u0026lt;script\u0026gt;\r\n(adsbygoogle = window.adsbygoogle || []).push({});\r\n\u0026lt;/script\u0026gt;\r\n\u0026lt;/div\u0026gt;\u0026lt;/div\u0026gt;\u0026lt;h2\u0026gt;\r\n File Name : \u0026lt;s:property value=\"fileUploadFileName\"/\u0026gt; \r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;h2\u0026gt;\r\n Content Type : \u0026lt;s:property value=\"fileUploadContentType\"/\u0026gt; \r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;h2\u0026gt;\r\n File : \u0026lt;s:property value=\"fileUpload\"/\u0026gt; \r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \t\u0026lt;constant name=\"struts.custom.i18n.resources\" value=\"global\" /\u0026gt;\r\n \t\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\r\n\t\u0026lt;action name=\"fileUploadAction\" \r\n\t class=\"com.yiibai.common.action.FileUploadAction\" method=\"display\"\u0026gt;\r\n\t \u0026lt;result name=\"none\"\u0026gt;/pages/fileupload.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;action name=\"resultAction\" class=\"com.yiibai.common.action.FileUploadAction\"\u0026gt;\r\n\t \u0026lt;interceptor-ref name=\"exception\"/\u0026gt;\r\n \u0026lt;interceptor-ref name=\"i18n\"/\u0026gt;\r\n \u0026lt;interceptor-ref name=\"fileUpload\"\u0026gt;\r\n \t\t\u0026lt;param name=\"allowedTypes\"\u0026gt;text/plain\u0026lt;/param\u0026gt;\r\n \t\t\u0026lt;param name=\"maximumSize\"\u0026gt;10240\u0026lt;/param\u0026gt;\r\n \t \u0026lt;/interceptor-ref\u0026gt; \r\n \u0026lt;interceptor-ref name=\"params\"\u0026gt;\r\n \u0026lt;param name=\"excludeParams\"\u0026gt;dojo\\..*,^struts\\..*\u0026lt;/param\u0026gt;\r\n \u0026lt;/interceptor-ref\u0026gt;\r\n \u0026lt;interceptor-ref name=\"validation\"\u0026gt;\r\n \u0026lt;param name=\"excludeMethods\"\u0026gt;input,back,cancel,browse\u0026lt;/param\u0026gt;\r\n \u0026lt;/interceptor-ref\u0026gt;\r\n \u0026lt;interceptor-ref name=\"workflow\"\u0026gt;\r\n \u0026lt;param name=\"excludeMethods\"\u0026gt;input,back,cancel,browse\u0026lt;/param\u0026gt;\r\n \u0026lt;/interceptor-ref\u0026gt;\r\n \r\n\t \u0026lt;result name=\"success\"\u0026gt;/pages/result.jsp\u0026lt;/result\u0026gt;\r\n\t \u0026lt;result name=\"input\"\u0026gt;/pages/fileupload.jsp\u0026lt;/result\u0026gt;\r\n\t\t\t\r\n\t\u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003e文件大小限制\u003c/strong\u003e\u003cbr\u003e 在這個例子中,您將通過「文件上傳攔截」上傳文件大小的限制,\u0026nbsp;該值以字節爲單位計數。在本實例中,上載文件的最大尺寸是10KB。 \u003c/p\u003e \n\u003cdiv class=\"note\"\u003e\n 注:上傳文件的默認最大文件大小爲2MB \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003e文件類型\u003c/strong\u003e\u003cbr\u003e 可以通過設置「文件上傳攔截器」允許的文件類型。在這種情況下,上傳文件只接受「text/plain」\u003cspan\u003e的\u003c/span\u003e類型。\u003cspan\u003e\u003c/span\u003e \u003c/p\u003e \n\u003cdiv class=\"note\"\u003e\n 在Struts2中,有好幾種方面做到這一點,查看 \n \u003ca href=\"http://struts.apache.org/2.0.14/docs/file-upload.html\"\u003eStruts2的文件上傳文檔\u003c/a\u003e。 \n\u003c/div\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/Struts2Example/fileUploadAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-13.png\" alt=\"Struts2文件上傳例子\"\u003e \n \u003cbr\u003e \n\u003c/div\u003e \n\u003cp\u003e 錯誤信息提示,如果您上傳一個文件,該文件超過10KB,或者未選文本文件。 \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-14.png\" alt=\"Struts2文件上傳例子\"\u003e \n \u003cbr\u003e \n\u003c/div\u003e \n\u003cp\u003e 上傳名爲「yiibai.com.txt」\u003cspan\u003e的文本文件\u003c/span\u003e, 文件大小 : 5kb. \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-15.png\" alt=\"Struts2文件上傳例子\"\u003e \n \u003cbr\u003e \n\u003c/div\u003e \n\u003cp\u003e 上傳的文件將被視爲一個臨時文件,具有長的隨機文件名,如:upload__376584a7_12981122379__8000_00000010.tmp. 請確保這個臨時文件複製到其他地方。 閱讀\u003ca href=\"http://commons.apache.org/io/api-1.4/org/apache/commons/io/FileUtils.html\"\u003e文件實用文檔\u003c/a\u003e複製文件。 \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.x/docs/file.html\"\u003eStruts 2 文件文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/file-upload.html\"\u003ehttp://struts.apache.org/2.0.14/docs/file-upload.html\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/how-do-we-upload-files.html\"\u003ehttp://struts.apache.org/2.0.14/docs/how-do-we-upload-files.html\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://commons.apache.org/io/api-1.4/org/apache/commons/io/FileUtils.html\"\u003ehttp://commons.apache.org/io/api-1.4/org/apache/commons/io/FileUtils.html\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cp\u003e 下載代碼 –\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1eQDH07S\"\u003ehttp://pan.baidu.com/s/1eQDH07S\u003c/a\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"57:T16b2,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 在上章節Struts2 文件上傳示例, 用戶允許選擇一個文件並上傳到服務器。在本教程中,您將學習如何允許用戶將多個文件上傳到服務器。 \u003c/p\u003e \n\u003cp\u003e \u003cspan\u003e這裏創建一個Web工程:strut2uploadfiles,來演示\u003c/span\u003e\u003cspan\u003e在多個複選框\u003c/span\u003e\u003cspan\u003e如何設置的默認值,整個項目的結構如下圖所示:\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-16.png\" alt=\"Struts2上傳多個文件例子\"\u003e \u003c/p\u003e \n\u003ch2\u003e 1. 動作類 \u003c/h2\u003e \n\u003cp\u003e 在Action類,可以使用列表或數組以存儲上傳的文件。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eFileUploadAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.io.File;\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class MultipleFileUploadAction extends ActionSupport{\r\n\r\n\tprivate List\u0026lt;File\u0026gt; fileUpload = new ArrayList\u0026lt;File\u0026gt;();\r\n\tprivate List\u0026lt;String\u0026gt; fileUploadContentType = new ArrayList\u0026lt;String\u0026gt;();\r\n\tprivate List\u0026lt;String\u0026gt; fileUploadFileName = new ArrayList\u0026lt;String\u0026gt;();\r\n\r\n\tpublic List\u0026lt;File\u0026gt; getFileUpload() {\r\n\t\treturn fileUpload;\r\n\t}\r\n\r\n\tpublic void setFileUpload(List\u0026lt;File\u0026gt; fileUpload) {\r\n\t\tthis.fileUpload = fileUpload;\r\n\t}\r\n\r\n\tpublic List\u0026lt;String\u0026gt; getFileUploadContentType() {\r\n\t\treturn fileUploadContentType;\r\n\t}\r\n\r\n\tpublic void setFileUploadContentType(List\u0026lt;String\u0026gt; fileUploadContentType) {\r\n\t\tthis.fileUploadContentType = fileUploadContentType;\r\n\t}\r\n\r\n\tpublic List\u0026lt;String\u0026gt; getFileUploadFileName() {\r\n\t\treturn fileUploadFileName;\r\n\t}\r\n\r\n\tpublic void setFileUploadFileName(List\u0026lt;String\u0026gt; fileUploadFileName) {\r\n\t\tthis.fileUploadFileName = fileUploadFileName;\r\n\t}\r\n\t\r\n\tpublic String upload() throws Exception{\r\n\t\t\r\n\t for (File file: fileUpload) {\r\n\t System.out.println(\"File :\" + file);\r\n\t }\r\n\t \r\n\t for (String fileName: fileUploadFileName) {\r\n\t System.out.println(\"Filename : \" + fileName);\r\n\t }\r\n\r\n\t for (String fileContentType: fileUploadContentType) {\r\n\t System.out.println(\"File type : \" + fileContentType);\r\n\t }\r\n\t \r\n\t return SUCCESS;\r\n\t\t\r\n\t}\r\n\r\n\tpublic String display() {\r\n\t\treturn NONE;\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. 結果頁面 \u003c/h2\u003e \n\u003cp\u003e 使用\u0026lt;s:file\u0026gt;標籤來渲染多文件上傳組件,並設置表單 enctype類型爲「multipart/form-data」. \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003efileupload.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;s:head /\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2上傳多個文件示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:form action=\"resultAction\" namespace=\"/\" \r\nmethod=\"POST\" enctype=\"multipart/form-data\"\u0026gt;\r\n\r\n\u0026lt;s:file label=\"File 1\" name=\"fileUpload\" size=\"40\" /\u0026gt;\r\n\u0026lt;s:file label=\"File 2\" name=\"fileUpload\" size=\"40\" /\u0026gt;\r\n\u0026lt;s:file label=\"FIle 2\" name=\"fileUpload\" size=\"40\" /\u0026gt;\r\n\r\n\u0026lt;s:submit value=\"submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eresult.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2上傳多個文件示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;div\u0026gt;\u0026lt;div class=\"ads-in-post hide_if_width_less_800\"\u0026gt;\r\n\u0026lt;script async src=\"//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\"\u0026gt;\u0026lt;/script\u0026gt;\r\n\u0026lt;!-- 728x90 - After2ndH4 --\u0026gt;\r\n\u0026lt;ins class=\"adsbygoogle hide_if_width_less_800\" \r\n style=\"display:inline-block;width:728px;height:90px\"\r\n data-ad-client=\"ca-pub-2836379775501347\"\r\n data-ad-slot=\"3642936086\"\r\n\t data-ad-region=\"yiibairegion\"\u0026gt;\u0026lt;/ins\u0026gt;\r\n\u0026lt;script\u0026gt;\r\n(adsbygoogle = window.adsbygoogle || []).push({});\r\n\u0026lt;/script\u0026gt;\r\n\u0026lt;/div\u0026gt;\u0026lt;/div\u0026gt;\u0026lt;h2\u0026gt;\r\n File Name : \u0026lt;s:property value=\"fileUploadFileName\"/\u0026gt; \r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;h2\u0026gt;\r\n Content Type : \u0026lt;s:property value=\"fileUploadContentType\"/\u0026gt; \r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;h2\u0026gt;\r\n File : \u0026lt;s:property value=\"fileUpload\"/\u0026gt; \r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\r\n\t\u0026lt;action name=\"multipleFileUploadAction\" \r\n\t class=\"com.yiibai.common.action.MultipleFileUploadAction\" \r\n method=\"display\"\u0026gt;\r\n\t\t\u0026lt;result name=\"none\"\u0026gt;pages/multiplefileupload.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;action name=\"resultAction\" \r\n\t class=\"com.yiibai.common.action.MultipleFileUploadAction\" \r\n method=\"upload\"\u0026gt;\r\n\t\t \u0026lt;result name=\"success\"\u0026gt;pages/result.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/struts2uploafiles/multipleFileUploadAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-17.png\" alt=\"Struts2上傳多個文件例子\"\u003e \n\u003c/div\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-18.png\" alt=\"Struts2上傳多個文件例子\"\u003e \n\u003c/div\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e Struts2文件上傳示例 \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.x/docs/file.html\"\u003eStruts2文件上傳文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/file-upload.html\"\u003ehttp://struts.apache.org/2.0.14/docs/file-upload.html\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/how-do-we-upload-files.html\"\u003ehttp://struts.apache.org/2.0.14/docs/how-do-we-upload-files.html\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e \u003cspan\u003e\u003c/span\u003e下載代碼 -\u0026nbsp; \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"58:T2393,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 在Struts2,\u0026lt;s:doubleselect\u0026gt;標籤用於創建兩個HTML下拉框,第一個下拉列表中選擇後,第二個下拉列表將根據第一個選擇發生相應的變化。一個非常典型的例子是「國家」,「國家」下拉選項,不同的「狀態」列表是根據所選擇的「國家」。 \u003c/p\u003e \n\u003cp\u003e 這裏創建一個Web工程:strut2sdoubleselect,來演示在多個複選框如何設置的默認值,整個項目的結構如下圖所示: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/doubleselect-1.png\" alt=\"Struts2 \u003cs:doubleselect\u003e示例\"\u003e \u003c/p\u003e \n\u003cp\u003e \u0026nbsp;\u0026lt;s:doubleselect\u0026gt; 標籤示例 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:doubleselect label=\"Fruits (OGNL) \" \r\nname=\"fruit1\" list=\"{'fruit','meat'}\" \r\ndoubleName=\"fruit2\" \r\ndoubleList=\"top == 'fruit' ? {'apple', 'orange','banana'} : {'chicken', 'pig'}\" /\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 產生下面的HTML代碼... \u003c/p\u003e \n\u003cpre\u003e\u0026lt;tr\u0026gt; \r\n\u0026lt;td class=\"tdLabel\"\u0026gt;\r\n \u0026lt;label for=\"resultAction_fruit1\" class=\"label\"\u0026gt;\r\n Fruits (OGNL) :\r\n \u0026lt;/label\u0026gt;\r\n\u0026lt;/td\u0026gt; \r\n\u0026lt;td\u0026gt; \r\n\u0026lt;select name=\"fruit1\" id=\"resultAction_fruit1\" \r\n onchange=\"resultAction_fruit1Redirect(this.options.selectedIndex)\"\u0026gt; \r\n \u0026lt;option value=\"fruit\"\u0026gt;fruit\u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"meat\"\u0026gt;meat\u0026lt;/option\u0026gt; \r\n\u0026lt;/select\u0026gt; \r\n\u0026lt;br /\u0026gt; \r\n\u0026lt;select name=\"fruit2\" id=\"resultAction_fruit2\"\u0026gt; \r\n\u0026lt;/select\u0026gt; \r\n\u0026lt;script type=\"text/javascript\"\u0026gt; \r\n var resultAction_fruit1Group = new Array(2 + 0);\r\n for (i = 0; i \u0026lt; (2 + 0); i++)\r\n resultAction_fruit1Group[i] = new Array();\r\n \r\n resultAction_fruit1Group[0][0] = new Option(\"apple\", \"apple\");\r\n \r\n resultAction_fruit1Group[0][1] = new Option(\"orange\", \"orange\");\r\n \r\n resultAction_fruit1Group[0][2] = new Option(\"banana\", \"banana\");\r\n \r\n resultAction_fruit1Group[1][0] = new Option(\"chicken\", \"chicken\");\r\n \r\n resultAction_fruit1Group[1][1] = new Option(\"pig\", \"pig\");\r\n \r\n \r\n var resultAction_fruit1Temp = document.resultAction.resultAction_fruit2;\r\n resultAction_fruit1Redirect(0);\r\n function resultAction_fruit1Redirect(x) {\r\n \tvar selected = false;\r\n for (m = resultAction_fruit1Temp.options.length - 1; m \u0026gt;= 0; m--) {\r\n resultAction_fruit1Temp.options[m] = null;\r\n }\r\n \r\n for (i = 0; i \u0026lt; resultAction_fruit1Group[x].length; i++) {\r\n resultAction_fruit1Temp.options[i] = \r\n\t new Option(\r\n resultAction_fruit1Group[x][i].text, resultAction_fruit1Group[x][i].value\r\n );\r\n }\r\n \r\n if ((resultAction_fruit1Temp.options.length \u0026gt; 0) \u0026amp;\u0026amp; (! selected)) {\r\n \tresultAction_fruit1Temp.options[0].selected = true;\r\n }\r\n }\r\n\u0026lt;/script\u0026gt; \r\n\u0026lt;/td\u0026gt; \r\n\u0026lt;/tr\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 好了,\u0026lt;s:doubleselect\u0026gt;標籤是真正產生大量的代碼。它會創建兩個下拉列表, 很多JavaScript代碼背後做魔術(第一選擇,第二個變化),並且還附上了「onchange()」行爲,以第一個下拉框。 \u003c/p\u003e \n\u003cdiv class=\"note\"\u003e \n \u003cstrong\u003e看起來比較複雜,但簡單!\u003c/strong\u003e \n \u003cbr\u003e 這只是兩個\u0026lt;s:select\u0026gt;標記結合在一個標籤,看得很清楚了。 \n \u003cpre\u003e\u0026lt;s:doubleselect\r\nname=\"\" list=\"\" \r\ndoubleName=\"\" doubleList=\"\" /\u0026gt;\u003c/pre\u003e \n \u003cp\u003e 「\u003cstrong\u003ename\u003c/strong\u003e」和「\u003cstrong\u003elist\u003c/strong\u003e」是指第一個下拉列表。「doubleName」和「doubleList」是指所述第二下拉列表。數據羣和「\u0026lt;s:select\u0026gt;」標籤是一樣的。\u0026nbsp; \u003c/p\u003e \n\u003c/div\u003e \n\u003ch2\u003e Struts2\u0026nbsp;\u0026lt;s:doubleselect\u0026gt;\u0026nbsp;示例 \u003c/h2\u003e \n\u003cp\u003e 在一個完整的例子,例如\u0026lt;S:doubleselect\u0026gt;標籤,表示使用OGNL或Java列出數據來填充到下拉列表中。 \u003c/p\u003e \n\u003ch2\u003e 1. Action \u003c/h2\u003e \n\u003cp\u003e Action類來生成兩個下拉列表。\u003cbr\u003e \u003cstrong\u003eDoubleSelectAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.Arrays;\r\nimport java.util.HashMap;\r\nimport java.util.Map;\r\nimport java.util.Set;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class DoubleSelectAction extends ActionSupport{\r\n\r\n\tprivate String fruit1;\r\n\tprivate String fruit2;\r\n\t\r\n\tprivate String server1;\r\n\tprivate String server2;\r\n\t\r\n\tprivate String language1;\r\n\tprivate String language2;\r\n\t\r\n\tMap languageMap;\r\n\r\n\tpublic String getFruit1() {\r\n\t\treturn fruit1;\r\n\t}\r\n\r\n\tpublic void setFruit1(String fruit1) {\r\n\t\tthis.fruit1 = fruit1;\r\n\t}\r\n\r\n\tpublic String getFruit2() {\r\n\t\treturn fruit2;\r\n\t}\r\n\r\n\tpublic void setFruit2(String fruit2) {\r\n\t\tthis.fruit2 = fruit2;\r\n\t}\r\n\r\n\tpublic String getServer1() {\r\n\t\treturn server1;\r\n\t}\r\n\r\n\tpublic void setServer1(String server1) {\r\n\t\tthis.server1 = server1;\r\n\t}\r\n\r\n\tpublic String getServer2() {\r\n\t\treturn server2;\r\n\t}\r\n\r\n\tpublic void setServer2(String server2) {\r\n\t\tthis.server2 = server2;\r\n\t}\r\n\r\n\tpublic String getLanguage1() {\r\n\t\treturn language1;\r\n\t}\r\n\r\n\tpublic void setLanguage1(String language1) {\r\n\t\tthis.language1 = language1;\r\n\t}\r\n\r\n\tpublic String getLanguage2() {\r\n\t\treturn language2;\r\n\t}\r\n\r\n\tpublic void setLanguage2(String language2) {\r\n\t\tthis.language2 = language2;\r\n\t}\r\n\r\n\tpublic Map getLanguageMap() {\r\n\t\treturn languageMap;\r\n\t}\r\n\r\n\tpublic void setLanguageMap(Map languageMap) {\r\n\t\tthis.languageMap = languageMap;\r\n\t}\r\n\r\n\tpublic DoubleSelectAction(){\r\n\t languageMap =new HashMap();\t\t\r\n\t\t\r\n languageMap.put(\"Java\", \r\n new ArrayList\u0026lt;String\u0026gt;(Arrays.asList(\"Spring\", \"Hibernate\", \"Struts 2\")));\r\n languageMap.put(\".Net\", new ArrayList\u0026lt;String\u0026gt;(Arrays.asList(\"VB.Net\", \"C#\")));\r\n languageMap.put(\"JavaScript\", new ArrayList\u0026lt;String\u0026gt;(Arrays.asList(\"jQuery\")));\r\n\t}\r\n\r\n\tpublic String execute() {\r\n\t\treturn SUCCESS;\r\n\t}\r\n\t\r\n\tpublic String display() {\r\n\t\treturn NONE;\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. 結果頁面 \u003c/h2\u003e \n\u003cp\u003e 渲染兩個下拉下拉框,通過「\u0026lt;s:doubleselect\u0026gt;」標籤,並通過Java列表,OGNL列表填充 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003edoubleselect.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2 \u0026lt;s:doubleselect\u0026gt; 示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:form action=\"resultAction\" namespace=\"/\"\u0026gt;\r\n\r\n\u0026lt;s:doubleselect label=\"Fruits (OGNL) \" \r\nname=\"fruit1\" list=\"{'fruit','meat'}\" \r\ndoubleName=\"fruit2\" \r\ndoubleList=\"top == 'fruit' ? {'apple', 'orange','banana'} : {'chicken', 'pig'}\" /\u0026gt;\r\n\r\n\u0026lt;s:set name=\"serverList\" \r\n value=\"#{\r\n 'AppServer': {'Apache', 'Tomcat', 'JBoss'},\r\n 'Database': {'Oracle', 'MySQL'}\r\n }\" /\u0026gt;\r\n\u0026lt;s:doubleselect label=\"Server (OGNL) \" \r\nname=\"server1\" list=\"#serverList.keySet()\" \r\ndoubleName=\"server2\" doubleList=\"#serverList[top]\" /\u0026gt;\r\n\r\n\u0026lt;s:doubleselect label=\"Language (Java List) \" \r\nname=\"language1\" list=\"languageMap.keySet()\" \r\ndoubleName=\"language2\" doubleList=\"languageMap.get(top)\" /\u0026gt;\r\n\r\n\u0026lt;s:submit value=\"submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eresult.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2 \u0026lt;s:doubleselect\u0026gt; 示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n Test #1 : \u0026lt;s:property value=\"fruit1\"/\u0026gt; , \u0026lt;s:property value=\"fruit2\"/\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;h2\u0026gt;\r\n Test #2 : \u0026lt;s:property value=\"server1\"/\u0026gt; , \u0026lt;s:property value=\"server2\"/\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;h2\u0026gt;\r\n Test #2 : \u0026lt;s:property value=\"language1\"/\u0026gt; , \u0026lt;s:property value=\"language2\"/\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \t\r\n\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"doubleSelectAction\" \r\n class=\"com.yiibai.common.action.DoubleSelectAction\" method=\"display\"\u0026gt;\r\n\t\u0026lt;result name=\"none\"\u0026gt;/pages/doubleselect.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"resultAction\" class=\"com.yiibai.common.action.DoubleSelectAction\"\u0026gt;\r\n\t\u0026lt;result name=\"success\"\u0026gt;/pages/result.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. 示例 \u003c/h2\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/strut2sdoubleselect/doubleSelectAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/doubleselect-2.png\" alt=\"Struts2 \u003cs:doubleselect\u003e示例\"\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/strut2sdoubleselect/resultAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/doubleselect-3.png\" alt=\"Struts2 \u003cs:doubleselect\u003e示例\"\u003e \n\u003c/div\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/doubleselect.html\"\u003eStruts 2 關聯選擇框文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e Struts 2 \u0026lt;s:select\u0026gt; 示例 \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e 代碼下載: \n\u003ca href=\"http://pan.baidu.com/s/1hqm8Zje\"\u003ehttp://pan.baidu.com/s/1hqm8Zje\u003c/a\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"59:T1c6c,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 在Struts2,\u0026lt;s:updownselect\u0026gt;標籤用於創建一個帶有按鈕的HTML選擇組件向上或向下移動在選擇組件的選項。當提交表單時,所有的選擇方案將提交在它們的排列順序。 \u003c/p\u003e \n\u003cp\u003e \u003cspan\u003e這裏創建一個Web工程:strut2\u003cspan\u003eupdownselect\u003c/span\u003e,來演示\u003c/span\u003e\u003cspan\u003e在多個複選框\u003c/span\u003e\u003cspan\u003e如何設置的默認值,整個項目的結構如下圖所示:\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/updownselect-1.png\" alt=\"Struts2 \u003cs:updownselect\u003e示例\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003e\u0026lt;s:updownselect\u0026gt; 示例\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:updownselect\r\nlist=\"#{'KFC':'KFC', 'McDonald':'McDonald', 'Burger King':'Burger King',\r\n'Pizza Hut':'Pizza Hut', 'Fat Boy King':'Fat Boy King'}\"\r\nname=\"favFastFood\"\r\nheaderKey=\"-1\"\r\nheaderValue=\"--- Please Order ---\" \r\nsize=\"7\"\r\n/\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 產生下面的HTML代碼,選擇組件,按鈕和JavaScript在選擇組件向下移動的選項。 (默認的XHTML主題) \u003c/p\u003e \n\u003cpre\u003e\u0026lt;tr\u0026gt; \r\n\u0026lt;td class=\"tdLabel\"\u0026gt;\u0026lt;/td\u0026gt; \r\n\u0026lt;td\u0026gt;\u0026lt;script type=\"text/javascript\" src=\"/Struts2Example/struts/optiontransferselect.js\"\u0026gt;\r\n\u0026lt;/script\u0026gt; \r\n\u0026lt;table\u0026gt; \r\n\u0026lt;tr\u0026gt;\u0026lt;td\u0026gt; \r\n\u0026lt;select name=\"favFastFood\" size=\"7\" \r\nid=\"resultAction_favFastFood\" multiple=\"multiple\"\u0026gt; \r\n \u0026lt;option value=\"-1\"\u0026gt;--- Please Order ---\u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"KFC\"\u0026gt;KFC\u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"McDonald\"\u0026gt;McDonald\u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"Burger King\"\u0026gt;Burger King\u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"Pizza Hut\"\u0026gt;Pizza Hut\u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"Fat Boy King\"\u0026gt;Fat Boy King\u0026lt;/option\u0026gt; \r\n\u0026lt;/select\u0026gt; \r\n\u0026lt;input type=\"hidden\" id=\"__multiselect_resultAction_favFastFood\" \r\nname=\"__multiselect_favFastFood\" value=\"\" /\u0026gt; \r\n\u0026lt;/td\u0026gt;\u0026lt;/tr\u0026gt; \r\n\u0026lt;tr\u0026gt;\u0026lt;td\u0026gt; \r\n\u0026nbsp;\u0026lt;input type=\"button\" value=\"^\" onclick=\"\r\nmoveOptionUp(document.getElementById('resultAction_favFastFood'), 'key', '-1');\" /\u0026gt;\r\n\r\n\u0026nbsp;\u0026lt;input type=\"button\" value=\"v\" onclick=\"\r\nmoveOptionDown(document.getElementById('resultAction_favFastFood'), 'key', '-1');\" /\u0026gt;\r\n\r\n\u0026nbsp;\u0026lt;input type=\"button\" value=\"*\" onclick=\"selectAllOptionsExceptSome(\r\ndocument.getElementById('resultAction_favFastFood'), 'key', '-1');\" /\u0026gt;\r\n\u0026lt;/td\u0026gt;\u0026lt;/tr\u0026gt; \r\n\u0026lt;/table\u0026gt;\u0026lt;/td\u0026gt; \r\n\u0026lt;/tr\u0026gt; \r\n\u0026lt;script type=\"text/javascript\"\u0026gt; \r\n \r\nvar containingForm = document.getElementById(\"resultAction\");\r\nStrutsUtils.addEventListener(containingForm, \"submit\", \r\n function(evt) {\r\n var updownselectObj = document.getElementById(\"resultAction_favFastFood\");\r\n selectAllOptionsExceptSome(updownselectObj, \"key\", \"-1\");\r\n }, true);\r\n\u0026lt;/script\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e Struts2 \u0026lt;s:updownselect\u0026gt; 示例 \u003c/h2\u003e \n\u003cp\u003e 在一個完整的全面\u0026lt;s:updownselect\u0026gt;標籤例子來說明如何使用OGNL和Java列出的數據填充到上下按鈕選擇列表。 \u003c/p\u003e \n\u003ch2\u003e 1. 動作類 - Action \u003c/h2\u003e \n\u003cp\u003e Action類來生成和存儲選擇選項。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eUpDownSelectAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class UpDownSelectAction extends ActionSupport{\r\n\r\n\tprivate List\u0026lt;String\u0026gt; moviesList = new ArrayList\u0026lt;String\u0026gt;();\r\n\r\n\tprivate String favMovie;\r\n\tprivate String favFastFood;\r\n\r\n\tpublic UpDownSelectAction(){\r\n\t\t\r\n\t\tmoviesList.add(\"Spider Man\");\r\n\t\tmoviesList.add(\"Matrix\");\r\n\t\tmoviesList.add(\"Super Man\");\r\n\t\tmoviesList.add(\"Dark Knight\");\r\n\t\tmoviesList.add(\"BraveHeart\");\r\n\t\tmoviesList.add(\"Ultraman\");\r\n\t\t\r\n\t}\r\n\t\r\n\tpublic String getFavFastFood() {\r\n\t\treturn favFastFood;\r\n\t}\r\n\r\n\tpublic void setFavFastFood(String favFastFood) {\r\n\t\tthis.favFastFood = favFastFood;\r\n\t}\r\n\r\n\tpublic List\u0026lt;String\u0026gt; getMoviesList() {\r\n\t\treturn moviesList;\r\n\t}\r\n\r\n\tpublic void setMoviesList(List\u0026lt;String\u0026gt; moviesList) {\r\n\t\tthis.moviesList = moviesList;\r\n\t}\r\n\r\n\tpublic String getFavMovie() {\r\n\t\treturn favMovie;\r\n\t}\r\n\r\n\tpublic void setFavMovie(String favMovie) {\r\n\t\tthis.favMovie = favMovie;\r\n\t}\r\n\r\n\tpublic String execute() throws Exception{\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t}\r\n\r\n\tpublic String display() {\r\n\t\treturn NONE;\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. 結果頁面 \u003c/h2\u003e \n\u003cp\u003e 通過「\u0026lt;s:updownselect\u0026gt;」渲染上下按鈕選擇組件標籤。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eupdownselect.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;s:head /\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 updownselect example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:form action=\"resultAction\" namespace=\"/\" method=\"POST\" \u0026gt;\r\n\r\n\u0026lt;s:updownselect\r\nlist=\"#{'KFC':'KFC', 'McDonald':'McDonald', 'Burger King':'Burger King',\r\n'Pizza Hut':'Pizza Hut', 'Fat Boy King':'Fat Boy King'}\"\r\nname=\"favFastFood\"\r\nheaderKey=\"-1\"\r\nheaderValue=\"--- Please Order ---\" \r\nsize=\"7\"\r\n/\u0026gt;\r\n\r\n\u0026lt;s:updownselect\r\nlist=\"moviesList\"\r\nname=\"favMovie\"\r\nheaderKey=\"-1\"\r\nheaderValue=\"--- Please Order ---\"\r\nsize=\"10\"\r\nmoveUpLabel=\"Move Up\"\r\nmoveDownLabel=\"Move Down\"\r\nselectAllLabel=\"Select All\" /\u0026gt;\r\n\r\n\u0026lt;s:submit value=\"submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eresult.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 updownselect example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n Favor fast food : \u0026lt;s:property value=\"favFastFood\"/\u0026gt; \r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;h2\u0026gt;\r\n Favor movies : \u0026lt;s:property value=\"favMovie\"/\u0026gt; \r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\r\n \u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"updownSelectAction\" \r\n class=\"com.yiibai.common.action.UpDownSelectAction\" method=\"display\"\u0026gt;\r\n \u0026lt;result name=\"none\"\u0026gt;pages/updownselect.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"resultAction\" class=\"com.yiibai.common.action.UpDownSelectAction\" \u0026gt;\r\n \u0026lt;result name=\"success\"\u0026gt;pages/result.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/Struts2Example/updownSelectAction.action\u003c/em\u003e\u003cbr\u003e 選擇選項,將其向上或向下。 \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/updownselect-2.png\" alt=\"Struts2 \u003cs:updownselect\u003e示例\"\u003e \n\u003c/div\u003e \n\u003cp\u003e 當提交後,所有的選項都將在它們的排列順序\u003cspan\u003e提交\u003c/span\u003e。 \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/updownselect-3.png\" alt=\"Struts2 \u003cs:updownselect\u003e示例\"\u003e \n\u003c/div\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/updownselect.html\"\u003eStruts 2 updownselect example\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e http://www.yiibai.com/struts_2/struts-2-sdoubleselect-example.html \u003c/li\u003e \n\u003c/ol\u003e \n\u003cbr\u003e 代碼下載: \n\u003ca href=\"http://pan.baidu.com/s/1hqtuAdY\"\u003ehttp://pan.baidu.com/s/1hqtuAdY\u003c/a\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"5a:T2b98,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 在Struts2中,選項選擇組件是兩個「updownselect」選擇部件在左,右側對齊,在它們中間,包含按鈕來移動自己的選擇選項。通過\u0026lt;s:optiontransferselect\u0026gt;標籤這可以創建。 \u003c/p\u003e \n\u003cp\u003e 這裏創建一個Web工程:strut2updownselect,來演示在多個複選框如何設置的默認值,整個項目的結構如下圖所示: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/optiontransferselect-1.png\" alt=\"Struts2 \u003cs:optiontransferselect\u003e示例\"\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:optiontransferselect\r\n label=\"Lucky Numbers\"\r\n name=\"leftNumber\"\r\n list=\"{'1 - One ', '2 - Two', '3 - Three', '4 - Four', '5 - Five'}\"\r\n doubleName=\"rightNumber\"\r\n doubleList=\"{'10 - Ten','20 - Twenty','30 - Thirty','40 - Forty','50 - Fifty'}\"\r\n /\u0026gt;\u003c/pre\u003e \n\u003cdiv class=\"note\"\u003e\n 「name」和「list」是指向左選擇組件;而「doubleName」和「doubleList」是指在正確的選擇組。 \n\u003c/div\u003e \n\u003cp\u003e 產生下面的HTML,兩個「updownselect」組件,按鈕和JavaScript來自己動(默認的XHTML主題)之間的選擇選項。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;tr\u0026gt; \r\n\u0026lt;td class=\"tdLabel\"\u0026gt;\r\n\u0026lt;label for=\"resultAction_leftNumber\" class=\"label\"\u0026gt;Lucky Numbers:\u0026lt;/label\u0026gt;\r\n\u0026lt;/td\u0026gt; \r\n\u0026lt;td\u0026gt;\r\n\u0026lt;script type=\"text/javascript\" src=\"/Struts2Example/struts/optiontransferselect.js\"\u0026gt;\r\n\u0026lt;/script\u0026gt; \r\n\u0026lt;table border=\"0\"\u0026gt; \r\n\u0026lt;tr\u0026gt; \r\n\u0026lt;td\u0026gt; \r\n\u0026lt;select name=\"leftNumber\" size=\"15\" \r\nid=\"resultAction_leftNumber\" multiple=\"multiple\"\u0026gt; \r\n \u0026lt;option value=\"1 - One \"\u0026gt;1 - One \u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"2 - Two\"\u0026gt;2 - Two\u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"3 - Three\"\u0026gt;3 - Three\u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"4 - Four\"\u0026gt;4 - Four\u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"5 - Five\"\u0026gt;5 - Five\u0026lt;/option\u0026gt; \r\n\u0026lt;/select\u0026gt; \r\n\u0026lt;input type=\"hidden\" id=\"__multiselect_resultAction_leftNumber\" \r\nname=\"__multiselect_leftNumber\" value=\"\" /\u0026gt; \r\n\u0026lt;input type=\"button\"\r\n\tonclick=\"moveOptionDown(\r\n document.getElementById('resultAction_leftNumber'), 'key', '');\"\r\n\tvalue=\"v\"\r\n/\u0026gt; \r\n\u0026lt;input type=\"button\"\r\n\tonclick=\"moveOptionUp(\r\n document.getElementById('resultAction_leftNumber'), 'key', '');\"\r\n\tvalue=\"^\"\r\n/\u0026gt; \r\n\u0026lt;/td\u0026gt; \r\n\u0026lt;td valign=\"middle\" align=\"center\"\u0026gt; \r\n\u0026lt;input type=\"button\"\r\n value=\"\u0026lt;-\" onclick=\"moveSelectedOptions(\r\n document.getElementById('resultAction_rightNumber'), \r\n document.getElementById('resultAction_leftNumber'), false, '');\" /\u0026gt;\r\n\u0026lt;input type=\"button\"\r\n value=\"-\u0026gt;\" onclick=\"moveSelectedOptions(\r\n document.getElementById('resultAction_leftNumber'), \r\n document.getElementById('resultAction_rightNumber'), false, '');\" /\u0026gt; \r\n\u0026lt;input type=\"button\"\r\n value=\"\u0026lt;\u0026lt;--\" onclick=\"moveAllOptions(\r\n document.getElementById('resultAction_rightNumber'), \r\n document.getElementById('resultAction_leftNumber'), false, '');\" /\u0026gt;\r\n\u0026lt;input type=\"button\"\r\n value=\"--\u0026gt;\u0026gt;\" onclick=\"moveAllOptions(\r\n document.getElementById('resultAction_leftNumber'), \r\n document.getElementById('resultAction_rightNumber'), false, '');\" /\u0026gt;\r\n\u0026lt;input type=\"button\"\r\n value=\"\u0026lt;*\u0026gt;\" onclick=\"selectAllOptions(\r\n document.getElementById('resultAction_leftNumber'));\r\n selectAllOptions(document.getElementById('resultAction_rightNumber'));\" /\u0026gt;\r\n\u0026lt;/td\u0026gt; \r\n\u0026lt;td\u0026gt; \r\n\u0026lt;select \r\n\tname=\"rightNumber\"\r\n\tsize=\"15\"\r\n\tmultiple=\"multiple\"\r\n\tid=\"resultAction_rightNumber\"\r\n\u0026gt; \r\n \t\u0026lt;option value=\"10 - Ten\"\u0026gt;10 - Ten\u0026lt;/option\u0026gt; \r\n \t\u0026lt;option value=\"20 - Twenty\"\u0026gt;20 - Twenty\u0026lt;/option\u0026gt; \r\n \t\u0026lt;option value=\"30 - Thirty\"\u0026gt;30 - Thirty\u0026lt;/option\u0026gt; \r\n \t\u0026lt;option value=\"40 - Forty\"\u0026gt;40 - Forty\u0026lt;/option\u0026gt; \r\n \t\u0026lt;option value=\"50 - Fifty\"\u0026gt;50 - Fifty\u0026lt;/option\u0026gt; \r\n\u0026lt;/select\u0026gt; \r\n\u0026lt;input type=\"hidden\" id=\"__multiselect_resultAction_rightNumber\" \r\nname=\"__multiselect_rightNumber\" value=\"\" /\u0026gt; \r\n\u0026lt;input type=\"button\"\r\n onclick=\"moveOptionDown(\r\n document.getElementById('resultAction_rightNumber'), 'key', '');\"\r\n value=\"v\"\r\n/\u0026gt; \r\n\u0026lt;input type=\"button\"\r\n onclick=\"moveOptionUp(\r\n document.getElementById('resultAction_rightNumber'), 'key', '');\"\r\n value=\"^\"\r\n/\u0026gt; \r\n\u0026lt;/td\u0026gt; \r\n\u0026lt;/tr\u0026gt; \r\n\u0026lt;/table\u0026gt; \r\n\r\n\u0026lt;script type=\"text/javascript\"\u0026gt; \r\nvar containingForm = document.getElementById(\"resultAction\");\r\nStrutsUtils.addEventListener(containingForm, \"submit\", \r\n function(evt) {\r\n\tvar selectObj = document.getElementById(\"resultAction_leftNumber\");\r\n\t\tselectAllOptionsExceptSome(selectObj, \"key\", \"\");\r\n }, true);\r\nvar containingForm = document.getElementById(\"resultAction\");\r\nStrutsUtils.addEventListener(containingForm, \"submit\", \r\n function(evt) {\r\n\tvar selectObj = document.getElementById(\"resultAction_rightNumber\");\r\n\t\tselectAllOptionsExceptSome(selectObj, \"key\", \"\");\r\n\t}, true);\r\n\u0026lt;/script\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e Struts2 \u0026lt;s:optiontransferselect\u0026gt; 示例 \u003c/h2\u003e \n\u003cp\u003e 一個完整的全面的 \u0026lt;s:optiontransferselect\u0026gt; 標籤例子,表明使用OGNL和Java列出來填充數據到「選項中選擇轉移」的組件。 \u003c/p\u003e \n\u003ch2\u003e 1. 動作類 \u003c/h2\u003e \n\u003cp\u003e Action類來生成並存儲左右選擇選項。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eOptionTransferSelectAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class OptionTransferSelectAction extends ActionSupport{\r\n\r\n\tprivate List\u0026lt;String\u0026gt; leftAntivirusList = new ArrayList\u0026lt;String\u0026gt;();\r\n\tprivate List\u0026lt;String\u0026gt; rightAntivirusList = new ArrayList\u0026lt;String\u0026gt;();\r\n\r\n\tprivate String leftAntivirus;\r\n\tprivate String rightAntivirus;\r\n\r\n\tprivate String leftNumber;\r\n\tprivate String rightNumber;\r\n\t\r\n\tpublic OptionTransferSelectAction(){\r\n\t\t\r\n\t\tleftAntivirusList.add(\"Norton 360 Version 4.0\");\r\n\t\tleftAntivirusList.add(\"McAfee Total Protection 2010\");\r\n\t\tleftAntivirusList.add(\"Trend Micro IS Pro 2010\");\r\n\t\tleftAntivirusList.add(\"BitDefender Total Security 2010\");\r\n\r\n\t\trightAntivirusList.add(\"Norton Internet Security 2010\");\r\n\t\trightAntivirusList.add(\"Kaspersky Internet Security 2010\");\r\n\t\trightAntivirusList.add(\"McAfee Internet Security 2010\");\r\n\t\trightAntivirusList.add(\"AVG Internet Security 2010\");\r\n\t\trightAntivirusList.add(\"Trend Micro Internet Security 2010\");\r\n\t\trightAntivirusList.add(\"F-Secure Internet Security 2010\");\r\n\t\t\r\n\t}\r\n\t\r\n\tpublic String getLeftNumber() {\r\n\t\treturn leftNumber;\r\n\t}\r\n\r\n\tpublic void setLeftNumber(String leftNumber) {\r\n\t\tthis.leftNumber = leftNumber;\r\n\t}\r\n\r\n\tpublic String getRightNumber() {\r\n\t\treturn rightNumber;\r\n\t}\r\n\r\n\tpublic void setRightNumber(String rightNumber) {\r\n\t\tthis.rightNumber = rightNumber;\r\n\t}\r\n\r\n\tpublic List\u0026lt;String\u0026gt; getLeftAntivirusList() {\r\n\t\treturn leftAntivirusList;\r\n\t}\r\n\r\n\tpublic void setLeftAntivirusList(List\u0026lt;String\u0026gt; leftAntivirusList) {\r\n\t\tthis.leftAntivirusList = leftAntivirusList;\r\n\t}\r\n\r\n\tpublic List\u0026lt;String\u0026gt; getRightAntivirusList() {\r\n\t\treturn rightAntivirusList;\r\n\t}\r\n\r\n\tpublic void setRightAntivirusList(List\u0026lt;String\u0026gt; rightAntivirusList) {\r\n\t\tthis.rightAntivirusList = rightAntivirusList;\r\n\t}\r\n\r\n\tpublic String getLeftAntivirus() {\r\n\t\treturn leftAntivirus;\r\n\t}\r\n\r\n\tpublic void setLeftAntivirus(String leftAntivirus) {\r\n\t\tthis.leftAntivirus = leftAntivirus;\r\n\t}\r\n\r\n\tpublic String getRightAntivirus() {\r\n\t\treturn rightAntivirus;\r\n\t}\r\n\r\n\tpublic void setRightAntivirus(String rightAntivirus) {\r\n\t\tthis.rightAntivirus = rightAntivirus;\r\n\t}\r\n\r\n\tpublic String execute() throws Exception{\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t}\r\n\r\n\tpublic String display() {\r\n\t\treturn NONE;\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. 結果頁面 \u003c/h2\u003e \n\u003cp\u003e 通過「\u0026lt;s:optiontransferselect\u0026gt;」選項轉移選擇組件標籤渲染,並通過Java和OGNL列表產生左側和右側選擇選項。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eoptiontransferselect.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;s:head /\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 optiontransferselect 示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:form action=\"resultAction\" namespace=\"/\" method=\"POST\" \u0026gt;\r\n\r\n\u0026lt;s:optiontransferselect\r\n label=\"Lucky Numbers\"\r\n name=\"leftNumber\"\r\n list=\"{'1 - One ', '2 - Two', '3 - Three', '4 - Four', '5 - Five'}\"\r\n doubleName=\"rightNumber\"\r\n doubleList=\"{'10 - Ten','20 - Twenty','30 - Thirty','40 - Forty','50 - Fifty'}\"\r\n /\u0026gt;\r\n\t\r\n\u0026lt;s:optiontransferselect\r\n label=\"Favourite Antivirus\"\r\n name=\"leftAntivirus\"\r\n leftTitle=\"Left Antivirus Title\"\r\n rightTitle=\"Right Antivirus Title\"\r\n list=\"leftAntivirusList\"\r\n multiple=\"true\"\r\n headerKey=\"-1\"\r\n headerValue=\"--- Please Select ---\"\r\n doubleList=\"rightAntivirusList\"\r\n doubleName=\"rightAntivirus\"\r\n doubleHeaderKey=\"-1\"\r\n doubleHeaderValue=\"--- Please Select ---\"\r\n /\u0026gt;\r\n \r\n\u0026lt;s:submit value=\"submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eresult.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 optiontransferselect example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n Left AntiVirus : \u0026lt;s:property value=\"leftAntivirus\"/\u0026gt; \r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;h2\u0026gt;\r\n Right AntiVirus : \u0026lt;s:property value=\"rightAntivirus\"/\u0026gt; \r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;h2\u0026gt;\r\n Left Numbers : \u0026lt;s:property value=\"leftNumber\"/\u0026gt; \r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;h2\u0026gt;\r\n Right Numbers : \u0026lt;s:property value=\"rightNumber\"/\u0026gt; \r\n\u0026lt;/h2\u0026gt; \r\n\t\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\r\n\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"optionTransferSelectAction\" \r\n\tclass=\"com.yiibai.common.action.OptionTransferSelectAction\" \r\n method=\"display\"\u0026gt;\r\n\t\u0026lt;result name=\"none\"\u0026gt;/pages/optiontransferselect.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"resultAction\" \r\n class=\"com.yiibai.common.action.OptionTransferSelectAction\" \u0026gt;\r\n\t\u0026lt;result name=\"success\"\u0026gt;/pages/result.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 實例 \u003c/h2\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/struts2optiontransferselect/optionTransferSelectAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/optiontransferselect-2.png\" alt=\"Struts2 \u003cs:optiontransferselect\u003e示例\"\u003e \n\u003c/div\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/optiontransferselect-3.png\" alt=\"Struts2 \u003cs:optiontransferselect\u003e示例\"\u003e \n\u003c/div\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/updownselect.html\"\u003eStruts 2 updownselect 文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e Struts 2 updownselect 示例 \u003c/li\u003e \n \u003cli\u003e Struts 2 doubleselect 示例 \u003c/li\u003e \n\u003c/ol\u003e \n\u003cbr\u003e 代碼下載: \n\u003ca href=\"http://pan.baidu.com/s/1qW5p8lu\"\u003ehttp://pan.baidu.com/s/1qW5p8lu\u003c/a\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"5b:T1cbd,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 在Struts2,dojo ajax標籤「\u0026lt;sx:datetimepicker\u0026gt;」將呈現一個文本框和追加後面的日曆圖標,點擊日曆圖標會提示的日期時間選擇器組件。 \u003c/p\u003e \n\u003cp\u003e \u003cspan\u003e這裏創建一個Web工程:strut2\u003cspan\u003edatetimepicker\u003c/span\u003e,來演示\u003c/span\u003e\u003cspan\u003e在多個複選框\u003c/span\u003e\u003cspan\u003e如何設置的默認值,整個項目的結構如下圖所示:\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/datetimepicker-1.png\" alt=\"Struts2 \u003csx:datetimepicker\u003e示例\"\u003e \u003c/p\u003e \n\u003cp\u003e 要創建一個日期時間接組成部分,確保:\u003cbr\u003e 1. 下載 struts2-dojo-plugin.jar 庫(myeclipse中在增加struts2時,打上這個選項就可以了)\u003cbr\u003e 2. 包括「struts-dojo-tags」標籤,並輸出它的頭。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"sx\" uri=\"/struts-dojo-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;sx:head /\u0026gt;\r\n\u0026lt;/head\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 例如: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"sx\" uri=\"/struts-dojo-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;sx:head /\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;sx:datetimepicker name=\"date2\" label=\"Format (dd-MMM-yyyy)\" \r\ndisplayFormat=\"dd-MMM-yyyy\" value=\"%{'2010-01-01'}\"/\u0026gt;\r\n...\u003c/pre\u003e \n\u003cp\u003e 產生下面的HTML,一些Dojo和JavaScript庫創建日期和時間接組件。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;html\u0026gt; \r\n\u0026lt;head\u0026gt; \r\n\u0026lt;script language=\"JavaScript\" type=\"text/javascript\"\u0026gt; \r\n // Dojo configuration\r\n djConfig = {\r\n isDebug: false,\r\n bindEncoding: \"UTF-8\"\r\n ,baseRelativePath: \"/Struts2Example/struts/dojo/\"\r\n ,baseScriptUri: \"/Struts2Example/struts/dojo/\"\r\n ,parseWidgets : false\r\n };\r\n\u0026lt;/script\u0026gt; \r\n\u0026lt;script language=\"JavaScript\" type=\"text/javascript\"\r\n src=\"/Struts2Example/struts/dojo/struts_dojo.js\"\u0026gt;\u0026lt;/script\u0026gt; \r\n\r\n\u0026lt;script language=\"JavaScript\" type=\"text/javascript\"\r\n src=\"/Struts2Example/struts/ajax/dojoRequire.js\"\u0026gt;\u0026lt;/script\u0026gt; \r\n\r\n\u0026lt;link rel=\"stylesheet\" href=\"/Struts2Example/struts/xhtml/styles.css\" type=\"text/css\"/\u0026gt; \r\n\r\n\u0026lt;script language=\"JavaScript\" src=\"/Struts2Example/struts/utils.js\" \r\ntype=\"text/javascript\"\u0026gt;\u0026lt;/script\u0026gt; \r\n\r\n\u0026lt;script language=\"JavaScript\" src=\"/Struts2Example/struts/xhtml/validation.js\" \r\ntype=\"text/javascript\"\u0026gt;\u0026lt;/script\u0026gt; \r\n\r\n\u0026lt;script language=\"JavaScript\" src=\"/Struts2Example/struts/css_xhtml/validation.js\" \r\ntype=\"text/javascript\"\u0026gt;\u0026lt;/script\u0026gt; \r\n\u0026lt;/head\u0026gt; \r\n...\r\n\u0026lt;td class=\"tdLabel\"\u0026gt;\r\n\u0026lt;label for=\"widget_1291193434\" class=\"label\"\u0026gt;Format (dd-MMM-yyyy):\r\n\u0026lt;/label\u0026gt;\u0026lt;/td\u0026gt; \r\n\u0026lt;td\u0026gt;\r\n\u0026lt;div dojoType=\"struts:StrutsDatePicker\" id=\"widget_1291193434\" \r\nvalue=\"2010-01-01\" name=\"date2\" inputName=\"dojo.date2\" \r\ndisplayFormat=\"dd-MMM-yyyy\" saveFormat=\"rfc\"\u0026gt;\u0026lt;/div\u0026gt; \r\n\u0026lt;/td\u0026gt; \r\n\u0026lt;/tr\u0026gt; \r\n\u0026lt;script language=\"JavaScript\" type=\"text/javascript\"\u0026gt;\r\ndjConfig.searchIds.push(\"widget_1291193434\");\u0026lt;/script\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e Struts2 \u0026lt;s:datetimepicker\u0026gt; 示例 \u003c/h2\u003e \n\u003cp\u003e 在一個完整的全面\u0026lt;s:datetimepicker\u0026gt;標籤例子來生成一個DateTimePicker控件,並展示了使用OGNL和Java屬性的默認日期設置爲「DateTimePicker」組件。 \u003c/p\u003e \n\u003ch2\u003e 2. 動作類 \u003c/h2\u003e \n\u003cp\u003e Action類存儲選擇的日期。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eDateTimePickerAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.util.Date;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class DateTimePickerAction extends ActionSupport{\r\n\r\n\tprivate Date date1;\r\n\tprivate Date date2;\r\n\tprivate Date date3;\r\n\t\r\n\t//return today date\r\n\tpublic Date getTodayDate(){\r\n\t\t\r\n\t\treturn new Date();\r\n\t}\r\n\r\n\t//getter and setter methods\r\n\tpublic String execute() throws Exception{\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t}\r\n\r\n\tpublic String display() {\r\n\t\treturn NONE;\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 3. 結果頁面 \u003c/h2\u003e \n\u003cp\u003e 通過「\u0026lt;s:datetimepicker\u0026gt;」日期時間選擇器組件標籤渲染,通過Java屬性和OGNL設置默認日期。 \u003c/p\u003e \n\u003cdiv class=\"note\"\u003e\n 確保把「struts-dojo-tags」標籤,並渲染到\u0026lt;sx:head /\u0026gt; \n \u003cpre\u003e\u0026lt;%@ taglib prefix=\"sx\" uri=\"/struts-dojo-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;sx:head /\u0026gt;\r\n\u0026lt;/head\u0026gt;\u003c/pre\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003edatetimepicker.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"sx\" uri=\"/struts-dojo-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;sx:head /\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 datetimepicker example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:form action=\"resultAction\" namespace=\"/\" method=\"POST\" \u0026gt;\r\n\r\n\u0026lt;sx:datetimepicker name=\"date1\" label=\"Format (dd-MMM-yyyy)\" \r\ndisplayFormat=\"dd-MMM-yyyy\" value=\"todayDate\" /\u0026gt;\r\n\r\n\u0026lt;sx:datetimepicker name=\"date2\" label=\"Format (dd-MMM-yyyy)\" \r\ndisplayFormat=\"dd-MMM-yyyy\" value=\"%{'2010-01-01'}\"/\u0026gt;\r\n\r\n\u0026lt;sx:datetimepicker name=\"date3\" label=\"Format (dd-MMM-yyyy)\" \r\ndisplayFormat=\"dd-MMM-yyyy\" value=\"%{'today'}\"/\u0026gt;\r\n\r\n\u0026lt;s:submit value=\"submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eresult.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 datetimepicker example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n Date1 : \u0026lt;s:property value=\"date1\"/\u0026gt; \r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;h2\u0026gt;\r\n Date 2 : \u0026lt;s:property value=\"date2\"/\u0026gt; \r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;h2\u0026gt;\r\n Date 3 : \u0026lt;s:property value=\"date3\"/\u0026gt; \r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\r\n\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"dateTimePickerAction\" \r\n\tclass=\"com.yiibai.common.action.DateTimePickerAction\" \r\n method=\"display\"\u0026gt;\r\n\t\u0026lt;result name=\"none\"\u0026gt;/pages/datetimepicker.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"resultAction\" \r\n class=\"com.yiibai.common.action.DateTimePickerAction\" \u0026gt;\r\n\t\u0026lt;result name=\"success\"\u0026gt;/pages/result.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/strut2datetimepicker/dateTimePickerAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/datetimepicker-2.png\" alt=\"Struts2 \u003csx:datetimepicker\u003e示例\"\u003e \n\u003c/div\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/datetimepicker-3.png\" alt=\"Struts2 \u003csx:datetimepicker\u003e示例\"\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cspan\u003e注意:如果靜態文件未找到,或是不能打日期選擇,請下載代碼並參考其中的web.xml配置。\u003c/span\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/datetimepicker.html\"\u003eStruts 2 datetimepicker文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/ajax-and-javascript-recipes.html\"\u003eStruts 2 ajax and javascript recipes\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://www.unicode.org/reports/tr35/tr35-4.html#Date_Format_Patterns\"\u003eDate Format Pattern\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cbr\u003e 代碼下載: \n\u003ca href=\"http://pan.baidu.com/s/1c0ym4nu\"\u003ehttp://pan.baidu.com/s/1c0ym4nu\u003c/a\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"5c:T2067,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 在Struts2,\u0026lt;sx:autocompleter\u0026gt;標記是一個組合框,當在用戶輸入文本框會自動提示下拉的提示菜單。 \u003c/p\u003e \n\u003cp\u003e \u003cspan\u003e這裏創建一個Web工程:strut2\u003cspan\u003eautocompleter\u003c/span\u003e,來演示\u003c/span\u003e\u003cspan\u003e在多個複選框\u003c/span\u003e\u003cspan\u003e如何設置的默認值,整個項目的結構如下圖所示:\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/autocompleter-1.png\" alt=\"Struts2 \u003csx:autocompleter\u003e自動提示例子\"\u003e \u003c/p\u003e \n\u003cdiv class=\"note\"\u003e\n 這個功能是通過Dojo庫實現的,所以,一定要包含「struts2-dojo-plugin.jar」這個依賴庫,把「struts-dojo-tags」標籤上的頁面,並通過 \u0026lt;sx:head /\u0026gt;輸出其標題信息前。 \n\u003c/div\u003e \n\u003cp\u003e 例如, \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"sx\" uri=\"/struts-dojo-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;sx:head /\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;sx:autocompleter label=\"What's your lucky number?\" \r\nname=\"yourLuckyNumber\" autoComplete=\"false\"\r\nlist=\"{'1','12','13','14'}\" /\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 產生下面的HTML \u003c/p\u003e \n\u003cpre\u003e\u0026lt;html\u0026gt; \r\n\u0026lt;head\u0026gt; \r\n\u0026lt;script language=\"JavaScript\" type=\"text/javascript\"\u0026gt; \r\n // Dojo configuration\r\n djConfig = {\r\n isDebug: false,\r\n bindEncoding: \"UTF-8\"\r\n ,baseRelativePath: \"/Struts2Example/struts/dojo/\"\r\n ,baseScriptUri: \"/Struts2Example/struts/dojo/\"\r\n ,parseWidgets : false\r\n \r\n };\r\n\u0026lt;/script\u0026gt; \r\n\u0026lt;script language=\"JavaScript\" type=\"text/javascript\"\r\n src=\"/Struts2Example/struts/dojo/struts_dojo.js\"\u0026gt;\u0026lt;/script\u0026gt; \r\n\t\t\r\n\u0026lt;script language=\"JavaScript\" type=\"text/javascript\"\r\n src=\"/Struts2Example/struts/ajax/dojoRequire.js\"\u0026gt;\u0026lt;/script\u0026gt; \r\n\t\t\r\n\u0026lt;link rel=\"stylesheet\" href=\"/Struts2Example/struts/xhtml/styles.css\" \r\ntype=\"text/css\"/\u0026gt; \r\n\r\n\u0026lt;script language=\"JavaScript\" src=\"/Struts2Example/struts/utils.js\" \r\ntype=\"text/javascript\"\u0026gt;\u0026lt;/script\u0026gt; \r\n\r\n\u0026lt;script language=\"JavaScript\" src=\"/Struts2Example/struts/xhtml/validation.js\" \r\ntype=\"text/javascript\"\u0026gt;\u0026lt;/script\u0026gt; \r\n\r\n\u0026lt;script language=\"JavaScript\" src=\"/Struts2Example/struts/css_xhtml/validation.js\" \r\ntype=\"text/javascript\"\u0026gt;\u0026lt;/script\u0026gt; \r\n\u0026lt;/head\u0026gt; \r\n...\r\n\u0026lt;tr\u0026gt;\r\n\u0026lt;td class=\"tdLabel\"\u0026gt;\r\n\u0026lt;label for=\"resultAction_yourLuckyNumber\" class=\"label\"\u0026gt;\r\nWhat's your lucky number?:\u0026lt;/label\u0026gt;\u0026lt;/td\u0026gt;\r\n\u0026lt;td\u0026gt; \r\n\u0026lt;select dojoType=\"struts:ComboBox\" id=\"resultAction_yourLuckyNumber\" \r\nautoComplete=\"false\" name=\"yourLuckyNumber\" \r\nkeyName=\"yourLuckyNumberKey\" visibleDownArrow=\"true\" \u0026gt;\r\n \u0026lt;option value=\"1\"\u0026gt;1\u0026lt;/option\u0026gt;\r\n \u0026lt;option value=\"12\"\u0026gt;12\u0026lt;/option\u0026gt;\r\n \u0026lt;option value=\"13\"\u0026gt;13\u0026lt;/option\u0026gt;\r\n \u0026lt;option value=\"14\"\u0026gt;14\u0026lt;/option\u0026gt;\r\n\u0026lt;/select\u0026gt;\r\n\u0026lt;/td\u0026gt;\r\n\u0026lt;/tr\u0026gt;\r\n\u0026lt;script language=\"JavaScript\" type=\"text/javascript\"\u0026gt;\r\ndjConfig.searchIds.push(\"resultAction_yourLuckyNumber\");\u0026lt;/script\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e Struts2 \u0026lt;s:autocompleter\u0026gt; 示例 \u003c/h2\u003e \n\u003cp\u003e 在一個\u0026lt;s:autocompleter\u0026gt;標籤的完整的例子,產生下拉的提示菜單,同時在相應的文本框的用戶輸入。 \u003c/p\u003e \n\u003ch2\u003e 2. 動作類 \u003c/h2\u003e \n\u003cp\u003e Action類生成的Web框架的選項列表的「autocompleter」組成部分。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eAutoCompleterAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class AutoCompleterAction extends ActionSupport{\r\n\r\n\tprivate List\u0026lt;String\u0026gt; webframeworks = new ArrayList\u0026lt;String\u0026gt;();\r\n\t\r\n\tprivate String yourFavWebFramework;\r\n\tprivate String yourLuckyNumber;\r\n\t\r\n\tpublic AutoCompleterAction(){\r\n\t\twebframeworks.add(\"Spring MVC\");\r\n\t\twebframeworks.add(\"Struts 1.x\");\r\n\t\twebframeworks.add(\"Struts 2.x\");\r\n\t\twebframeworks.add(\"JavaServer Faces (JSF)\");\r\n\t\twebframeworks.add(\"Google Web Toolkit (GWT)\");\r\n\t\twebframeworks.add(\"Apache Wicket\");\r\n\t\twebframeworks.add(\"Apache Click\");\r\n\t\twebframeworks.add(\"Apache Cocoon\");\r\n\t\twebframeworks.add(\"JBoss Seam\");\r\n\t\twebframeworks.add(\"Stripes\");\r\n\t\twebframeworks.add(\"Apache Tapestry\");\r\n\t\twebframeworks.add(\"Others\");\r\n\t}\r\n\t\r\n\tpublic String getYourLuckyNumber() {\r\n\t\treturn yourLuckyNumber;\r\n\t}\r\n\r\n\tpublic void setYourLuckyNumber(String yourLuckyNumber) {\r\n\t\tthis.yourLuckyNumber = yourLuckyNumber;\r\n\t}\r\n\r\n\tpublic String getYourFavWebFramework() {\r\n\t\treturn yourFavWebFramework;\r\n\t}\r\n\r\n\tpublic void setYourFavWebFramework(String yourFavWebFramework) {\r\n\t\tthis.yourFavWebFramework = yourFavWebFramework;\r\n\t}\r\n\r\n\tpublic List\u0026lt;String\u0026gt; getWebframeworks() {\r\n\t\treturn webframeworks;\r\n\t}\r\n\r\n\tpublic void setWebframeworks(List\u0026lt;String\u0026gt; webframeworks) {\r\n\t\tthis.webframeworks = webframeworks;\r\n\t}\r\n\r\n\tpublic String display() {\r\n\t\treturn NONE;\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 3. 結果頁面 \u003c/h2\u003e \n\u003cp\u003e 通過「\u0026lt;s:autocompleter\u0026gt;」渲染「autocompleter」組件標籤,併產生通過Java列表和OGNL自動下拉提示菜單。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eautocompleter.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"sx\" uri=\"/struts-dojo-tags\" %\u0026gt;\r\n\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;sx:head /\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 autocompleter example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:form action=\"resultAction\" namespace=\"/\" method=\"POST\" \u0026gt;\r\n\r\n\u0026lt;sx:autocompleter label=\"What's your lucky number?\" \r\nname=\"yourLuckyNumber\" autoComplete=\"false\"\r\nlist=\"{'1','12','13','14','21','22','23','24',\r\n'31','32','33','34','41','42','43','44'}\" /\u0026gt;\r\n\r\n\u0026lt;sx:autocompleter label=\"What's your favorite web framework?\" \r\nlist=\"webframeworks\" name=\"yourFavWebFramework\" /\u0026gt;\r\n\r\n\u0026lt;s:submit value=\"submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eresult.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 autocompleter example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n Lucky Number : \u0026lt;s:property value=\"yourLuckyNumber\"/\u0026gt; \r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;h2\u0026gt;\r\n Web Appication Frameworks : \u0026lt;s:property value=\"yourFavWebFramework\"/\u0026gt; \r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\r\n\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"autoCompleterAction\" \r\n\tclass=\"com.yiibai.common.action.AutoCompleterAction\" \r\n method=\"display\"\u0026gt;\r\n\t\u0026lt;result name=\"none\"\u0026gt;/pages/autocompleter.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"resultAction\" \r\n class=\"com.yiibai.common.action.AutoCompleterAction\" \u0026gt;\r\n\t\u0026lt;result name=\"success\"\u0026gt;/pages/result.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cspan\u003e注意:如果靜態文件未找到,或是不能打日期選擇,請下載代碼並參考其中的web.xml配置。\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cspan\u003e \u003c/span\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-xml\"\u003e \u0026lt;filter-mapping\u0026gt; \r\n \u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt; \r\n \u0026lt;url-pattern\u0026gt;/struts/*\u0026lt;/url-pattern\u0026gt; \r\n \u0026lt;/filter-mapping\u0026gt; \u003c/pre\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/Struts2Example/autoCompleterAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/autocompleter-2.png\" alt=\"Struts2 \u003csx:autocompleter\u003e自動提示例子\"\u003e \n\u003c/div\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/autocompleter-3.png\" alt=\"Struts2 \u003csx:autocompleter\u003e自動提示例子\"\u003e \n\u003c/div\u003e \n\u003cdiv class=\"note\"\u003e\n 下面是另一個例子,說明使用JSON數據,提供選擇選項列表中的autocompleter組件 –\u0026nbsp;Struts2 autocompleter + JSON 示例 \n\u003c/div\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/autocompleter.html\"\u003eStruts 2 autocompleter文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/ajax-and-javascript-recipes.html\"\u003eStruts 2 ajax and javascript recipes\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e Struts2 combobox示例 \u003c/li\u003e \n\u003c/ol\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"5d:T16b5,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 在上一章\u0026nbsp;Struts2 autocompleter 例子,已經瞭解如何通過Java列表,ONGL表達生成 autocompleter 選擇選項組件列表。另外,也有可能產生通過JSON數據選擇的選擇也是如此。 \u003c/p\u003e \n\u003cp\u003e \u003cspan\u003e這裏創建一個Web工程:strut2\u003cspan\u003eautocompleterjson\u003c/span\u003e,來演示\u003c/span\u003e\u003cspan\u003e在多個複選框\u003c/span\u003e\u003cspan\u003e如何設置的默認值,整個項目的結構如下圖所示:\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-autocompleter+json-1.png\" alt=\"Struts2 autocompleter+JSON例子\"\u003e \u003c/p\u003e 在開始之前,請確保您瞭解autocompleter組件和JSON插件的基本用法。閱讀下面的文章。 \n\u003col\u003e \n \u003cli\u003e Struts2 AutoCompleter示例 \u003c/li\u003e \n \u003cli\u003e Struts2 JSON示例 \u003c/li\u003e \n\u003c/ol\u003e \n\u003ch2\u003e Struts2 autocompleter + JSON 示例 \u003c/h2\u003e \n\u003cp\u003e 在本教程中,將使用Struts2的JSON插件將對象轉換成JSON格式,並把它傳遞給autocompleter組件。 \u003c/p\u003e \n\u003ch2\u003e 1. 動作 \u003c/h2\u003e \n\u003cp\u003e 一個類用來轉換成JSON格式,提供autocompleter組件列表的\u003cspan\u003e選擇選項\u003c/span\u003e。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eDatabaseJSON.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.util.HashMap;\r\nimport java.util.Map;\r\n\r\nimport com.opensymphony.xwork2.Action;\r\n\r\npublic class DatabaseJSON{\r\n\t\r\n\tprivate Map\u0026lt;String, String\u0026gt; databases = new HashMap\u0026lt;String, String\u0026gt;();\r\n\t\r\n\tpublic DatabaseJSON(){\r\n\t\tdatabases.put(\"MySQL\", \"MySQL\");\r\n\t\tdatabases.put(\"Oracle\", \"Oracle\");\r\n\t\tdatabases.put(\"PostgreSQL\", \"PostgreSQL\");\r\n\t\tdatabases.put(\"Microsoft SQL Server\", \"Microsoft SQL Server\");\r\n\t\tdatabases.put(\"DB2\", \"DB2\");\r\n\t\tdatabases.put(\"Others\", \"Others\");\r\n\t}\r\n\r\n\tpublic String execute() {\r\n return Action.SUCCESS;\r\n\t}\r\n\t\r\n\tpublic Map\u0026lt;String, String\u0026gt; getDatabases() {\r\n\t\treturn databases;\r\n\t}\r\n\r\n\tpublic void setDatabases(Map\u0026lt;String, String\u0026gt; databases) {\r\n\t\tthis.databases = databases;\r\n\t}\r\n}\u003c/pre\u003e \n\u003cp\u003e 一個正常的Action類,只是在做重定向工作和存儲autocompleter值。\u003cbr\u003e \u003cstrong\u003eAutoCompleterAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n \r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class AutoCompleterAction extends ActionSupport{\r\n \r\n\tprivate String yourDatabase;\r\n\t\r\n\tpublic String display() {\r\n\t\treturn NONE;\r\n\t}\r\n\r\n\tpublic String getYourDatabase() {\r\n\t\treturn yourDatabase;\r\n\t}\r\n\r\n\tpublic void setYourDatabase(String yourDatabase) {\r\n\t\tthis.yourDatabase = yourDatabase;\r\n\t}\r\n\r\n}\u003c/pre\u003e \n\u003ch2\u003e 3. 結果 \u003c/h2\u003e \n\u003cp\u003e 有點棘手在這裏,用「s:url」標籤指向一個「databaseJSON」的動作,這將返回JSON格式的選項的列表。並經由href=」%{databaseList}」鏈接到autocompleter組件。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"sx\" uri=\"/struts-dojo-tags\" %\u0026gt;\r\n \r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;sx:head /\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 autocompleter + JSON example\u0026lt;/h1\u0026gt;\r\n \r\n\u0026lt;s:form action=\"resultAction\" namespace=\"/\" method=\"POST\" \u0026gt;\r\n\r\n\u0026lt;s:url id=\"databaseList\" action=\"databaseJSON\" /\u0026gt;\r\n\r\n\u0026lt;sx:autocompleter label=\"What's your favorite Database Server?\" \r\nhref=\"%{databaseList}\" name=\"yourFavDatabase\" /\u0026gt;\r\n \r\n\u0026lt;s:submit value=\"submit\" name=\"submit\" /\u0026gt;\r\n \r\n\u0026lt;/s:form\u0026gt;\r\n \r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. struts.xml \u003c/h2\u003e \n\u003cp\u003e 配置操作和JSON提供如下: \u003c/p\u003e \n\u003cdiv class=\"note\"\u003e \n \u003cstrong\u003e\u0026lt;param name=」root」\u0026gt;databases\u0026lt;/param\u0026gt;\u003c/strong\u003e \n \u003cbr\u003e 這意味着,轉換DatabaseJSON的數據庫屬性成JSON格式,而是整個對象。 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\r\n\t\u0026lt;package name=\"json\" namespace=\"/\" extends=\"json-default\"\u0026gt;\r\n \t \u0026lt;action name=\"databaseJSON\" \r\n \t\tclass=\"com.yiibai.common.action.DatabaseJSON\"\u0026gt;\r\n \t \t\u0026lt;result type=\"json\" \u0026gt;\r\n \t \t\t\u0026lt;param name=\"root\"\u0026gt;databases\u0026lt;/param\u0026gt;\r\n \t \t\u0026lt;/result\u0026gt;\r\n \t \u0026lt;/action\u0026gt;\r\n \t\u0026lt;/package\u0026gt;\r\n\t\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t \u0026lt;action name=\"autoCompleterAction\" \r\n\t\tclass=\"com.yiibai.common.action.AutoCompleterAction\" \r\n\t method=\"display\"\u0026gt;\r\n\t\t\u0026lt;result name=\"none\"\u0026gt;/pages/autocompleter-json.jsp\u0026lt;/result\u0026gt;\r\n\t \u0026lt;/action\u0026gt;\r\n\t\t \r\n\t \u0026lt;action name=\"resultAction\" \r\n\t class=\"com.yiibai.common.action.AutoCompleterAction\" \u0026gt;\r\n\t\t\u0026lt;result name=\"success\"\u0026gt;/pages/result.jsp\u0026lt;/result\u0026gt;\r\n\t \u0026lt;/action\u0026gt;\r\n\t\u0026lt;/package\u0026gt;\r\n\t\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 例子 \u003c/h2\u003e \n\u003cp\u003e 訪問URL的動作,現在 autocompleter 選擇選項是由JSON數據提供。 \u003c/p\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/strut2autocompleterjson/autoCompleterAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-autocompleter+json-2.png\" alt=\"Struts2 autocompleter+JSON例子\"\u003e \n\u003c/div\u003e \n\u003cp\u003e 或者,可以通過以下網址直接訪問JSON數據\u003cbr\u003e \u003cem\u003ehttp://localhost:8080/strut2autocompleterjson/databaseJSON.action\u003c/em\u003e \u003c/p\u003e \n\u003cpre\u003e{\r\n \"PostgreSQL\":\"PostgreSQL\",\r\n \"MySQL\":\"MySQL\",\r\n \"Others\":\"Others\",\r\n \"Oracle\":\"Oracle\",\r\n \"Microsoft SQL Server\":\"Microsoft SQL Server\",\r\n \"DB2\":\"DB2\"\r\n}\u003c/pre\u003e \n\u003ch2\u003e 參數 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8.1/docs/json-plugin.html\"\u003eStruts 2 JSON 插件\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://www.json.org/\"\u003eJSON 官方文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e Struts 2 autocompleter示例 \u003c/li\u003e \n \u003cli\u003e Struts 2 JSON 示例 \u003c/li\u003e \n\u003c/ol\u003e \n\u003cbr\u003e 代碼下載: \n\u003ca href=\"http://pan.baidu.com/s/1i3o8QzF\"\u003ehttp://pan.baidu.com/s/1i3o8QzF\u003c/a\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"5e:T1270,"])</script><script>self.__next_f.push([1,"\u003cp\u003e Struts2迭代器標籤用來迭代一個值,它可以是任何\u0026nbsp;java.util.Collection\u0026nbsp;或\u0026nbsp;java.util.Iterator的值。在本教程中,您將創建一個列表變量,使用迭代器標籤來遍歷,並得到使用IteratorStatus迭代狀態。 \u003c/p\u003e \n\u003cp\u003e \u003cspan\u003e這裏創建一個Web工程:strut2\u003cspan\u003eiterator\u003c/span\u003e,來演示\u003c/span\u003e\u003cspan\u003e在多個複選框\u003c/span\u003e\u003cspan\u003e如何設置的默認值,整個項目的結構如下圖所示:\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/iterator-1.png\" alt=\"Struts2 \u003cs:iterator\u003e迭代器標籤示例\"\u003e \u003c/p\u003e \n\u003ch2\u003e 1. 動作 \u003c/h2\u003e \n\u003cp\u003e Action類有列表屬性,它包含多種美味\u0026nbsp;「KFC combo meals」. \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eIteratorKFCAction\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n \r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class IteratorKFCAction extends ActionSupport{\r\n \r\n\tprivate List\u0026lt;String\u0026gt; comboMeals;\r\n\t\r\n\tpublic List\u0026lt;String\u0026gt; getComboMeals() {\r\n\t\treturn comboMeals;\r\n\t}\r\n\r\n\tpublic void setComboMeals(List\u0026lt;String\u0026gt; comboMeals) {\r\n\t\tthis.comboMeals = comboMeals;\r\n\t}\r\n\r\n\tpublic String execute() {\r\n\t\t\r\n\t\tcomboMeals = new ArrayList\u0026lt;String\u0026gt;();\r\n\t\tcomboMeals.add(\"Snack Plate\");\r\n\t\tcomboMeals.add(\"Dinner Plate\");\r\n\t\tcomboMeals.add(\"Colonel Chicken Rice Combo\");\r\n\t\tcomboMeals.add(\"Colonel Burger\");\r\n\t\tcomboMeals.add(\"O.R. Fillet Burger\");\r\n\t\tcomboMeals.add(\"Zinger Burger\");\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. 迭代器 - Iterator示例 \u003c/h2\u003e \n\u003cp\u003e 下面的JSP頁面使用iterator標籤來遍歷顯示所有的「肯德基組合餐」名單。\u0026nbsp;在迭代器標籤,它包含了一個「status」的屬性,它用於在IteratorStatus類中聲明名稱。 \u003c/p\u003e \n\u003cdiv\u003e\n IteratorStatus類用於獲取有關迭代的狀態信息。支持屬性索引,計數,第一個,最後,奇,偶和等。 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n \r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2 \u0026lt;s:iterator\u0026gt;標籤示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;div\u0026gt;\u0026lt;div class=\"ads-in-post hide_if_width_less_800\"\u0026gt;\r\n\u0026lt;script async src=\"//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\"\u0026gt;\u0026lt;/script\u0026gt;\r\n\u0026lt;!-- 728x90 - After2ndH4 --\u0026gt;\r\n\u0026lt;ins class=\"adsbygoogle hide_if_width_less_800\" \r\n style=\"display:inline-block;width:728px;height:90px\"\r\n data-ad-client=\"ca-pub-2836379775501347\"\r\n data-ad-slot=\"3642936086\"\r\n\t data-ad-region=\"yiibairegion\"\u0026gt;\u0026lt;/ins\u0026gt;\r\n\u0026lt;script\u0026gt;\r\n(adsbygoogle = window.adsbygoogle || []).push({});\r\n\u0026lt;/script\u0026gt;\r\n\u0026lt;/div\u0026gt;\u0026lt;/div\u0026gt;\u0026lt;h2\u0026gt;Simple Iterator\u0026lt;/h2\u0026gt;\r\n\u0026lt;ol\u0026gt;\r\n\u0026lt;s:iterator value=\"comboMeals\"\u0026gt;\r\n \u0026lt;li\u0026gt;\u0026lt;s:property /\u0026gt;\u0026lt;/li\u0026gt;\r\n\u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/ol\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;Iterator with IteratorStatus\u0026lt;/h2\u0026gt;\r\n\u0026lt;table\u0026gt;\r\n\u0026lt;s:iterator value=\"comboMeals\" status=\"comboMealsStatus\"\u0026gt;\r\n \u0026lt;tr\u0026gt;\r\n \t\u0026lt;s:if test=\"#comboMealsStatus.even == true\"\u0026gt;\r\n \u0026lt;td style=\"background: #CCCCCC\"\u0026gt;\u0026lt;s:property/\u0026gt;\u0026lt;/td\u0026gt;\r\n \u0026lt;/s:if\u0026gt;\r\n \u0026lt;s:elseif test=\"#comboMealsStatus.first == true\"\u0026gt;\r\n \u0026lt;td\u0026gt;\u0026lt;s:property/\u0026gt; (This is first value) \u0026lt;/td\u0026gt;\r\n \u0026lt;/s:elseif\u0026gt;\r\n \u0026lt;s:else\u0026gt;\r\n \u0026lt;td\u0026gt;\u0026lt;s:property/\u0026gt;\u0026lt;/td\u0026gt;\r\n \u0026lt;/s:else\u0026gt;\r\n \u0026lt;/tr\u0026gt;\r\n\u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/table\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\t\u0026lt;action name=\"iteratorKFCAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.IteratorKFCAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;/pages/iterator.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\t\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/struts2iterator/iteratorKFCAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cp\u003e \u003cem\u003e\u003cimg src=\"https://asset.1ju.org/cmsstatic/iterator-2.png\" alt=\"Struts2 \u003cs:iterator\u003e迭代器標籤示例\"\u003e\u003cbr\u003e \u003c/em\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/iterator.html\"\u003eStruts2 \u0026lt;s:Iterator\u0026gt;標籤示例\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/struts2-core/apidocs/org/apache/struts2/views/jsp/IteratorStatus.html\"\u003eIteratorStatus文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cbr\u003e 下載代碼 -\u0026nbsp; \n\u003ca href=\"http://pan.baidu.com/s/1gdx02fp\"\u003ehttp://pan.baidu.com/s/1gdx02fp\u003c/a\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"5f:Tf19,"])</script><script>self.__next_f.push([1,"\u003cdiv class=\"__kindeditor_paste__\"\u003e \n \u003cp\u003e \u003cspan\u003eStruts2 \u0026lt;s:if\u0026gt;, \u0026lt;s:elseif\u0026gt;, \u0026lt;s:else\u0026gt;標籤示例用於執行基本的條件檢查。這裏創建一個Web工程:strut2iftag,來演示在多個複選框如何設置的默認值,整個項目的結構如下圖所示:\u003c/span\u003e \u003c/p\u003e \n \u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-if-elseif-else-1.png\" alt=\"Struts2 if,elseif,else標籤示例\"\u003e \u003c/p\u003e \n \u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n \u003cdiv\u003e \n \u003cp\u003e \u003c/p\u003e \n \u003cdiv\u003e\n \u0026lt;s:if\u0026gt; 標籤可以單獨使用。 \n \u003c/div\u003e \n \u003cpre\u003e\u0026lt;s:if test=\"%{#variable=='String 1'}\"\u0026gt;\r\n\tThis is String 1\r\n\u0026lt;/s:if\u0026gt;\u003c/pre\u003e \n \u003cp\u003e 或使用 \u0026lt;s:elseif\u0026gt;\u0026nbsp;標籤 \u003c/p\u003e \n \u003cpre\u003e\u0026lt;s:if test=\"%{#variable=='String 1'}\"\u0026gt;\r\n\tThis is String 1\r\n\u0026lt;/s:if\u0026gt;\r\n\u0026lt;s:elseif test=\"%{#variable=='String 2'}\"\u0026gt;\r\n This is String 2\r\n\u0026lt;/s:elseif\u0026gt;\u003c/pre\u003e \n \u003cdiv\u003e\n 和/或單/多\u0026lt;s:else\u0026gt;標籤。 \n \u003c/div\u003e \n \u003cpre\u003e\u0026lt;s:if test=\"%{#variable=='String 1'}\"\u0026gt;\r\n\tThis is String 1\r\n\u0026lt;/s:if\u0026gt;\r\n\u0026lt;s:elseif test=\"%{#variable=='String 2'}\"\u0026gt;\r\n This is String 2\r\n\u0026lt;/s:elseif\u0026gt;\r\n\u0026lt;s:else\u0026gt;\r\n Other Strings\r\n\u0026lt;/s:else\u0026gt;\u003c/pre\u003e \n \u003cdiv\u003e\n 以上所有的陳述是正確的。讓我們看一個例子來說明使用 Struts2 的「If,\u0026nbsp;elseIf\u0026nbsp;和\u0026nbsp;else\" 標籤。 \n \u003c/div\u003e \n \u003ch2\u003e 1. 動作 \u003c/h2\u003e \n \u003cdiv\u003e\n 一個Action類的字符串屬性,其中包含了「Struts\u0026nbsp;2」的值。 \n \u003c/div\u003e \n \u003cp\u003e \u003cstrong\u003eIfTagAction\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class IfTagAction extends ActionSupport{\r\n \r\n\tprivate String framework = \"Struts 2\";\r\n\r\n\tpublic String getFramework() {\r\n\t\treturn framework;\r\n\t}\r\n\r\n\tpublic void setFramework(String framework) {\r\n\t\tthis.framework = framework;\r\n\t}\r\n\r\n\tpublic String execute() {\r\n\t\treturn SUCCESS;\r\n\t}\r\n}\u003c/pre\u003e \n \u003ch2\u003e 2. If, elseIf 和 else 標籤示例 \u003c/h2\u003e \n \u003cdiv\u003e\n JSP頁面來顯示使用 if,\u0026nbsp;elseif\u0026nbsp;和\u0026nbsp;else 標籤的執行檢查「framework」變量。 \n \u003c/div\u003e \n \u003cp\u003e \u003cstrong\u003eif.jsp\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n \u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 If, Else, ElseIf tag example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:set name=\"webFramework\" value=\"framework\"/\u0026gt;\r\n\r\n\u0026lt;s:if test=\"%{#webFramework=='Struts 2'}\"\u0026gt;\r\n\tThis is Struts 2\r\n\u0026lt;/s:if\u0026gt;\r\n\u0026lt;s:elseif test=\"%{#webFramework=='Struts 1'}\"\u0026gt;\r\n This is Struts 1\r\n\u0026lt;/s:elseif\u0026gt;\r\n\u0026lt;s:else\u0026gt;\r\n Other framework\r\n\u0026lt;/s:else\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n \u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n \u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\t\u0026lt;action name=\"ifTagAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.IfTagAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;pages/if.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\t\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n \u003ch2\u003e 4. 示例 \u003c/h2\u003e \n \u003cp\u003e http://localhost:8080/struts2iftag/ifTagAction.action \u003c/p\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-if-elseif-else-2.png\" alt=\"Struts2 if,elseif,else標籤示例\"\u003e \n \u003cbr\u003e \n \u003ch2\u003e 參考 \u003c/h2\u003e \n \u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/if.html\"\u003eStruts2 If 標籤文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/elseif.html\"\u003eStruts2 elseIf 標籤文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/else.html\"\u003eStruts2 else 文檔\u003c/a\u003e \u003c/li\u003e \n \u003c/ol\u003e \n \u003c/div\u003e \n\u003c/div\u003e 代碼下載 - \n\u003ca href=\"http://pan.baidu.com/s/1gdpYY7D\"\u003ehttp://pan.baidu.com/s/1gdpYY7D\u003c/a\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"60:T1935,"])</script><script>self.__next_f.push([1,"\u003cp\u003e Struts2 的\u0026nbsp;append(追加)標籤被用來組合幾個迭代器(以列表或映射創建)成一個單一的迭代器。這裏創建一個Web工程:struts2appendtag,來演示在多個複選框如何設置的默認值,整個項目的結構如下圖所示: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/append-1.png\" alt=\"struts2 \u003cs:append\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cp\u003e \u003c/p\u003e \n\u003cp\u003e 在本教程中,將使用Struts2 \u0026lt;s:append\u0026gt;標籤執行以下任務: \u003c/p\u003e \n\u003col\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 組合三個ArrayList 到一個迭代器。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 組合三個HashMap到一個迭代器。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 合併ArrayList和HashMap到一個迭代器。 \n \u003c/div\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv\u003e\n 假設2個迭代器,每個都有兩個項,用後追加標籤結合成一個迭代器,這些條目的順序將類似於以下內容: \n \u003col\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 第一迭代器的第一項 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 第一個迭代器的第二項 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 第二個迭代器的第一項 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 第二個迭代器的第二項 \n \u003c/div\u003e \u003c/li\u003e \n \u003c/ol\u003e \n \u003cdiv\u003e\n 這僅適用於列表迭代器;映射迭代器,順序是隨機的。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003ch2\u003e 1. 動作 \u003c/h2\u003e \n\u003cdiv\u003e\n Action類有3個\u0026nbsp;ArrayList\u0026nbsp;和\u0026nbsp;3\u0026nbsp;個\u0026nbsp;HashMap屬性。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eAppendTagAction\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.HashMap;\r\nimport java.util.List;\r\nimport java.util.Map;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class AppendTagAction extends ActionSupport{\r\n \r\n\tprivate List\u0026lt;String\u0026gt; list1 = new ArrayList\u0026lt;String\u0026gt;();\r\n\tprivate List\u0026lt;String\u0026gt; list2 = new ArrayList\u0026lt;String\u0026gt;();\r\n\tprivate List\u0026lt;String\u0026gt; list3 = new ArrayList\u0026lt;String\u0026gt;();\r\n\r\n\tprivate Map\u0026lt;String,String\u0026gt; map1 = new HashMap\u0026lt;String,String\u0026gt;();\r\n\tprivate Map\u0026lt;String,String\u0026gt; map2 = new HashMap\u0026lt;String,String\u0026gt;();\r\n\tprivate Map\u0026lt;String,String\u0026gt; map3 = new HashMap\u0026lt;String,String\u0026gt;();\r\n\t\r\n\tpublic String execute() {\r\n\t\t\r\n\t\tlist1.add(\"List1 - 1\");\r\n\t\tlist1.add(\"List1 - 2\");\r\n\t\tlist1.add(\"List1 - 3\");\r\n\t\t\r\n\t\tlist2.add(\"List2 - 1\");\r\n\t\tlist2.add(\"List2 - 2\");\r\n\t\tlist2.add(\"List2 - 3\");\r\n\t\t\r\n\t\tlist3.add(\"List3 - 1\");\r\n\t\tlist3.add(\"List3 - 2\");\r\n\t\tlist3.add(\"List3 - 3\");\r\n\t\t\r\n\t\tmap1.put(\"map1-key1\", \"map1-value1\");\r\n\t\tmap1.put(\"map1-key2\", \"map1-value2\");\r\n\t\tmap1.put(\"map1-key3\", \"map1-value3\");\r\n\t\t\r\n\t\tmap2.put(\"map2-key1\", \"map2-value1\");\r\n\t\tmap2.put(\"map2-key2\", \"map2-value2\");\r\n\t\tmap2.put(\"map2-key3\", \"map2-value3\");\r\n\t\t\r\n\t\tmap3.put(\"map3-key1\", \"map3-value1\");\r\n\t\tmap3.put(\"map3-key2\", \"map3-value2\");\r\n\t\tmap3.put(\"map3-key3\", \"map3-value3\");\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t}\r\n\r\n\t//getter methods...\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. Append 標籤文檔 \u003c/h2\u003e \n\u003cdiv\u003e\n JSP頁面使用\u0026lt;s:append\u0026gt;標籤將3個ArrayList/3個HashMap/1個ArrayList+1個HashMap合併成一個迭代器,並遍歷它的值,並打印出來。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eappendIterator.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n \u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\u0026lt;title\u0026gt;Struts2 append 標籤示例 - by www.yiibai.com\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2 Append 標籤示例\u0026lt;/h1\u0026gt;\r\n\r\n1. Combine 3 ArrayList into a single iterator.\r\n\u0026lt;s:append var=\"customListIterator\"\u0026gt;\r\n \u0026lt;s:param value=\"%{list1}\" /\u0026gt;\r\n \u0026lt;s:param value=\"%{list2}\" /\u0026gt;\r\n \u0026lt;s:param value=\"%{list3}\" /\u0026gt;\r\n\u0026lt;/s:append\u0026gt;\r\n\u0026lt;ol\u0026gt;\r\n\u0026lt;s:iterator value=\"%{#customListIterator}\"\u0026gt;\r\n \u0026lt;li\u0026gt;\u0026lt;s:property /\u0026gt;\u0026lt;/li\u0026gt;\r\n\u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/ol\u0026gt;\r\n\r\n2. Combine 3 HashMap into a single iterator.\r\n\u0026lt;s:append var=\"customMapIterator\"\u0026gt;\r\n \u0026lt;s:param value=\"%{map1}\" /\u0026gt;\r\n \u0026lt;s:param value=\"%{map2}\" /\u0026gt;\r\n \u0026lt;s:param value=\"%{map3}\" /\u0026gt;\r\n\u0026lt;/s:append\u0026gt;\r\n\u0026lt;ol\u0026gt;\r\n\u0026lt;s:iterator value=\"%{#customMapIterator}\"\u0026gt;\r\n \u0026lt;li\u0026gt;\u0026lt;s:property /\u0026gt;\u0026lt;/li\u0026gt;\r\n\u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/ol\u0026gt;\r\n\r\n3. Combine ArrayList and HashMap into a single iterator.\r\n\u0026lt;s:append var=\"customMixedIterator\"\u0026gt;\r\n \u0026lt;s:param value=\"%{list1}\" /\u0026gt;\r\n \u0026lt;s:param value=\"%{map1}\" /\u0026gt;\r\n\u0026lt;/s:append\u0026gt;\r\n\u0026lt;ol\u0026gt;\r\n\u0026lt;s:iterator value=\"%{#customMixedIterator}\"\u0026gt;\r\n \u0026lt;li\u0026gt;\u0026lt;s:property /\u0026gt;\u0026lt;/li\u0026gt;\r\n\u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/ol\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\t\u0026lt;action name=\"appendTagAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.AppendTagAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;/pages/appendIterator.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\t\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e \u003ca href=\"http://localhost:8080/struts2appendtag/appendTagAction.action\"\u003ehttp://localhost:8080/struts2appendtag/appendTagAction.action\u003c/a\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/append-2.png\" alt=\"struts2 \u003cs:append\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003c/p\u003e \n\u003cp\u003e 在瀏覽器中打開,顯示結果如下: \u003c/p\u003e \n\u003cpre\u003eStruts 2 Append tag example\r\n\r\n1. Combine 3 ArrayList into a single iterator.\r\n\r\n 1. List1 - 1\r\n 2. List1 - 2\r\n 3. List1 - 3\r\n 4. List2 - 1\r\n 5. List2 - 2\r\n 6. List2 - 3\r\n 7. List3 - 1\r\n 8. List3 - 2\r\n 9. List3 - 3\r\n\r\n2. Combine 3 HashMap into a single iterator.\r\n\r\n 1. map1-key3=map1-value3\r\n 2. map1-key1=map1-value1\r\n 3. map1-key2=map1-value2\r\n 4. map2-key2=map2-value2\r\n 5. map2-key3=map2-value3\r\n 6. map2-key1=map2-value1\r\n 7. map3-key3=map3-value3\r\n 8. map3-key1=map3-value1\r\n 9. map3-key2=map3-value2\r\n\r\n3. Combine ArrayList and HashMap into a single iterator.\r\n\r\n 1. List1 - 1\r\n 2. List1 - 2\r\n 3. List1 - 3\r\n 4. map1-key3=map1-value3\r\n 5. map1-key1=map1-value1\r\n 6. map1-key2=map1-value2\u003c/pre\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/append.html\"\u003eStruts 2 Append 標籤文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e 下載代碼 - \n\u003ca href=\"http://pan.baidu.com/s/1ntOs9Zj\"\u003ehttp://pan.baidu.com/s/1ntOs9Zj\u003c/a\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"61:T1007,"])</script><script>self.__next_f.push([1,"\u003cp\u003e \u003cspan\u003eStruts2 \u0026lt;s:generator\u0026gt;標記用於基於在頁中提供「val」屬性,以產生一個迭代。這裏創建一個Web工程:struts2generatortag,來演示在多個複選框如何設置的默認值,整個項目的結構如下圖所示:\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/generator-1.png\" alt=\"Struts2 \u003cs:generator\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cdiv\u003e \n \u003cp\u003e \u003c/p\u003e \n \u003cdiv\u003e\n 在本教程中,將使用Struts2 \u0026lt;s:generator\u0026gt;標籤來執行以下任務: \n \u003c/div\u003e \n \u003col\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 使用generator標籤來創建生成迭代器。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 使用\u0026lt;s:generator\u0026gt;創建生成迭代器,並使用「Converter」對象修改迭代器值。 \n \u003c/div\u003e \u003c/li\u003e \n \u003c/ol\u003e \n \u003ch2\u003e 1. 動作 \u003c/h2\u003e \n \u003cdiv\u003e\n 有一個方法,Action類返回一個「Converter對象。 \n \u003c/div\u003e \n \u003cp\u003e \u003cstrong\u003eGeneratorTagAction\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport org.apache.struts2.util.IteratorGenerator.Converter;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class GeneratorTagAction extends ActionSupport{\r\n\t\r\n\tpublic String execute() {\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t}\r\n\r\n\tpublic Converter getLanguageConverter(){\r\n\t\treturn new Converter() {\r\n\t public Object convert(String value) throws Exception {\r\n\t \t \r\n\t \t if(\"java\".equals(value)){\r\n\t \t\t return \"[java value in converter] - \" + value;\r\n\t \t }else{\r\n\t \t\t return value;\r\n\t \t }\r\n\t \r\n\t }\r\n\t };\r\n\t}\r\n}\u003c/pre\u003e \n \u003ch2\u003e 2. Generator 標籤示例 \u003c/h2\u003e \n \u003cp\u003e 下面的JSP頁面使用generator標籤演示動態創建一個迭代器。「separator」屬性是必需的,其分離val到迭代器的條目中。 \u003c/p\u003e \n \u003cp\u003e 「converter」屬性是可選的,它允許修改值。在這種情況下,它會調用GeneratorTagAction的getLanguageConverter()方法,如果值等於「Java」字符串並修改值。 \u003c/p\u003e \n \u003cp\u003e \u003cstrong\u003egenerator.jsp\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n \u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 Generator tag example\u0026lt;/h1\u0026gt;\r\n\r\n1. Generator tag example.\r\n\u0026lt;s:generator val=\"%{'java|.net|c|python|shell'}\" separator=\"|\"\u0026gt;\r\n\u0026lt;ol\u0026gt;\r\n\u0026lt;s:iterator\u0026gt;\r\n \u0026lt;li\u0026gt;\u0026lt;s:property /\u0026gt;\u0026lt;/li\u0026gt;\r\n\u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/s:generator\u0026gt;\r\n\u0026lt;/ol\u0026gt; \r\n\r\n2. Generator tag with converter example\r\n\u0026lt;s:generator val=\"%{'java|.net|c|python|shell'}\" separator=\"|\" \r\nconverter=\"%{languageConverter}\"\u0026gt;\r\n\u0026lt;ol\u0026gt;\r\n\u0026lt;s:iterator\u0026gt;\r\n \u0026lt;li\u0026gt;\u0026lt;s:property /\u0026gt;\u0026lt;/li\u0026gt;\r\n\u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/s:generator\u0026gt;\r\n\u0026lt;/ol\u0026gt; \r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n \u003cdiv\u003e \n \u003cdiv\u003e\n 找不到任何使用generator標籤示例,因爲不建議在頁面迭代值。 \n \u003c/div\u003e \n \u003c/div\u003e \n \u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n \u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\t\u0026lt;action name=\"appendTagAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.AppendTagAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;pages/appendIterator.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\t\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n \u003ch2\u003e 4. 示例 \u003c/h2\u003e \n \u003cp\u003e http://localhost:8080/struts2generator/generatorTagAction.action \u003c/p\u003e \n \u003cdiv\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/generator-2.png\" alt=\"Struts2 \u003cs:generator\u003e標籤示例\"\u003e \n \u003cbr\u003e \n \u003c/div\u003e \n \u003ch2\u003e 參考 \u003c/h2\u003e \n \u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/generator.html\"\u003eStruts2 generator 文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/struts2-core/apidocs/org/apache/struts2/util/IteratorGenerator.Converter.html\"\u003eStruts2 Converter 文檔\u003c/a\u003e \u003c/li\u003e \n \u003c/ol\u003e \n\u003c/div\u003e 代碼下載 -\u0026nbsp; \n\u003ca href=\"http://pan.baidu.com/s/1mgm0W1E\"\u003ehttp://pan.baidu.com/s/1mgm0W1E\u003c/a\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"62:T1933,"])</script><script>self.__next_f.push([1,"\u003cp\u003e \u003cspan\u003eStruts2\u0026nbsp;merge標籤用來合併幾個迭代器(由列表或映射創建)成一個迭代器。這裏創建一個Web工程:struts2mergetag,來演示在多個複選框如何設置的默認值,整個項目的結構如下圖所示:\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/merge-1.png\" alt=\"Struts2 \u003cs:merge\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003cdiv\u003e\n 在本教程中,將使用Struts2 \u0026lt;s:merge\u0026gt;標籤執行以下任務: \n\u003c/div\u003e \n\u003col\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 合併三個ArrayList到一個迭代器 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 合併三個HashMap到一個迭代器 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 合併ArrayList和HashMap到一個迭代器 \n \u003c/div\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv\u003e\n 假設有2個迭代器,每個有兩個條目,使用merge標記合併成一個迭代後,這些條目的順序將類似於以下內容: \n \u003col\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 第一個迭代的第一個條目。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 第二個迭代器的第一項 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 第一個迭代器的第二項 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 第二個迭代器的第二項。 \n \u003c/div\u003e \u003c/li\u003e \n \u003c/ol\u003e \n \u003cdiv\u003e\n 這僅適用於列表迭代器;映射迭代器,順序將是隨機的。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003ch2\u003e 1. 動作 \u003c/h2\u003e \n\u003cdiv\u003e\n Action類有3個ArrayList\u0026nbsp;和\u0026nbsp;3\u0026nbsp;個\u0026nbsp;HashMap屬性。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eMergeTagAction\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.HashMap;\r\nimport java.util.List;\r\nimport java.util.Map;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class MergeTagAction extends ActionSupport{\r\n \r\n\tprivate List\u0026lt;String\u0026gt; list1 = new ArrayList\u0026lt;String\u0026gt;();\r\n\tprivate List\u0026lt;String\u0026gt; list2 = new ArrayList\u0026lt;String\u0026gt;();\r\n\tprivate List\u0026lt;String\u0026gt; list3 = new ArrayList\u0026lt;String\u0026gt;();\r\n\r\n\tprivate Map\u0026lt;String,String\u0026gt; map1 = new HashMap\u0026lt;String,String\u0026gt;();\r\n\tprivate Map\u0026lt;String,String\u0026gt; map2 = new HashMap\u0026lt;String,String\u0026gt;();\r\n\tprivate Map\u0026lt;String,String\u0026gt; map3 = new HashMap\u0026lt;String,String\u0026gt;();\r\n\t\r\n\tpublic String execute() {\r\n\t\t\r\n\t\tlist1.add(\"List1 - 1\");\r\n\t\tlist1.add(\"List1 - 2\");\r\n\t\tlist1.add(\"List1 - 3\");\r\n\t\t\r\n\t\tlist2.add(\"List2 - 1\");\r\n\t\tlist2.add(\"List2 - 2\");\r\n\t\tlist2.add(\"List2 - 3\");\r\n\t\t\r\n\t\tlist3.add(\"List3 - 1\");\r\n\t\tlist3.add(\"List3 - 2\");\r\n\t\tlist3.add(\"List3 - 3\");\r\n\t\t\r\n\t\tmap1.put(\"map1-key1\", \"map1-value1\");\r\n\t\tmap1.put(\"map1-key2\", \"map1-value2\");\r\n\t\tmap1.put(\"map1-key3\", \"map1-value3\");\r\n\t\t\r\n\t\tmap2.put(\"map2-key1\", \"map2-value1\");\r\n\t\tmap2.put(\"map2-key2\", \"map2-value2\");\r\n\t\tmap2.put(\"map2-key3\", \"map2-value3\");\r\n\t\t\r\n\t\tmap3.put(\"map3-key1\", \"map3-value1\");\r\n\t\tmap3.put(\"map3-key2\", \"map3-value2\");\r\n\t\tmap3.put(\"map3-key3\", \"map3-value3\");\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t}\r\n\r\n\t//getter methods...\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. Merge 標籤示例 \u003c/h2\u003e \n\u003cp\u003e JSP頁面使用merge標記爲3個ArrayList/3個HashMap/1個ArrayList+1個HashMap合併成一個迭代器,循環它的值,並把打印出來。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003emerge.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n \u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\u003cspan\u003e\u0026lt;title\u0026gt;Generator\u0026nbsp;標籤示例\u0026nbsp;-\u0026nbsp;\u0026nbsp;\u003c/span\u003ewww.yiibai.com\u003cspan\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e \u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 Merge tag example\u0026lt;/h1\u0026gt;\r\n\r\n1. Merge 3 ArrayList into a single iterator.\r\n\u0026lt;s:merge var=\"customListIterator\"\u0026gt;\r\n \u0026lt;s:param value=\"%{list1}\" /\u0026gt;\r\n \u0026lt;s:param value=\"%{list2}\" /\u0026gt;\r\n \u0026lt;s:param value=\"%{list3}\" /\u0026gt;\r\n\u0026lt;/s:merge\u0026gt;\r\n\u0026lt;ol\u0026gt;\r\n\u0026lt;s:iterator value=\"%{#customListIterator}\"\u0026gt;\r\n \u0026lt;li\u0026gt;\u0026lt;s:property /\u0026gt;\u0026lt;/li\u0026gt;\r\n\u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/ol\u0026gt;\r\n\r\n2. Merge 3 HashMap into a single iterator.\r\n\u0026lt;s:merge var=\"customMapIterator\"\u0026gt;\r\n \u0026lt;s:param value=\"%{map1}\" /\u0026gt;\r\n \u0026lt;s:param value=\"%{map2}\" /\u0026gt;\r\n \u0026lt;s:param value=\"%{map3}\" /\u0026gt;\r\n\u0026lt;/s:merge\u0026gt;\r\n\u0026lt;ol\u0026gt;\r\n\u0026lt;s:iterator value=\"%{#customMapIterator}\"\u0026gt;\r\n \u0026lt;li\u0026gt;\u0026lt;s:property /\u0026gt;\u0026lt;/li\u0026gt;\r\n\u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/ol\u0026gt;\r\n\r\n3. Merge ArrayList and HashMap into a single iterator.\r\n\u0026lt;s:merge var=\"customMixedIterator\"\u0026gt;\r\n \u0026lt;s:param value=\"%{list1}\" /\u0026gt;\r\n \u0026lt;s:param value=\"%{map1}\" /\u0026gt;\r\n\u0026lt;/s:merge\u0026gt;\r\n\u0026lt;ol\u0026gt;\r\n\u0026lt;s:iterator value=\"%{#customMixedIterator}\"\u0026gt;\r\n \u0026lt;li\u0026gt;\u0026lt;s:property /\u0026gt;\u0026lt;/li\u0026gt;\r\n\u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/ol\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\t\u0026lt;action name=\"mergeTagAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.MergeTagAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;pages/merge.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\t\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e \u003ca href=\"http://localhost:8080/struts2mergetag/mergeTagAction.action\"\u003ehttp://localhost:8080/struts2mergetag/mergeTagAction.action\u003c/a\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/merge-2.png\" alt=\"Struts2 \u003cs:merge\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003c/p\u003e \n\u003cp\u003e 在瀏覽器打開上面的網址,輸出以下結果: \u003c/p\u003e \n\u003cpre\u003eStruts 2 Merge tag example\r\n\r\n1. Merge 3 ArrayList into a single iterator.\r\n\r\n 1. List1 - 1\r\n 2. List2 - 1\r\n 3. List3 - 1\r\n 4. List1 - 2\r\n 5. List2 - 2\r\n 6. List3 - 2\r\n 7. List1 - 3\r\n 8. List2 - 3\r\n 9. List3 - 3\r\n\r\n2. Merge 3 HashMap into a single iterator.\r\n\r\n 1. map1-key3=map1-value3\r\n 2. map2-key2=map2-value2\r\n 3. map3-key3=map3-value3\r\n 4. map1-key1=map1-value1\r\n 5. map2-key3=map2-value3\r\n 6. map3-key1=map3-value1\r\n 7. map1-key2=map1-value2\r\n 8. map2-key1=map2-value1\r\n 9. map3-key2=map3-value2\r\n\r\n3. Merge ArrayList and HashMap into a single iterator.\r\n\r\n 1. List1 - 1\r\n 2. map1-key3=map1-value3\r\n 3. List1 - 2\r\n 4. map1-key1=map1-value1\r\n 5. List1 - 3\r\n 6. map1-key2=map1-value2\u003c/pre\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/merge.html\"\u003eStruts 2 Merge 標籤文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e 代碼下載 -\u0026nbsp; \n\u003ca href=\"http://pan.baidu.com/s/1c0dnNcW\"\u003ehttp://pan.baidu.com/s/1c0dnNcW\u003c/a\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"63:T19c2,"])</script><script>self.__next_f.push([1,"\u003cp\u003e \u003cspan\u003eStruts2的\u0026lt;s:sort\u0026gt;標籤使用\u0026nbsp;java.util.Comparator\u0026nbsp;來排序列表,這裏創建一個Web工程:struts2sorttag,來演示在多個複選框如何設置的默認值,整個項目的結構如下圖所示:\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/sort-1.png\" alt=\"Struts2 \u003cs:sort\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cp\u003e \u003c/p\u003e \n\u003cp\u003e 在本教程中,將創建6個\u0026nbsp;Person對象並添加到一個ArrayList,並使用排序標籤基於Person屬性的ArrayList進行排序。 \u003c/p\u003e \n\u003cdiv\u003e\n 要使用這個Struts2的\u0026lt;s:sort\u0026gt;標籤,\u0026nbsp;必須瞭解了java.util.Comparator 是如何工作的 \n\u003c/div\u003e \n\u003ch2\u003e 1. Person 對象 \u003c/h2\u003e \n\u003cdiv\u003e\n 創建一個有\"firstName」,\u0026nbsp;「lastName」\u0026nbsp;和\u0026nbsp;「age」屬性的Person對象。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003ePerson.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common;\r\n\r\npublic class Person{\r\n\t\r\n\tprivate String firstName;\r\n\tprivate String lastName;\r\n\tprivate int age;\r\n\t\r\n\tpublic Person(String firstName, String lastName, int age) {\r\n\t\tsuper();\r\n\t\tthis.firstName = firstName;\r\n\t\tthis.lastName = lastName;\r\n\t\tthis.age = age;\r\n\t}\r\n\t\r\n\tpublic String getFirstName() {\r\n\t\treturn firstName;\r\n\t}\r\n\tpublic void setFirstName(String firstName) {\r\n\t\tthis.firstName = firstName;\r\n\t}\r\n\tpublic String getLastName() {\r\n\t\treturn lastName;\r\n\t}\r\n\tpublic void setLastName(String lastName) {\r\n\t\tthis.lastName = lastName;\r\n\t}\r\n\tpublic int getAge() {\r\n\t\treturn age;\r\n\t}\r\n\tpublic void setAge(int age) {\r\n\t\tthis.age = age;\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. Comparator \u003c/h2\u003e \n\u003cdiv\u003e\n 創建2個Comparator類,對Person的「firstName」\u0026nbsp;和\u0026nbsp;「age」\u0026nbsp;屬性進行排序。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eFirstNameComparator.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common;\r\n\r\nimport java.util.Comparator;\r\nimport com.yiibai.common.Person;\r\n\r\npublic class FirstNameComparator implements Comparator\u0026lt;Person\u0026gt; {\r\n\r\n\tpublic int compare(Person p1, Person p2) {\r\n\t\t\r\n\t\tString firstName1 = p1.getFirstName().toUpperCase();\r\n\t\tString firstName2 = p2.getFirstName().toUpperCase();\r\n\t\t\r\n\t\treturn firstName1.compareTo(firstName2);\r\n\t}\r\n}\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eAgeComparator.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common;\r\n\r\nimport java.util.Comparator;\r\nimport com.yiibai.common.Person;\r\n\r\npublic class AgeComparator implements Comparator\u0026lt;Person\u0026gt; {\r\n\r\n\tpublic int compare(Person p1, Person p2) {\r\n\t\t\r\n\t\treturn p1.getAge() - p2.getAge();\r\n\t\t\r\n\t}\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 3. 動作-Action \u003c/h2\u003e \n\u003cdiv\u003e\n Action類,初始化6個\u0026nbsp;Person\u0026nbsp;對象,並把它添加到一個ArrayList。 \n\u003c/div\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\n\r\nimport com.yiibai.common.Person;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class SortTagAction extends ActionSupport{\r\n\t\r\n\tprivate List\u0026lt;Person\u0026gt; persons = new ArrayList\u0026lt;Person\u0026gt;();\r\n\t\r\n\tpublic String execute() {\r\n\t\t\r\n\t\tPerson p1 = new Person(\"C-First\", \"C-Last\", 40);\r\n\t\tPerson p2 = new Person(\"A-First\", \"A-Last\", 20);\r\n\t\tPerson p3 = new Person(\"B-First\", \"B-Last\", 10);\r\n\t\tPerson p4 = new Person(\"F-First\", \"F-Last\", 33);\r\n\t\tPerson p5 = new Person(\"E-First\", \"E-Last\", 22);\r\n\t\tPerson p6 = new Person(\"D-First\", \"D-Last\", 11);\r\n\t\t\r\n\t\tpersons.add(p1);\r\n\t\tpersons.add(p2);\r\n\t\tpersons.add(p3);\r\n\t\tpersons.add(p4);\r\n\t\tpersons.add(p5);\r\n\t\tpersons.add(p6);\r\n \r\n\t\treturn SUCCESS;\r\n\t}\r\n\r\n\tpublic List\u0026lt;Person\u0026gt; getPersons() {\r\n\t\treturn persons;\r\n\t}\r\n\tpublic void setPersons(List\u0026lt;Person\u0026gt; persons) {\r\n\t\tthis.persons = persons;\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 4. \u0026lt;s:sort\u0026gt;標籤示例 \u003c/h2\u003e \n\u003cdiv\u003e\n JSP頁面使用sort標籤與「FirstNameComparator」和「AgeComparator」對列表進行排序。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003esort.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n \u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\u0026lt;title\u0026gt;struts2 sort標籤示例 - www.yiibai.com\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 Sort標籤示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:bean name=\"com.yiibai.common.FirstNameComparator\" var=\"firstNameComparator\" /\u0026gt;\r\n\u0026lt;s:bean name=\"com.yiibai.common.AgeComparator\" var=\"ageComparator\" /\u0026gt;\r\n\r\n\u0026lt;table\u0026gt;\r\n\u0026lt;tr\u0026gt;\r\n\u0026lt;td\u0026gt;\r\n1. Display all persons (unsort).\r\n\u0026lt;ol\u0026gt;\r\n\u0026lt;s:iterator value=\"persons\"\u0026gt;\r\n \u0026lt;li\u0026gt;\u0026lt;s:property value=\"firstName\" /\u0026gt;, \r\n \u0026lt;s:property value=\"lastName\" /\u0026gt;, \r\n \u0026lt;s:property value=\"age\" /\u0026gt;\r\n \u0026lt;/li\u0026gt;\r\n\u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/ol\u0026gt;\r\n\u0026lt;/td\u0026gt;\r\n\r\n\u0026lt;td\u0026gt;\r\n2. Display all persons (sort with firstName).\r\n\u0026lt;s:sort comparator=\"#firstNameComparator\" source=\"persons\"\u0026gt;\r\n\u0026lt;ol\u0026gt;\r\n\u0026lt;s:iterator\u0026gt;\r\n \u0026lt;li\u0026gt;\u0026lt;s:property value=\"firstName\" /\u0026gt;, \r\n \u0026lt;s:property value=\"lastName\" /\u0026gt;, \r\n \u0026lt;s:property value=\"age\" /\u0026gt;\r\n \u0026lt;/li\u0026gt;\r\n\u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/ol\u0026gt;\r\n\u0026lt;/s:sort\u0026gt;\r\n\u0026lt;/td\u0026gt;\r\n\u0026lt;/tr\u0026gt;\r\n\r\n\u0026lt;tr\u0026gt;\r\n\u0026lt;td colspan=\"2\"\u0026gt;\r\n3. Display all persons (sort with age).\r\n\u0026lt;s:sort comparator=\"#ageComparator\" source=\"persons\"\u0026gt;\r\n\u0026lt;ol\u0026gt;\r\n\u0026lt;s:iterator\u0026gt;\r\n \u0026lt;li\u0026gt;\u0026lt;s:property value=\"firstName\" /\u0026gt;, \r\n \u0026lt;s:property value=\"lastName\" /\u0026gt;, \r\n \u0026lt;s:property value=\"age\" /\u0026gt;\r\n \u0026lt;/li\u0026gt;\r\n\u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/ol\u0026gt;\r\n\u0026lt;/s:sort\u0026gt;\r\n\u0026lt;/td\u0026gt;\r\n\u0026lt;/tr\u0026gt;\r\n\u0026lt;/table\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\u0026lt;action name=\"sortTagAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.SortTagAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;pages/sort.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e http://localhost:8080/strut2sorttag/sortTagAction.action \u003c/p\u003e \n\u003cp\u003e 在瀏覽器打開上面的URL,顯示結果如下: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/sort-2.png\" alt=\"Struts2 \u003cs:sort\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/sort.html\"\u003eStruts 2 Sort 標籤文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/bean.html\"\u003eStruts 2 Bean 標籤文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e Java object sorting 示例 \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e 下載代碼 -\u0026nbsp; \n\u003ca href=\"http://pan.baidu.com/s/1pJy6dth\"\u003ehttp://pan.baidu.com/s/1pJy6dth\u003c/a\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"64:T1308,"])</script><script>self.__next_f.push([1,"\u003cp\u003e \u003cspan\u003eStruts2\u0026nbsp;\u0026lt;s:subset\u0026nbsp;\u0026gt;標籤用來輸出一個iterator元素的子集或部分。在本教程中,將創建一個「數字」列表中,包含了10個元素(從 1 - 10),\u0026nbsp;並使用\u0026lt;s:subset\u0026nbsp;\u0026gt;標記\u0026nbsp;「start \u0026amp; count」\u0026nbsp;屬性和判定方法,以輸出一個迭代(列表)的子集。這裏創建一個Web工程:struts2subsettag,來演示在多個複選框如何設置的默認值,整個項目的結構如下圖所示:\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/subset-1.png\" alt=\"Struts2 \u003cs:subset\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cp\u003e \u003c/p\u003e \n\u003ch2\u003e 1. 動作 - Action \u003c/h2\u003e \n\u003cdiv\u003e\n Action類填充元素到一個列表,以及一個判定方法進行篩選,以顯示元素。 \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 如果判定方法返回一個「true」是指顯示該值;\u0026nbsp;否則,忽略它。可以在這裏實現過濾器的邏輯。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eSubsetTagAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\n\r\nimport org.apache.struts2.util.SubsetIteratorFilter.Decider;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class SubsetTagAction extends ActionSupport{\r\n\t\r\n\tprivate List\u0026lt;String\u0026gt; numbers = new ArrayList\u0026lt;String\u0026gt;();\r\n\t\r\n\tpublic String execute() {\r\n\t\t\r\n\t\tnumbers.add(\"Number 1\");\r\n\t\tnumbers.add(\"Number 2\");\r\n\t\tnumbers.add(\"Number 3\");\r\n\t\tnumbers.add(\"Number 4\");\r\n\t\tnumbers.add(\"Number 5\");\r\n\t\tnumbers.add(\"Number 6\");\r\n\t\tnumbers.add(\"Number 7\");\r\n\t\tnumbers.add(\"Number 8\");\r\n\t\tnumbers.add(\"Number 9\");\r\n\t\tnumbers.add(\"Number 10\");\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t}\r\n\r\n\tpublic List\u0026lt;String\u0026gt; getNumbers() {\r\n\t\treturn numbers;\r\n\t}\r\n\r\n\tpublic void setNumbers(List\u0026lt;String\u0026gt; numbers) {\r\n\t\tthis.numbers = numbers;\r\n\t}\r\n\r\n\tpublic Decider getNumberDecider() {\r\n\t return new Decider() {\r\n\t public boolean decide(Object obj) throws Exception {\r\n\t String number = ((String)obj).toString();\r\n\t \r\n\t if((\"Number 7\").equals(number)){\r\n\t \t return true;//display it\r\n\t }else{\r\n\t \t return false;//ignore\r\n\t }\r\n\t }\r\n\t };\r\n\t}\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. \u0026lt;s:subset\u0026gt;標籤示例 \u003c/h2\u003e \n\u003cdiv\u003e\n JSP頁面使用\u0026lt;s:subset\u0026gt;標籤迭代器輸出一個子集。 \n\u003c/div\u003e \n\u003cdiv\u003e\n 「start」以及「count」在\u0026lt;s:subset\u0026gt;標籤屬性是從0開始,這意味着\u0026nbsp;\u0026lt;s:subset source=」numbers」 start=」1″ count=」5″\u0026gt;\u0026nbsp;將提取元素\u0026nbsp;#2 到 #6. \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003esubset.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n \u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\u0026lt;title\u0026gt;Struts2 subset標籤示例 - www.yiibai.com\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 Subset tag example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;table border=\"1px\" cellpadding=\"8px\"\u0026gt;\r\n\u0026lt;tr valign=\"top\"\u0026gt;\r\n\u0026lt;td\u0026gt;\r\n1. Display all numbers.\r\n\u0026lt;ol\u0026gt;\r\n\u0026lt;s:subset source=\"numbers\"\u0026gt;\r\n \u0026lt;s:iterator\u0026gt;\r\n \t\u0026lt;li\u0026gt;\u0026lt;s:property /\u0026gt;\u0026lt;/li\u0026gt;\r\n \u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/s:subset\u0026gt;\r\n\u0026lt;/ol\u0026gt;\r\n\u0026lt;/td\u0026gt;\r\n\r\n\u0026lt;td\u0026gt;\r\n2. Display numbers , from #2 to #6\r\n\u0026lt;ol\u0026gt;\r\n\u0026lt;s:subset source=\"numbers\" start=\"1\" count=\"5\"\u0026gt;\r\n \u0026lt;s:iterator\u0026gt;\r\n \t\u0026lt;li\u0026gt;\u0026lt;s:property /\u0026gt;\u0026lt;/li\u0026gt;\r\n \u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/s:subset\u0026gt;\r\n\u0026lt;/ol\u0026gt;\r\n\u0026lt;/td\u0026gt;\r\n\r\n\u0026lt;td\u0026gt;\r\n3. Display numbers 7 only, with decider\r\n\u0026lt;ol\u0026gt;\r\n\u0026lt;s:subset source=\"numbers\" decider=\"numberDecider\"\u0026gt;\r\n \u0026lt;s:iterator\u0026gt;\r\n \t\u0026lt;li\u0026gt;\u0026lt;s:property /\u0026gt;\u0026lt;/li\u0026gt;\r\n \u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/s:subset\u0026gt;\r\n\u0026lt;/ol\u0026gt;\r\n\u0026lt;/td\u0026gt;\r\n\u0026lt;/tr\u0026gt;\r\n\u0026lt;/table\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\u0026lt;action name=\"subsetTagAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.SubsetTagAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;/pages/subset.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e http://localhost:8080/struts2subsettag/subsetTagAction.action \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/subset-2.png\" alt=\"Struts2 \u003cs:subset\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003cp\u003e 在瀏覽器中輸出以上網址訪問,顯示如下結果: \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/subset.htmll\"\u003eStruts 2 Subset 標籤文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e 代碼下載 -\u0026nbsp; \n\u003ca href=\"http://pan.baidu.com/s/1eQjpyIQ\"\u003ehttp://pan.baidu.com/s/1eQjpyIQ\u003c/a\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"65:Td03,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n Struts2 \u0026lt;s:a\u0026gt;標籤用於渲染一個 HTML 的「\u0026lt;a\u0026gt;」 標籤。最好的做法是使用\u0026lt;s:url\u0026gt;標籤來創建URL,並將其嵌入到\u0026lt;a\u0026gt;標籤。\u0026nbsp;例如, \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:url value=\"http://www.google.com\" var=\"googleURL\" /\u0026gt;\r\n\u0026lt;s:a href=\"%{googleURL}\"\u0026gt;Google\u0026lt;/s:a\u0026gt;\u003c/pre\u003e \n\u003cdiv\u003e\n 在本教程中,它顯示了3種方式來使用Struts2\u0026nbsp;\u0026lt;s:a\u0026gt;標籤。 \n\u003c/div\u003e \n\u003ch2\u003e 1. 動作 \u003c/h2\u003e \n\u003cdiv\u003e\n Action類轉發請求。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eATagAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class ATagAction extends ActionSupport{\r\n\t\r\n\tpublic String execute() {\r\n\t\treturn SUCCESS;\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. \u0026lt;s:a\u0026gt;標籤示例 \u003c/h2\u003e \n\u003cdiv\u003e\n JSP頁面顯示使用「\u0026lt;s:a\u0026gt;」標籤,以不同的方式呈現 URL \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003ea.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n \u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\u0026lt;title\u0026gt;Struts2 \u0026lt;s:a\u0026gt;標籤示例\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2 a tag example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;ol\u0026gt;\r\n\r\n\u0026lt;li\u0026gt;\r\n\u0026lt;s:url value=\"http://www.yiibai.com\" var=\"yiibaiURL\" /\u0026gt;\r\n\u0026lt;s:a href=\"%{yiibaiURL}\"\u0026gt;J2EE web development tutorials\u0026lt;/s:a\u0026gt;\r\n\u0026lt;/li\u0026gt;\r\n\r\n\u0026lt;li\u0026gt;\r\n\u0026lt;s:a href=\"http://www.google.com\"\u0026gt;Google search engine\u0026lt;/s:a\u0026gt;\r\n\u0026lt;/li\u0026gt;\r\n\r\n\u0026lt;li\u0026gt;\r\n\u0026lt;s:url action=\"aTagAction.action\" var=\"aURL\" /\u0026gt;\r\n\u0026lt;s:a href=\"%{aURL}\"\u0026gt;aTagAction\u0026lt;/s:a\u0026gt;\r\n\u0026lt;/li\u0026gt;\r\n\r\n\u0026lt;/ol\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\t\u0026lt;action name=\"aTagAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.aTagAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;pages/a.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cdiv\u003e \n \u003ca href=\"http://localhost:8080/struts2atag/aTagAction.action\"\u003ehttp://localhost:8080/struts2atag/aTagAction.action\u003c/a\u003e \n\u003c/div\u003e \n\u003cp\u003e 在瀏覽器中打開上述標籤,將顯示結果如下: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/a-1.png\" alt=\"Struts2 \u003cs:a\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003cp\u003e 輸出HTML源碼如下: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;html\u0026gt; \r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt; \r\n\u0026lt;body\u0026gt; \r\n\u0026lt;h1\u0026gt;Struts2 \u0026lt;s:a\u0026gt;標籤示例\u0026lt;/h1\u0026gt; \r\n \r\n\u0026lt;ol\u0026gt; \r\n\u0026lt;li\u0026gt; \r\n\u0026lt;a href=\"http://www.yiibai.com\"\u0026gt;J2EE web development tutorials\u0026lt;/a\u0026gt; \r\n\u0026lt;/li\u0026gt; \r\n \r\n\u0026lt;li\u0026gt; \r\n\u0026lt;a href=\"http://www.google.com\"\u0026gt;Google search engine\u0026lt;/a\u0026gt; \r\n\u0026lt;/li\u0026gt; \r\n \r\n\u0026lt;li\u0026gt; \r\n\u0026lt;a href=\"/struts2atag/aTagAction.action\"\u0026gt;aTagAction\u0026lt;/a\u0026gt; \r\n\u0026lt;/li\u0026gt; \r\n\u0026lt;/ol\u0026gt; \r\n \r\n\u0026lt;/body\u0026gt; \r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/a.html\"\u003eStruts2 \u0026lt;s:a\u0026gt;標籤文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e 代碼下載 -\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1sjzOkYL\"\u003ehttp://pan.baidu.com/s/1sjzOkYL\u003c/a\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"66:T1293,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e\n Struts2 的「action」標籤是用來直接從JSP頁面中調用Action類。如果「executeResult」屬性設置爲true,則結果頁的內容將直接在當前網頁渲染。 \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cdiv\u003e\n 這是用一個完整的例子很好地說明: \n\u003c/div\u003e \n\u003ch2\u003e 1. 動作 \u003c/h2\u003e \n\u003cdiv\u003e\n Action類有幾個方法用來轉發不同結果的結果頁面。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eParamTagAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class ActionTagAction extends ActionSupport{\r\n\t\r\n\tpublic String execute() {\r\n\t\treturn SUCCESS;\r\n\t}\r\n\t\r\n\tpublic String sayHello(){\r\n\t\treturn \"sayHello\";\r\n\t}\r\n\t\r\n\tpublic String sayStruts2(){\r\n\t\treturn \"sayStruts2\";\r\n\t}\r\n\t\r\n\tpublic String saySysOut(){\r\n\t\tSystem.out.println(\"SysOut SysOut SysOut\");\r\n\t\treturn \"saySysOut\";\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. \u0026lt;s:action\u0026gt;標籤示例 \u003c/h2\u003e \n\u003cp\u003e 下面的JSP頁面顯示如何使用「action」標籤。如果\u0026nbsp;executeResult=」true」,動作標籤被指定方法執行且結果頁面將直接顯示;\u0026nbsp;否則,它只是執行的方法,結果頁面不會顯示出來。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eaction.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\u0026lt;title\u0026gt;struts2 action標籤示例\u0026lt;title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2 action標籤示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;ol\u0026gt;\r\n\r\n\u0026lt;li\u0026gt;\r\nExecute the action's result, render the page here. \r\n\u0026lt;s:action name=\"sayHelloAction\" executeResult=\"true\"/\u0026gt;\r\n\u0026lt;/li\u0026gt;\r\n\r\n\u0026lt;li\u0026gt;\r\nDoing the same as above, but call action's sayStruts2() method. \r\n\u0026lt;s:action name=\"sayHelloAction!sayStruts2\" executeResult=\"true\"/\u0026gt;\r\n\u0026lt;/li\u0026gt;\r\n\r\n\u0026lt;li\u0026gt;\r\nCall the action's saySysOut() method only, no result will be rendered,\r\nBy defautlt, executeResult=\"false\". \r\n\u0026lt;s:action name=\"sayHelloAction!saySysOut\" /\u0026gt;\r\n\u0026lt;/li\u0026gt;\r\n\r\n\u0026lt;/ol\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003esayHello.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;div\u0026gt;\u0026lt;div class=\"ads-in-post hide_if_width_less_800\"\u0026gt;\r\n\u0026lt;script async src=\"//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\"\u0026gt;\u0026lt;/script\u0026gt;\r\n\u0026lt;!-- 728x90 - After2ndH4 --\u0026gt;\r\n\u0026lt;ins class=\"adsbygoogle hide_if_width_less_800\" \r\n style=\"display:inline-block;width:728px;height:90px\"\r\n data-ad-client=\"ca-pub-2836379775501347\"\r\n data-ad-slot=\"3642936086\"\r\n\t data-ad-region=\"yiibairegion\"\u0026gt;\u0026lt;/ins\u0026gt;\r\n\u0026lt;script\u0026gt;\r\n(adsbygoogle = window.adsbygoogle || []).push({});\r\n\u0026lt;/script\u0026gt;\r\n\u0026lt;/div\u0026gt;\u0026lt;/div\u0026gt;\u0026lt;h2\u0026gt;Hello Hello Hello ~ from sayHello.jsp\u0026lt;/h2\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003esayStruts2.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h2\u0026gt;Struts 2 Struts 2 Struts 2 ~ from sayStruts2.jsp\u0026lt;/h2\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003esaySysOut.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h2\u0026gt;SysOut SysOut SysOut ~ from saySysOut.jsp\u0026lt;/h2\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cdiv\u003e\n 聲明一些結果名稱來演示\u0026nbsp;ExecuteReuslt\u0026nbsp;的效果。 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\u0026lt;action name=\"actionTagAction\" \r\n\t\tclass=\"com.yiibai.common.action.ActionTagAction\" \u0026gt;\r\n\t\t\u0026lt;result name=\"success\"\u0026gt;pages/action.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;action name=\"sayHelloAction\" \r\n\t\tclass=\"com.yiibai.common.action.ActionTagAction\" \r\n method=\"sayHello\"\u0026gt;\r\n\r\n\t\t\u0026lt;result name=\"sayHello\"\u0026gt;sayHello.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;result name=\"sayStruts2\"\u0026gt;sayStruts2.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;result name=\"saySysOut\"\u0026gt;saySysOut.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n \u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e http://localhost:8080/struts2actiontag/actionTagAction.action \u003c/p\u003e \n\u003cp\u003e 在瀏覽器中打開上面的URL,顯示結果如下圖: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/action-1.png\" alt=\"Struts2 \u003cs:action\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/action.html\"\u003eStruts2 \u0026lt;s:action\u0026gt;標籤文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e 代碼下載 -\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1kT8NTUf\"\u003ehttp://pan.baidu.com/s/1kT8NTUf\u003c/a\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"67:Tbe0,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e \n \u003cspan\u003eStruts2的\u0026lt;s:bean\u0026gt;標籤用於在JSP頁面中實例化一個類。\u003c/span\u003e \n \u003cspan\u003e在本教程中,將使用\u0026lt;s:bean\u0026gt;標籤,以實例化一個\u0026nbsp;helloBean\u0026nbsp;的類,\u003c/span\u003e \n \u003cspan\u003e通過「param」元素設置其屬性,並打印出它的值。\u003c/span\u003e \n \u003c/div\u003e \n\u003c/div\u003e \n\u003ch2\u003e 1. 簡單Bean \u003c/h2\u003e \n\u003cdiv\u003e\n 一個簡單的類,後面使用bean標籤來實例化。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eHelloBean.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\npublic class HelloBean{\r\n\t\r\n\tprivate String msg;\r\n\r\n\tpublic String getMsg() {\r\n\t\treturn msg;\r\n\t}\r\n\r\n\tpublic void setMsg(String msg) {\r\n\t\tthis.msg = msg;\r\n\t}\r\n\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. 動作 - Action \u003c/h2\u003e \n\u003cdiv\u003e\n Action類轉發請求。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eBeanTagAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class BeanTagAction extends ActionSupport{\r\n\t\r\n\tpublic String execute() {\r\n\t\treturn SUCCESS;\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. \u0026lt;s:bean\u0026gt;標籤示例 \u003c/h2\u003e \n\u003cdiv\u003e\n 在這個JSP頁面將顯示如何使用\u0026lt;s:bean\u0026gt;標籤來實例化helloBean。 \n\u003c/div\u003e \n\u003cdiv\u003e\n 在\u0026lt;s:bean\u0026gt;標籤,可以通過\u0026nbsp;var\u0026nbsp;屬性分配一個Bean的名稱,以後可以通過\u0026nbsp;#var_bean_name\u0026nbsp;訪問這個 Bean, 或者通過\u0026nbsp;#var_bean_name.property 來訪問屬性。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003ebean.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n \u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2 \u0026lt;s:bean\u0026gt;標籤示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:bean name=\"com.yiibai.common.action.HelloBean\" var=\"hello\"\u0026gt;\r\n \u0026lt;s:param name=\"msg\"\u0026gt;Hello Bean Tag\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:bean\u0026gt;\r\n\r\nThe HelloBean's msg property value : \u0026lt;s:property value=\"#hello.msg\"/\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\u0026lt;action name=\"beanTagAction\" \r\n\t class=\"com.yiibai.common.action.BeanTagAction\" \u0026gt;\r\n\t \u0026lt;result name=\"success\"\u0026gt;pages/bean.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n \u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e \u003ca href=\"http://localhost:8080/struts2beantag/beanTagAction.action\"\u003ehttp://localhost:8080/struts2beantag/beanTagAction.action\u003c/a\u003e \u003c/p\u003e \n\u003cp\u003e 在瀏覽器中打開上面的網址,結果如下所示: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/bean-1.png\" alt=\"Struts2 \u003cs:bean\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/bean.html\"\u003eStruts2 \u0026lt;s:bean\u0026gt;標籤文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e 代碼下載 -\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1jGJFv86\"\u003ehttp://pan.baidu.com/s/1jGJFv86\u003c/a\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"68:Tdf2,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n Struts2\u0026nbsp;的\u0026lt;s:date\u0026gt;標籤用於格式化Date對象,它有兩種方法: \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003col\u003e \n \u003cli\u003e 自定義格式 (如:yyyy-MM-dd) \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 「nice」屬性來格式化日期到一個易於閱讀的符號,如,「此日期162天前」。 \n \u003c/div\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv\u003e\n 在本教程中,它顯示瞭如何使用\u0026nbsp;Struts2\u0026nbsp;的\u0026lt;s:date\u0026gt;標籤,以Date對象格式化爲「自定義日期格式」和「易讀取符號」。 \n\u003c/div\u003e \n\u003ch2\u003e 1. 動作 \u003c/h2\u003e \n\u003cdiv\u003e\n Action類轉發請求,並初始化一個Date對象有一個預定義的日期。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eDateTagAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.text.DateFormat;\r\nimport java.util.Calendar;\r\nimport java.util.Date;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class DateTagAction extends ActionSupport{\r\n\t\r\n\tpublic Date customDate;\r\n\t\r\n\tpublic String execute() {\r\n\t\t\r\n\t\tCalendar cal = Calendar.getInstance();\r\n\t\t//set date to january 31, 2010\r\n\t\tcal.set(2010, 0, 31);\r\n\t\tDate newDate = cal.getTime();\r\n\t\r\n\t\tsetCustomDate(newDate);\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t\t\r\n\t}\r\n\r\n\tpublic Date getCustomDate() {\r\n\t\treturn customDate;\r\n\t}\r\n\r\n\tpublic void setCustomDate(Date customDate) {\r\n\t\tthis.customDate = customDate;\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. \u0026lt;s:date\u0026gt;標籤示例 \u003c/h2\u003e \n\u003cdiv\u003e\n JSP頁面顯示使用\u0026lt;s:date\u0026gt;標籤格式化Date對象: \n\u003c/div\u003e \n\u003col\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 默認的日期格式 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e 自定義日期格式 \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 簡單易讀的符號 \n \u003c/div\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e \u003cstrong\u003edate.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n \u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\u0026lt;title\u0026gt;\u003cspan\u003eStruts2\u0026nbsp;\u0026lt;s:date\u0026gt;標籤示例 - www.yiibai.com\u0026lt;/title\u0026gt;\u003c/span\u003e \u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2 \u0026lt;s:date\u0026gt;標籤示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;ol\u0026gt;\r\n\r\n\u0026lt;li\u0026gt;\r\nDefault date format\r\n--\u0026gt; \u0026lt;strong\u0026gt;\u0026lt;s:date name=\"customDate\" /\u0026gt;\u0026lt;/strong\u0026gt;\r\n\u0026lt;/li\u0026gt;\r\n\r\n\u0026lt;li\u0026gt;\r\nDate format in \"yyyy-MM-dd\"\r\n--\u0026gt; \u0026lt;strong\u0026gt;\u0026lt;s:date name=\"customDate\" format=\"yyy-MM-dd\" /\u0026gt;\u0026lt;/strong\u0026gt;\r\n\u0026lt;/li\u0026gt;\r\n\r\n\u0026lt;li\u0026gt;\r\nIn Date tag, set the nice attribute to \"true\"\r\n--\u0026gt; \u0026lt;strong\u0026gt;\u0026lt;s:date name=\"customDate\" nice=\"true\" /\u0026gt;\u0026lt;/strong\u0026gt;\r\n\u0026lt;/li\u0026gt;\r\n\r\n\u0026lt;/ol\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\t\u0026lt;action name=\"dateTagAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.DateTagAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;/pages/date.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e http://localhost:8080/struts2datetag/dateTagAction.action \u003c/p\u003e \n\u003cp\u003e 在瀏覽器中打開上面的網址,顯示結果如下: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/date-1.png\" alt=\"Struts2 \u003cs:date\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/date.html\"\u003eStruts2 \u0026lt;s:date\u0026gt;標籤文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e 代碼下載 -\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1dDe7YLz\"\u003ehttp://pan.baidu.com/s/1dDe7YLz\u003c/a\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"69:Ta0e,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n 在Struts2在\u0026nbsp;\u0026lt;s:debug\u0026gt;\u0026nbsp;標籤是一個非常有用的調試標記輸出「值棧」的內容,並在網頁中「堆棧上下文」的詳細信息。在本教程,在JSP頁面中顯示如何使用\u0026lt;s:debug\u0026gt;標籤。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003ch2\u003e 1. 動作 \u003c/h2\u003e \n\u003cdiv\u003e\n 一個簡單的Action類,帶有\u0026nbsp;propertyInStack 屬性,顯示疊加後的值。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eDebugTagAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class DebugTagAction extends ActionSupport{\r\n\t\r\n\tpublic String propertyInStack;\r\n\r\n\tpublic String getPropertyInStack() {\r\n\t\treturn propertyInStack;\r\n\t}\r\n\r\n\tpublic void setPropertyInStack(String propertyInStack) {\r\n\t\tthis.propertyInStack = propertyInStack;\r\n\t}\r\n\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. \u0026lt;s:date\u0026gt;標籤示例 \u003c/h2\u003e \n\u003cdiv\u003e\n 在JSP頁面使用\u0026lt;s:debug\u0026gt;標籤輸出系統的「值棧」和「棧上下文」。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003edebug.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n \u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2 \u0026lt;s:debug\u0026gt;標籤示例 - www.yiibai.com\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:debug /\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 將生成一個名爲\u0026nbsp;debug\u0026nbsp;文字鏈接,點擊文字鏈接獲得調試的詳細信息。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\t\u0026lt;action name=\"debugTagAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.DebugTagAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;pages/debug.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e http://localhost:8080/struts2debugtag/debugTagAction.action \u003c/p\u003e \n\u003cp\u003e 在瀏覽器中打開上面的網址,輸出結果如下: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/debug-1.png\" alt=\"Struts2 \u003cs:debug\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/debug.html\"\u003eStruts2 \u0026lt;s:debug\u0026gt;標籤文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e 下載代碼 -\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1gdEvJGZ\"\u003ehttp://pan.baidu.com/s/1gdEvJGZ\u003c/a\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"6a:T97c,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e \n \u003cspan\u003eStruts2\u0026nbsp;\u0026lt;s:include\u0026gt;標籤用於直接包含JSP或HTML頁面到當前頁面。\u003c/span\u003e \n \u003cspan\u003e參見下面\u0026lt;s:include\u0026gt;標籤的例子。\u003c/span\u003e \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003c/p\u003e \n\u003ch2\u003e 1. 動作 \u003c/h2\u003e \n\u003cdiv\u003e\n 一個簡單的動作類只做轉發任務。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eIncludeTagAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class IncludeTagAction extends ActionSupport{\r\n\t\r\n\tpublic String execute() throws Exception {\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. \u0026lt;s:include\u0026gt;標籤示例 \u003c/h2\u003e \n\u003cdiv\u003e\n 它顯示了使用\u0026lt;s:include\u0026gt;標籤包括一個yiibai.jsp頁面到當前\u0026nbsp;include.jsp\u0026nbsp;頁面。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003einclude.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2 \u0026lt;s:include\u0026gt;標籤示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:include value=\"/pages/yiibai.jsp\"\u0026gt;\u0026lt;/s:include\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eyiibai.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;/div\u0026gt;\u0026lt;h2\u0026gt;Message from yiibai.jsp\u0026lt;/h2\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\t\u0026lt;action name=\"includeTagAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.IncludeTagAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;pages/include.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e http://localhost:8080/struts2includetag/includeTagAction.action \u003c/p\u003e \n\u003cp\u003e 在瀏覽器中訪問上面網址,結果輸出如下: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/include-1.png\" alt=\"Struts2 \u003cs:include\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003cp\u003e \u003c/p\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/include.htmll\"\u003eStruts2 \u0026lt;s:include\u0026gt;標籤文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e 代碼下載 -\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1i3Iv1rR\"\u003ehttp://pan.baidu.com/s/1i3Iv1rR\u003c/a\u003e \u003c/p\u003e \n\u003cp\u003e\u003c/p\u003e \n\u003cp\u003e\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"6b:Te69,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e \n \u003cspan\u003eStruts2\u0026nbsp;\u0026lt;s:i18n\u0026gt;標籤是用來從聲明的資源包獲得消息,\u003c/span\u003e \n \u003cspan\u003e\u0026nbsp;\u003c/span\u003e \n \u003cspan\u003e不只是使用當前操作相關聯的資源包。看下面一個完整的\u0026lt;s:i18n\u0026gt;標籤的例子:\u003c/span\u003e \n \u003c/div\u003e \n\u003c/div\u003e \n\u003ch2\u003e 1. 動作 \u003c/h2\u003e \n\u003cdiv\u003e\n Action類轉發請求。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eI18nTagAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class I18nTagAction extends ActionSupport{\r\n\r\n\tpublic String execute() throws Exception {\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. 屬性文件 \u003c/h2\u003e \n\u003cdiv\u003e\n 兩個屬性文件作爲演示。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eI18nTagAction.properties\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003ei18n.msg = \"This is a message from I18nTagAction.properties\"\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eCustom.properties\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003ei18n.msg = \"This is a message from Custom.properties\"\u003c/pre\u003e \n\u003ch2\u003e 3. \u0026lt;s:i18n\u0026gt;標籤示例 \u003c/h2\u003e \n\u003cp\u003e 下面顯示\u0026lt;s:i18n\u0026gt;標籤的使用。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003ei18n.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2 \u0026lt;s:i18n\u0026gt;標籤示例 - www.yiibai.com\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;1.Get message from I18nTagAction.properties\u0026lt;/h2\u0026gt; \r\nOutput : \r\n\u0026lt;s:text name=\"i18n.msg\" /\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;2.Get message from Custom.properties\u0026lt;/h2\u0026gt; \r\nOutput : \r\n\u0026lt;s:i18n name=\"com/yiibai/common/action/Custom\"\u0026gt;\r\n\t\u0026lt;s:text name=\"i18n.msg\" /\u0026gt;\r\n\u0026lt;/s:i18n\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 它是如何工作的? \u003c/p\u003e \n\u003cp\u003e 1.在示例1中,它會得到來自資源包的消息(I18nTagAction.properties)這是關想當前的操作類\u0026nbsp;(I18nTagAction.java) \u003c/p\u003e \n\u003cp\u003e 2.在例2中,它會從「Custom.properties」屬性的文件得到消息,這個文件放在\u0026nbsp;com/yiibai/common/action/\u0026nbsp;文件 \u003c/p\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 不要放 .properties 後綴 \n \u003c/div\u003e 一個常見的錯誤,在國際化的標籤,如果聲明屬性名爲.properties後綴的文件,在Struts2將未能從聲明的資源包獲得消息。 \n \u003cbr\u003e 錯誤的方式: \n \u003cbr\u003e \n \u003cpre\u003e\u0026lt;s:i18n name=\"com/yiibai/common/action/Custom.properties\"\u0026gt;\r\n\t\u0026lt;s:text name=\"i18n.msg\" /\u0026gt;\r\n\u0026lt;/s:i18n\u0026gt;\u003c/pre\u003e \n \u003cp\u003e \u003cstrong\u003e正確的方式\u003c/strong\u003e\u0026nbsp;: \u003c/p\u003e \n \u003cdiv\u003e\n 聲明的屬性文件沒有 .properties 後綴。 \n \u003c/div\u003e \n \u003cpre\u003e\u0026lt;s:i18n name=\"com/yiibai/common/action/Custom\"\u0026gt;\r\n\t\u0026lt;s:text name=\"i18n.msg\" /\u0026gt;\r\n\u0026lt;/s:i18n\u0026gt;\u003c/pre\u003e \n\u003c/div\u003e \n\u003ch2\u003e 4. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\t\u0026lt;action name=\"i18nTagAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.I18nTagAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;pages/i18n.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. 示例 \u003c/h2\u003e \n\u003cp\u003e http://localhost:8080/struts2i18ntag/i18nTagAction.action \u003c/p\u003e \n\u003cp\u003e 在瀏覽器中打開上面的URL,顯示結果如下: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/i18n-1.png\" alt=\"Struts2 \u003cs:i18n\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/i18n.html\"\u003eStruts2 \u0026lt;s:i18n\u0026gt;標籤文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv\u003e \n \u003cspan\u003e\u003cspan\u003e下載代碼 -\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1c0mHDlA\"\u003ehttp://pan.baidu.com/s/1c0mHDlA\u003c/a\u003e \u003c/span\u003e\u003c/span\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"6c:T1931,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e \n \u003cspan\u003eStruts2 \u0026lt;s:\u003c/span\u003e \n \u003cspan\u003eparam\u003c/span\u003e \n \u003cspan\u003e\u0026gt;\u003c/span\u003e \n \u003cspan\u003e標籤被用來參數化其他標籤。\u003c/span\u003e \n \u003cspan\u003e\u0026nbsp;\u003c/span\u003e \n \u003cspan\u003e但是,當稱明\u0026lt;s:param\u0026gt;標籤,「參數值」可以有兩種定義方式:\u003c/span\u003e \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003col\u003e \n \u003cli\u003e 「value」 屬性 \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n param標籤的開始和結束之間的文本 \n \u003c/div\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv\u003e\n 例如, \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;param name=\"fruit\"\u0026gt;Banana\u0026lt;/param\u0026gt; {Case 1}\r\n\u0026lt;param name=\"fruit\" value=\"Banana\"/\u0026gt; {Case 2}\u0026nbsp;\u003c/pre\u003e \n\u003cdiv\u003e\n 在Struts2中,都是表現一個完全不同的意義。\u0026nbsp;在「Case 1」中,\u0026nbsp;值被認爲是一個java.lang.String對象;\u0026nbsp;而在「Case 2」中,\u0026nbsp;值被認爲是一個 java.lang.Object\u0026nbsp;對象。 \n\u003c/div\u003e \n\u003cdiv\u003e\n 上述聲明用一些例子很好地說明: \n\u003c/div\u003e \n\u003ch2\u003e 示例1 \u003c/h2\u003e \n\u003cdiv\u003e\n 通過「param」標籤設置「字符串」值轉換到\u0026nbsp;bean屬性,必須這樣聲明 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;s:bean name=\"com.yiibai.common.Person\" var=\"personBean\"\u0026gt;\r\n\t\u0026lt;s:param name=\"nickName\"\u0026gt;yiibai\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:bean\u0026gt;\u003c/pre\u003e \n\u003cdiv\u003e\n 而不是 \n \u003cpre\u003e\u0026lt;s:bean name=\"com.yiibai.common.Person\" var=\"personBean\"\u0026gt;\r\n\t\u0026lt;s:param name=\"nickName\" value=\"yiibai\"\u0026gt;\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:bean\u0026gt;\u003c/pre\u003e \n \u003cdiv\u003e\n 如果你聲明「字符串」的值在「value」屬性中,Struts2 會忽略它。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003ch2\u003e 示例2 \u003c/h2\u003e \n\u003cdiv\u003e\n 通過\u0026lt;s:param\u0026gt;標籤設置\u0026nbsp;java.lang.Object\u0026nbsp;對象轉換成\u0026nbsp;bean\u0026nbsp;屬性,這樣聲明 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;s:bean name=\"com.yiibai.common.Fruit\" var=\"fruitBean\"\u0026gt;\r\n\t\u0026lt;s:param name=\"fruitName\"\u0026gt;Banana\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:bean\u0026gt;\r\n\r\n\u0026lt;s:bean name=\"com.yiibai.common.Person\" var=\"personBean\"\u0026gt;\r\n\t\u0026lt;s:param name=\"favorFruit\" value=\"#fruitBean\"\u0026gt;\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:bean\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 示例3 \u003c/h2\u003e \n\u003cdiv\u003e\n 對於基本類型,可以自由地在任何位置聲明它。 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;s:bean name=\"com.yiibai.common.Person\" var=\"personBean\"\u0026gt;\r\n\t\u0026lt;s:param name=\"age\" value=\"99\"\u0026gt;\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:bean\u0026gt;\r\n// or\r\n\u0026lt;s:bean name=\"com.yiibai.common.Person\" var=\"personBean\"\u0026gt;\r\n\t\u0026lt;s:param name=\"age\"\u0026gt;99\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:bean\u0026gt;\u0026nbsp;\u003c/pre\u003e \n\u003cdiv\u003e\n \u0026lt;s:param\u0026gt;標籤不僅是可用於bean標籤,它幾乎適用於所有需要參數化的標籤。 \n\u003c/div\u003e \n\u003cdiv\u003e\n 在Struts\u0026nbsp;2,\u0026lt;s:param\u0026gt;標籤是一個非常混亂的標籤,許多新的Struts2開發人員都可能會掉進這個陷阱,但不知道爲什麼一個簡單的「字符串」的setter方法是不行的。希望 Struts2 的團隊能夠在今後設計更加人性化的標籤。 \n\u003c/div\u003e \n\u003ch2\u003e Struts2 \u0026lt;s:param\u0026gt;標籤示例 \u003c/h2\u003e \n\u003cdiv\u003e\n 一個完整的Struts2\u0026nbsp;\u0026lt;s:param\u0026gt;標籤的例子。 \n\u003c/div\u003e \n\u003ch2\u003e 1. 動作 \u003c/h2\u003e \n\u003cdiv\u003e\n Action類轉發請求。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eParamTagAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class ParamTagAction extends ActionSupport{\r\n\t\r\n\tpublic String execute() {\r\n\t\treturn SUCCESS;\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. Bean \u003c/h2\u003e \n\u003cdiv\u003e\n 兩個Bean對象初始化在「param」標籤之後。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003ePerson.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common;\r\n\r\npublic class Person{\r\n\t\r\n\tprivate String nickName;\r\n\tprivate int age;\r\n\tprivate Fruit favorFruit;\r\n\t\r\n\tpublic String getNickName() {\r\n\t\treturn nickName;\r\n\t}\r\n\tpublic void setNickName(String nickName) {\r\n\t\tthis.nickName = nickName;\r\n\t}\r\n\tpublic int getAge() {\r\n\t\treturn age;\r\n\t}\r\n\tpublic void setAge(int age) {\r\n\t\tthis.age = age;\r\n\t}\r\n\tpublic Fruit getFavorFruit() {\r\n\t\treturn favorFruit;\r\n\t}\r\n\tpublic void setFavorFruit(Fruit favorFruit) {\r\n\t\tthis.favorFruit = favorFruit;\r\n\t}\r\n\t\r\n\tpublic String getFruitName(){\r\n\t\treturn this.favorFruit.getFruitName();\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eFruit.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common;\r\n\r\npublic class Fruit{\r\n\t\r\n\tprivate String fruitName;\r\n\r\n\tpublic String getFruitName() {\r\n\t\treturn fruitName;\r\n\t}\r\n\r\n\tpublic void setFruitName(String fruitName) {\r\n\t\tthis.fruitName = fruitName;\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 3. \u0026lt;s:param\u0026gt;標籤示例 \u003c/h2\u003e \n\u003cdiv\u003e\n JSP頁面顯示如何使用\u0026lt;s:param\u0026gt;標籤。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eparam.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n \u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 param tag example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:bean name=\"com.yiibai.common.Fruit\" var=\"fruitBean\"\u0026gt;\r\n\t\u0026lt;s:param name=\"fruitName\"\u0026gt;Banana\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:bean\u0026gt;\r\n\r\n\u0026lt;s:bean name=\"com.yiibai.common.Person\" var=\"personBean\"\u0026gt;\r\n\t\u0026lt;s:param name=\"nickName\"\u0026gt;ah pig ah dog\u0026lt;/s:param\u0026gt;\r\n\t\u0026lt;s:param name=\"age\"\u0026gt;99\u0026lt;/s:param\u0026gt;\r\n\t\u0026lt;s:param name=\"favorFruit\" value=\"#fruitBean\"\u0026gt;\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:bean\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;PersonBean\u0026lt;/h2\u0026gt;\r\n\u0026lt;ol\u0026gt;\r\n\u0026lt;li\u0026gt;NickName property : \u0026lt;s:property value=\"#personBean.nickName\" /\u0026gt;\u0026lt;/li\u0026gt;\r\n\u0026lt;li\u0026gt;Age property : \u0026lt;s:property value=\"#personBean.age\" /\u0026gt;\u0026lt;/li\u0026gt;\r\n\u0026lt;li\u0026gt;Fruit property : \u0026lt;s:property value=\"#personBean.fruitName\" /\u0026gt;\u0026lt;/li\u0026gt;\r\n\u0026lt;/ol\u0026gt;\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\t\u0026lt;action name=\"paramTagAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.ParamTagAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;pages/param.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. 示例 \u003c/h2\u003e \n\u003cp\u003e http://localhost:8080/struts2paramtag/paramTagAction.action \u003c/p\u003e \n\u003cp\u003e 在瀏覽中打上面的網址,訪問後顯示結果如下: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/param-1.png\" alt=\"Struts2 \u003cs:param\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/param.html\"\u003eStruts2 \u0026lt;s:param\u0026gt;標籤文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv\u003e \n \u003cspan\u003e\u003cspan\u003e代碼下載 -\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1pJreREj\"\u003ehttp://pan.baidu.com/s/1pJreREj\u003c/a\u003e \u003c/span\u003e\u003c/span\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"6d:Tcc1,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n Struts2的\u0026lt;s:property\u0026gt;標籤是用來從一個類獲得屬性值,如果沒有指定,這將默認爲當前Action類(堆棧的頂部)屬性。在本教程中,它展示瞭如何使用\u0026nbsp;\u0026lt;s:property\u0026gt;\u0026nbsp;標籤,以從目前Action類獲得其他bean類的屬性值。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003ch2\u003e 1. 動作類 \u003c/h2\u003e \n\u003cdiv\u003e\n 這裏有一個Action類,有一個\u0026nbsp;name\u0026nbsp;屬性。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003ePropertyTagAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class PropertyTagAction extends ActionSupport{\r\n\t\r\n\tprivate String name = \"Name from PropertyTagAction.java\"; \r\n\t\r\n\tpublic String getName() {\r\n\t\treturn name;\r\n\t}\r\n\r\n\tpublic String execute() throws Exception {\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. Bean \u003c/h2\u003e \n\u003cdiv\u003e\n 一個簡單的Java類,它有一個\u0026nbsp;name\u0026nbsp;屬性。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003ePerson.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common;\r\n\r\npublic class Person {\r\n\t\r\n\tprivate String name = \"Name from Person.java\"; \r\n\t\r\n\tpublic String getName() {\r\n\t\treturn name;\r\n\t}\r\n\r\n}\u003c/pre\u003e \n\u003ch2\u003e 3. \u0026lt;s:property\u0026gt;標籤示例 \u003c/h2\u003e \n\u003cdiv\u003e\n 它展示瞭如何使用\u0026lt;s:property\u0026gt;標籤,從PropertyTagAction與「Person」類獲得name屬性值。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eproperty.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 property tag example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;1. Call getName() from propertyTagAction.java\u0026lt;/h2\u0026gt; \r\n\u0026lt;s:property value=\"name\" /\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;2. Call getName() from Person.java\u0026lt;/h2\u0026gt; \r\n\u0026lt;s:bean name=\"com.yiibai.common.Person\" var=\"personBean\" /\u0026gt;\r\n\u0026lt;s:property value=\"#personBean.name\" /\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u0026nbsp;\u003c/pre\u003e \n\u003cdiv\u003e\n 「property.jsp」頁面是「PropertyTagAction」動作返回一個成功的結果頁面。如果指定了\u0026lt;s:property\u0026nbsp;value=」name」\u0026nbsp;/\u0026gt;在「property.jsp」頁面,默認爲當前的Action類「PropertyTagAction.getName()」屬性。 \n\u003c/div\u003e \n\u003ch2\u003e 4. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\t\u0026lt;action name=\"propertyTagAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.PropertyTagAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;pages/property.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. 示例 \u003c/h2\u003e \n\u003cp\u003e http://localhost:8080/struts2propertytag/propertyTagAction.action \u003c/p\u003e \n\u003cp\u003e 在瀏覽器中打開上面的URL,顯示結果如下: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/property-1.png\" alt=\"Struts2 \u003cs:property\u003e標籤實例\"\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/property.html\"\u003eStruts2 \u0026lt;s:property\u0026gt;標籤文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e 代碼下載 -\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1t7m2M\"\u003ehttp://pan.baidu.com/s/1t7m2M\u003c/a\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"6e:Td88,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n Struts2\u0026nbsp;\u0026lt;s:push\u0026gt;標籤被用來將值推到堆棧的頂部,以便它可以容易地訪問或參考。看到一個完整的\u0026lt;s:push\u0026gt;標記示例: \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003c/p\u003e \n\u003ch2\u003e 1. 動作 \u003c/h2\u003e \n\u003cdiv\u003e\n Action類只轉發請求。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003ePushTagAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class PushTagAction extends ActionSupport{\r\n\r\n\tpublic String execute() throws Exception {\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. Bean \u003c/h2\u003e \n\u003cdiv\u003e\n 一個簡單的Person類,將它推入堆棧以便於訪問。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003ePerson.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common;\r\n\r\npublic class Person{\r\n\r\n\tprivate String firstName = \"This is firstName\";\r\n\tprivate String lastName = \"This is lastName\";\r\n\t\r\n\tpublic String getFirstName() {\r\n\t\treturn firstName;\r\n\t}\r\n\tpublic String getLastName() {\r\n\t\treturn lastName;\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 3. \u0026lt;s:push\u0026gt;標籤示例 \u003c/h2\u003e \n\u003cdiv\u003e\n 它顯示了使用\u0026lt;s:push\u0026gt;標籤。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003epush.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 push tag example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;1. Normal way\u0026lt;/h2\u0026gt;\r\n\u0026lt;s:bean name=\"com.yiibai.common.Person\" var=\"personBean\" /\u0026gt;\r\nFirst name : \u0026lt;s:property value=\"#personBean.firstName\" /\u0026gt;\u0026lt;br/\u0026gt;\r\nLast name: \u0026lt;s:property value=\"#personBean.lastName\" /\u0026gt;\u0026lt;br/\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;2. Push way\u0026lt;/h2\u0026gt;\r\n\u0026lt;s:push value=\"#personBean\" \u0026gt;\r\nFirst name : \u0026lt;s:property value=\"firstName\" /\u0026gt;\u0026lt;br/\u0026gt;\r\nLast name: \u0026lt;s:property value=\"lastName\" /\u0026gt;\u0026lt;br/\u0026gt;\r\n\u0026lt;/s:push\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 它是如何工作的? \u003c/p\u003e \n\u003cp\u003e 通常情況下,如果你想獲得bean的屬性,可以參考它,如\u0026nbsp;\u0026lt;s:property value=」#personBean.firstName」 /\u0026gt;。使用 \u0026lt;s:push\u0026gt;標籤,\u0026nbsp;可以推「#personBean」到堆棧的頂部,並直接訪問屬性\u0026nbsp;\u0026lt;s:property value=」firstName」 /\u0026gt;。兩者都返回相同的結果,但使用不同的接入機制。 \u003c/p\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n \u0026lt;s:push\u0026gt;標籤節省鍵入幾個字符,看不出有什麼真正的值在後面。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003ch2\u003e 4. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\t\u0026lt;action name=\"pushTagAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.PushTagAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;pages/push.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. 執行結果 \u003c/h2\u003e \n\u003cp\u003e http://localhost:8080/struts2pushtag/pushTagAction.action \u003c/p\u003e \n\u003cp\u003e 在瀏覽器中打開上面的網址,顯示結果如下: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/push-1.png\" alt=\"Struts2 \u003cs:push\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/push.html\"\u003eStruts2 \u0026lt;s:push\u0026gt;標籤文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv\u003e \n \u003cspan\u003e\u003cspan\u003e下載代碼 -\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1o6Eh5TS\"\u003ehttp://pan.baidu.com/s/1o6Eh5TS\u003c/a\u003e \u003c/span\u003e\u003c/span\u003e \n\u003c/div\u003e \n\u003cp\u003e\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"6f:T109d,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n Struts2\u0026nbsp;\u0026lt;s:set\u0026gt;標籤用於分配值在指定範圍內的變量(應用,會話,請求,頁面,或動作),默認的範圍是動作。下面來看一個完整的\u0026lt;s:set\u0026gt;標籤的例子: \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 「value」是指任何硬編碼字符串,屬性值或是任何可以參考的東西。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003ch2\u003e 1. 動作 \u003c/h2\u003e \n\u003cdiv\u003e\n Action類有\u0026nbsp;「msg」\u0026nbsp;屬性。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eSetTagAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class SetTagAction extends ActionSupport{\r\n\r\n\tprivate String msg = \"Struts 2 is a funny framework\";\r\n\t\r\n\tpublic String getMsg() {\r\n\t\treturn msg;\r\n\t}\r\n\r\n\tpublic String execute() throws Exception {\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. \u0026lt;s:set\u0026gt;標籤示例 \u003c/h2\u003e \n\u003cdiv\u003e\n 它展示瞭如何使用\u0026lt;s:set\u0026gt;標籤。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eset.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\u0026lt;title\u0026gt;www.yiibai.com\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 set tag example\u0026lt;/h1\u0026gt;\r\n\u0026lt;div\u0026gt;\u0026lt;div class=\"ads-in-post hide_if_width_less_800\"\u0026gt;\r\n\u0026lt;script async src=\"//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\"\u0026gt;\u0026lt;/script\u0026gt;\r\n\u0026lt;!-- 728x90 - After2ndH4 --\u0026gt;\r\n\u0026lt;ins class=\"adsbygoogle hide_if_width_less_800\" \r\n style=\"display:inline-block;width:728px;height:90px\"\r\n data-ad-client=\"ca-pub-2836379775501347\"\r\n data-ad-slot=\"3642936086\"\r\n\t data-ad-region=\"yiibairegion\"\u0026gt;\u0026lt;/ins\u0026gt;\r\n\u0026lt;script\u0026gt;\r\n(adsbygoogle = window.adsbygoogle || []).push({});\r\n\u0026lt;/script\u0026gt;\r\n\u0026lt;/div\u0026gt;\u0026lt;/div\u0026gt;\u0026lt;h2\u0026gt;1. \u0026lt;s:set var=\"varMsg\" value=\"msg\" /\u0026gt;\u0026lt;/h2\u0026gt;\r\n\r\n\u0026lt;s:set var=\"varMsg\" value=\"msg\" /\u0026gt;\r\n\u0026lt;s:property value=\"varMsg\" /\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;2. \u0026lt;s:set var=\"varUrl\" value=\"%{'http://www.yiibai.com'}\" /\u0026gt;\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;s:set var=\"varUrl\" value=\"%{'http://www.yiibai.com'}\" /\u0026gt;\r\n\u0026lt;s:property value=\"varUrl\" /\u0026gt;\r\n\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003e它是如何工作的?\u003c/strong\u003e \u003c/p\u003e \n\u003cp\u003e 1. \u0026lt;s:set var=」varMsg」 value=」msg」 /\u0026gt; \u003c/p\u003e \n\u003cp\u003e 調用動作的\u0026nbsp;getMsg()方法返回的值賦給變量名爲\u0026nbsp;「varMsg「. \u003c/p\u003e \n\u003cp\u003e 2. \u0026lt;s:set var=」varUrl」 value=」%{‘http://www.yiibai.com’}」 /\u0026gt; \u003c/p\u003e \n\u003cp\u003e 硬編碼字符串,並將其分配給一個名爲變量\u0026nbsp;「varUrl「. \u003c/p\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 賦值給一個變量,而不是屬性值。 \n \u003c/div\u003e \n \u003cp\u003e 例如, \u003c/p\u003e \n \u003cpre\u003epublic class SetTagAction extends ActionSupport{\r\n\r\n\tprivate String msg;\r\n\t\r\n\tpublic String setMsg(String msg) {\r\n\t\tthis.msg = msg;\r\n\t}\r\n\t...\u003c/pre\u003e \n \u003cpre\u003e\u0026lt;s:set var=\"msg\" value=\"%{'this is a message'}\" /\u0026gt;\u003c/pre\u003e \n \u003cdiv\u003e\n 許多Struts\u0026nbsp;2的開發者認爲,\u0026lt;s:set\u0026gt;標籤\u0026nbsp;var=「smsg」,將通過指定setMsg()方法將值相關的動作類。 \n \u003c/div\u003e \n \u003cp\u003e 這是錯誤的,\u0026lt;s:set\u0026gt;標籤將不會調用setMsg()方法,它只會以名爲「msg」分配「value」到變量。沒有動作屬性值。 \u003c/p\u003e \n\u003c/div\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\t\u0026lt;action name=\"setTagAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.SetTagAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;pages/set.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. 示例 \u003c/h2\u003e \n\u003cp\u003e http://localhost:8080/struts2settag/setTagAction.action \u003c/p\u003e \n\u003cp\u003e 在瀏覽器中打開上面的網址,輸出結果如下: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/set-1.png\" alt=\"Struts2 \u003cs:set\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/set.html\"\u003eStruts2 \u0026lt;s:set\u0026gt;標籤文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e 代碼下載 -\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1mgs6Tle\"\u003ehttp://pan.baidu.com/s/1mgs6Tle\u003c/a\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"70:T1018,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e\n Struts2\u0026nbsp;\u0026lt;s:text\u0026gt;標籤是用來從資源包獲取捆綁動作類的消息。並按照三個序列: \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003col\u003e \n \u003cli\u003e 顯示來自資源包的消息,按照Struts2的資源包搜索順序。 \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 如果未在資源包中找到消息,則標籤的本身會被顯示。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 如果標記的主體是空的,在\u0026lt;s:text\u0026gt;標籤「name」屬性的值將被顯示。 \n \u003c/div\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv\u003e\n 一個完整的例子: \n\u003c/div\u003e \n\u003ch2\u003e 1. 動作 \u003c/h2\u003e \n\u003cdiv\u003e\n Action類轉發請求。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eTextTagAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class TextTagAction extends ActionSupport{\r\n\r\n\tpublic String execute() throws Exception {\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2.\u0026nbsp;屬性文件 \u003c/h2\u003e \n\u003cdiv\u003e\n 一個簡單的屬性文件有兩個鍵「name.msg」和「name.msg.param」。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eTextTagAction.properies\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003ename.msg = \"This is a message from properties file\"\r\nname.msg.param = \"This is a message from properties file - param : {0}\"\u003c/pre\u003e \n\u003ch2\u003e 3. \u0026lt;s:text\u0026gt;標籤示例 \u003c/h2\u003e \n\u003cdiv\u003e\n 它顯示了\u0026lt;s:text\u0026gt;標籤的使用。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003etext.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\u0026lt;title\u0026gt;www.yiibai.com\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2 text標籤示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;1.\u0026lt;s:text name=\"name.msg\" /\u0026gt;\u0026lt;/h2\u0026gt; \r\nOutput : \u0026lt;s:text name=\"name.msg\" /\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;2. \u0026lt;s:text name=\"name.msg.unknow\"\u0026gt;message doesn't exists\u0026lt;/s:text\u0026gt;\u0026lt;/h2\u0026gt; \r\nOutput : \u0026lt;s:text name=\"name.msg.unknow\"\u0026gt;message doesn't exists\u0026lt;/s:text\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;3. \u0026lt;s:text name=\"name.msg.unknow\" /\u0026gt;\u0026lt;/h2\u0026gt; \r\nOutput : \u0026lt;s:text name=\"name.msg.unknow\" /\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;4. \u0026lt;s:text name=\"name.msg.param\" \u0026gt;\u0026lt;s:param \u0026gt;yiibai\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:text\u0026gt;\u0026lt;/h2\u0026gt; \r\nOutput :\r\n\u0026lt;s:text name=\"name.msg.param\" \u0026gt;\r\n\t\u0026lt;s:param \u0026gt;yiibai\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:text\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003e它是如何工作的?\u003c/strong\u003e\u003cbr\u003e 1. \u0026lt;s:text name=」name.msg」 /\u0026gt; \u003c/p\u003e \n\u003cp\u003e 從資源包獲取並顯示消息(TextTagAction.properies)關聯當前動作類\u0026nbsp;(TextTagAction.action). \u003c/p\u003e \n\u003cpre\u003e\"This is a message from properties file\"\u003c/pre\u003e \n\u003cp\u003e 2. \u0026lt;s:text name=」name.msg.unknow」\u0026gt;message doesn’t exists\u0026lt;/s:text\u0026gt; \u003c/p\u003e \n\u003cdiv\u003e\n 鍵不在資源包「TextTagAction.properies」或搜索順序中,所以顯示標記的主體。 \n\u003c/div\u003e \n\u003cpre\u003emessage doesn't exists\u003c/pre\u003e \n\u003cp\u003e 3. \u0026lt;s:text name=」name.msg.unknow」 /\u0026gt; \u003c/p\u003e \n\u003cdiv\u003e\n 標籤的資源包和主體的消息未找到,所以顯示在「name」屬性的值。 \n\u003c/div\u003e \n\u003cpre\u003ename.msg.unknow\u003c/pre\u003e \n\u003cp\u003e 4. \u0026lt;s:text name=」name.msg.param」 \u0026gt;\u0026lt;s:param \u0026gt;yiibai\u0026lt;/s:param\u0026gt;\u0026lt;/s:text\u0026gt; \u003c/p\u003e \n\u003cdiv\u003e\n 通過\u0026lt;s:param\u0026gt;標記傳遞參數到資源包。 \n\u003c/div\u003e \n\u003cpre\u003e\"This is a message from properties file - param : yiibai\"\u003c/pre\u003e \n\u003ch2\u003e 4. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\t\u0026lt;action name=\"textTagAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.TextTagAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;/pages/text.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. 執行結果 \u003c/h2\u003e \n\u003cp\u003e http://localhost:8080/struts2texttag/textTagAction.action \u003c/p\u003e \n\u003cp\u003e 在瀏覽器中打開上面的網址,顯示結果如下所示: \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/text.html\"\u003eStruts2 \u0026lt;s:text\u0026gt;標籤文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cdiv\u003e\n 下載代碼 -\u0026nbsp; \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"71:T13dd,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n Struts2\u0026nbsp;\u0026lt;s:url\u0026gt;標籤被用來創建一個URL,並輸出它作爲文本格式。它從不通過自己的工作,但它可以提供URL鏈接到其他標籤,如\u0026lt;s:a\u0026gt;創建超鏈接或\u0026lt;img\u0026gt;渲染圖像。在本教程中,它顯示 Struts2\u0026nbsp;\u0026lt;s:url\u0026gt;標籤的5種常見用法。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003ch2\u003e 1. 動作 \u003c/h2\u003e \n\u003cdiv\u003e\n Action類轉發請求。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eURLTagAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class URLTagAction extends ActionSupport{\r\n\t\r\n\tpublic String execute() {\r\n\t\treturn SUCCESS;\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. \u0026lt;s:url\u0026gt;標籤示例 \u003c/h2\u003e \n\u003cdiv\u003e\n 這裏舉5個例子來說明如何使用Struts2\u0026nbsp;\u0026lt;s:url\u0026gt;\u0026nbsp;標籤。 \n\u003c/div\u003e \n\u003col\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 創建圖片URL。 \n \u003c/div\u003e \u003cpre\u003e\u0026lt;img src=\"\u0026lt;s:url value=\"/images/man.jpg\"/\u0026gt;\" /\u0026gt;\u003c/pre\u003e \n \u003cdiv\u003e\n 輸出(假設根上下文名稱爲「Struts2Example」) \n \u003c/div\u003e \u003cpre\u003e\u0026lt;img src=\"/Struts2Example/images/man.jpg\" /\u0026gt;\u003c/pre\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 創建一個「Google」文字,並將其鏈接到 \n \u003ca href=\"http://www.google.com/\"\u003ehttp://www.google.com\u003c/a\u003e。 \n \u003c/div\u003e \u003cpre\u003e\u0026lt;a href=\"\u0026lt;s:url value=\"http://www.google.com\" /\u0026gt;\" target=\"_blank\"\u0026gt;Google\u0026lt;/a\u0026gt;\u003c/pre\u003e \u003cp\u003e 輸出 \u003c/p\u003e \u003cpre\u003e\u0026lt;a href=\"http://www.google.com\" target=\"_blank\"\u0026gt;Google\u0026lt;/a\u0026gt; \u0026nbsp;\u003c/pre\u003e \n \u003cdiv\u003e\n 當以「http」或「www」字符開始定義URL值,在Struts\u0026nbsp;2將呈現它,因爲它是不增加額外的根上下文的域名爲example1。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 創建操作URL以「id」參數,並輸出它作爲文本格式。 \n \u003c/div\u003e \u003cpre\u003e\u0026lt;s:url action=\"urlTagAction.action\" \u0026gt;\r\n \u0026lt;s:param name=\"id\"\u0026gt;123\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:url\u0026gt;\u003c/pre\u003e \u003cp\u003e 輸出 \u003c/p\u003e \u003cpre\u003e/Struts2Example/urlTagAction.action?id=123\u003c/pre\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 使用「name」參數來創建操作URL,並用\u0026lt;s:a\u0026gt;組合通過\u0026lt;s:property\u0026gt;標籤。 \n \u003c/div\u003e \u003cpre\u003e\u0026lt;s:url action=\"urlTagAction.action\" var=\"urlTag\" \u0026gt;\r\n \u0026lt;s:param name=\"name\"\u0026gt;yiibai\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:url\u0026gt;\r\n\u0026lt;a href=\"\u0026lt;s:property value=\"#urlTag\" /\u0026gt;\" \u0026gt;URL Tag Action (via property)\u0026lt;/a\u0026gt;\u003c/pre\u003e \u003cp\u003e 輸出 \u003c/p\u003e \u003cpre\u003e\u0026lt;a href=\"/Struts2Example/urlTagAction.action?name=yiibai\" \u0026gt;URL Tag Action (via property)\u0026lt;/a\u0026gt;\u003c/pre\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 使用 「age」 參數創建操作URL,並用\u0026lt;s:a\u0026gt;通過組合「%{urlTag}標記。 \n \u003c/div\u003e \u003cpre\u003e\u0026lt;s:url action=\"urlTagAction.action\" var=\"urlTag\" \u0026gt;\r\n \u0026lt;s:param name=\"age\"\u0026gt;99\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:url\u0026gt;\r\n\u0026lt;s:a href=\"%{urlTag}\"\u0026gt;URL Tag Action (via %)\u0026lt;/s:a\u0026gt;\u003c/pre\u003e \u003cp\u003e 輸出 \u003c/p\u003e \u003cpre\u003e\u0026lt;a href=\"/Struts2Example/urlTagAction.action?age=99\"\u0026gt;URL Tag Action (via %)\u0026lt;/a\u0026gt;\u003c/pre\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e 全部的JSP代碼 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eurl.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n \u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 URL tag example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;ol\u0026gt;\r\n\u0026lt;li\u0026gt;\r\n\u0026lt;img src=\"\u0026lt;s:url value=\"/images/man.jpg\"/\u0026gt;\" /\u0026gt;\r\n\u0026lt;/li\u0026gt;\r\n\r\n\u0026lt;li\u0026gt;\r\n\u0026lt;a href=\"\u0026lt;s:url value=\"http://www.google.com\" /\u0026gt;\" target=\"_blank\"\u0026gt;Google\u0026lt;/a\u0026gt;\r\n\u0026lt;/li\u0026gt;\r\n\r\n\u0026lt;li\u0026gt;\r\n\u0026lt;s:url action=\"urlTagAction.action\" \u0026gt;\r\n \u0026lt;s:param name=\"id\"\u0026gt;123\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:url\u0026gt;\r\n\u0026lt;/li\u0026gt;\r\n\r\n\u0026lt;li\u0026gt;\r\n\u0026lt;s:url action=\"urlTagAction.action\" var=\"urlTag\" \u0026gt;\r\n \u0026lt;s:param name=\"name\"\u0026gt;yiibai\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:url\u0026gt;\r\n\u0026lt;a href=\"\u0026lt;s:property value=\"#urlTag\" /\u0026gt;\" \u0026gt;URL Tag Action (via property)\u0026lt;/a\u0026gt;\r\n\u0026lt;/li\u0026gt;\r\n\r\n\u0026lt;li\u0026gt;\r\n\u0026lt;s:url action=\"urlTagAction.action\" var=\"urlTag\" \u0026gt;\r\n \u0026lt;s:param name=\"age\"\u0026gt;99\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:url\u0026gt;\r\n\u0026lt;s:a href=\"%{urlTag}\"\u0026gt;URL Tag Action (via %)\u0026lt;/s:a\u0026gt;\r\n\u0026lt;/li\u0026gt;\r\n\r\n\u0026lt;/ol\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\u0026lt;action name=\"urlTagAction\" \r\n\t\tclass=\"com.yiibai.common.action.URLTagAction\" \u0026gt;\r\n\t\t\u0026lt;result name=\"success\"\u0026gt;/pages/url.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n \u0026lt;/package\u0026gt;\t\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e http://localhost:8080/struts2urltag/urlTagAction.action \u003c/p\u003e \n\u003cp\u003e 在瀏覽器中打上面的網址,它顯示結果如下圖: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/url-1.png\" alt=\"Struts2 \u003cs:url\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/url.html\"\u003eStruts2 \u0026lt;s:url\u0026gt;標籤文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e 代碼下載 -\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1c0gBXeC\"\u003ehttp://pan.baidu.com/s/1c0gBXeC\u003c/a\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"72:Te1b,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e\n 要使用資源包從屬性文件檢索消息,必須瞭解Struts2的資源包搜索順序: \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003ch2\u003e \n \u003cdiv\u003e\n 資源包搜索順序 \n \u003c/div\u003e \u003c/h2\u003e \n\u003cdiv\u003e\n 資源包中搜索按以下順序: \n\u003c/div\u003e \n\u003col\u003e \n \u003cli\u003e ActionClass.properties \u003c/li\u003e \n \u003cli\u003e Interface.properties \u003c/li\u003e \n \u003cli\u003e BaseClass.properties \u003c/li\u003e \n \u003cli\u003e ModelDriven’s model \u003c/li\u003e \n \u003cli\u003e package.properties \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 搜索國際化消息鍵的層次結構本身 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 全局資源屬性 \n \u003c/div\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 請參閱 \n \u003ca href=\"http://struts.apache.org/docs/localization.html\"\u003eStruts2資源包\u003c/a\u003e文檔詳細解釋。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e 在實踐中,是不可能組織屬性的文件的順序。所以,只要瞭解幾個常用的搜索順序應該是足夠了:\u0026nbsp;package.properties\u0026nbsp;和\u0026nbsp;global resource properties。參見下圖: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-19.png\" alt=\"Struts2資源包使用示例\"\u003e \u003c/p\u003e \n\u003cdiv\u003e\n 如果com.yiibai.user.action.LoginAction想通過資源包獲得消息,它將搜索 \n\u003c/div\u003e \n\u003col\u003e \n \u003cli\u003e com.yiibai.user.action.LoginAction.properties (找到,退出,否則下一個) \u003c/li\u003e \n \u003cli\u003e com.yiibai.user.action.package.properties (找到,退出,否則下一個) \u003c/li\u003e \n \u003cli\u003e com.yiibai.user.package.properties (找到,退出,否則下一個)\u003cbr\u003e …一路不斷在每個父目錄的根目錄查找package.properties \u003c/li\u003e \n \u003cli\u003e 查找全局資源屬性,如果將其配置在應用程序中。 \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 明白這搜索順序可以給你更多的信心來決定正確的文件夾的屬性文件。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003ch2\u003e \n \u003cdiv\u003e\n 獲取資源包 \n \u003c/div\u003e \u003c/h2\u003e \n\u003cdiv\u003e\n 下面是訪問該資源包的幾個例子: \n\u003c/div\u003e \n\u003cp\u003e P.S ‘username.required‘ \u0026nbsp;和 ‘username‘\u0026nbsp;在一個屬性文件中的鍵。 \u003c/p\u003e \n\u003ch2\u003e 1. 動作類 \u003c/h2\u003e \n\u003cdiv\u003e\n 在Action類,可以擴展了ActionSupport和通過getText(‘key’)\u0026nbsp;函數獲取資源包。 \n\u003c/div\u003e \n\u003cpre\u003e...\r\npublic class LoginAction extends ActionSupport{\r\n\t...\r\n\tpublic void validate(){\r\n\t\tif(\"\".equals(getUsername())){\r\n\t\t\taddFieldError(\"username\", getText(\"username.required\"));\r\n\t\t}\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. \u0026lt;s:property\u0026gt;標籤 \u003c/h2\u003e \n\u003cp\u003e 在屬性標記,使用\u0026nbsp;getText(‘key’). \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:property value=\"getText('username')\" /\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. \u0026lt;s:text\u0026gt;標籤 \u003c/h2\u003e \n\u003cdiv\u003e\n 在text標籤,設置「name」屬性的鍵。 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;s:text name=\"username\" /\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. Key屬性 \u003c/h2\u003e \n\u003cp\u003e UI組件的主要屬性有特殊的功能,查看這個key屬性例子詳細信息。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:textfield key=\"username\" /\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. I18n標籤 \u003c/h2\u003e \n\u003cp\u003e 國際化i18n\u0026nbsp;標籤可以從「name」屬性聲明指定資源包得到消息。在這個例子中,它要求從com/yiibai/user/package.properties文件中以獲得\u0026nbsp;「username」\u0026nbsp;的消息。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:i18n name=\"com.yiibai.user.package\" \u0026gt;\r\n \u0026lt;s:text name=\"username\" /\u0026gt;\r\n\u0026lt;/s:i18n\u0026gt;\u0026nbsp;\u003c/pre\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 訪問 URL\u0026nbsp; \n \u003ca href=\"http://localhost:8080/struts2resourcebundle/user/login.action\"\u003ehttp://localhost:8080/struts2resourcebundle/user/login.action\u003c/a\u003e,輸出以下結果: \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-20.png\" alt=\"Struts2資源包使用示例\"\u003e \n \u003cbr\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cp\u003e 下載完整的項目實踐(struts2resourcebundle)\u0026nbsp;–\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1dD2UQ2l\"\u003ehttp://pan.baidu.com/s/1dD2UQ2l\u003c/a\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"73:T1f8e,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n Struts\u0026nbsp;2的國際化(I18N)和本地化(i10n)或多語言的例子,來說明如何使用資源包來顯示不同語言的消息。在這個例子中,您將創建一個簡單的登錄屏幕,通過Struts\u0026nbsp;2的UI組件顯示來自資源包的消息,\u0026nbsp;並更改基於所選的語言選項的語言環境。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003ch2\u003e 1. 工程結構 \u003c/h2\u003e \n\u003cp\u003e 項目結構,如下圖片顯示: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-21.png\" alt=\"Struts2本地化和國際化\"\u003e \u003c/p\u003e \n\u003ch2\u003e 2. Properties文件 \u003c/h2\u003e \n\u003cdiv\u003e\n 確保屬性文件命名爲國家指定的代碼。 \n\u003c/div\u003e \n\u003cdiv\u003e\n 在一些「非歐洲」或「非英語」之類的字符,應該始終編碼的內容\u0026nbsp;native2ascii屬性 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eglobal.properties\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e#Global messages\r\nglobal.username = Username\r\nglobal.password = Password\r\nglobal.submit = Submit\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eglobal_zh_CN.properties\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e#Global messages\r\nglobal.username = \\u7528\\u6237\\u540d\r\nglobal.password = \\u5bc6\\u7801\r\nglobal.submit=\\u63d0\\u4ea4\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eglobal_fr.properties\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e#Global messages\r\nglobal.username = Nom d'utilisateur\r\nglobal.password = Mot de passe\r\nglobal.submit = Soumettre\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eglobal_de.properties\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e#Global messages\r\nglobal.username = Benutzername\r\nglobal.password = Kennwort\r\nglobal.submit = Einreichen\u0026nbsp;\u003c/pre\u003e \n\u003cdiv\u003e\n 請仔細閱讀Struts2資源包的例子來了解Struts\u0026nbsp;2的自動搜索屬性文件。 \n\u003c/div\u003e \n\u003ch2\u003e 3. 動作類 \u003c/h2\u003e \n\u003cp\u003e 兩個動作類,LocaleAction基本上是什麼都不做,\u0026nbsp;而 LoginAction 會做一個簡單的驗證和通過gettext()顯示來自資源包錯誤信息。 \u003c/p\u003e \n\u003cp\u003e LocaleAction.java \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class LocaleAction extends ActionSupport{\r\n\r\n\t//business logic\r\n\tpublic String execute() {\r\n\t\treturn \"SUCCESS\";\r\n\t}\r\n}\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eLoginAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.user.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class LoginAction extends ActionSupport{\r\n\r\n\tprivate String username;\r\n\tprivate String password;\r\n\t \r\n\t//...getter and setter methods\r\n\r\n\t//business logic\r\n\tpublic String execute() {\r\n\t\treturn \"SUCCESS\";\r\n\t}\r\n\r\n\t//simple validation\r\n\tpublic void validate(){\r\n\t\tif(\"\".equals(getUsername())){\r\n\t\t\taddFieldError(\"username\", getText(\"username.required\"));\r\n\t\t}\r\n\t\tif(\"\".equals(getPassword())){\r\n\t\t\taddFieldError(\"password\", getText(\"password.required\"));\r\n\t\t}\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 4. 視圖頁面 \u003c/h2\u003e \n\u003cdiv\u003e\n 一個登錄頁面帶有一個文本框,密碼和提交UI組件。 \n\u003c/div\u003e \n\u003cdiv\u003e\n 爲了支持Struts2\u0026nbsp;本地化,必須聲明\u0026nbsp;\u0026lt;%@\u0026nbsp;page\u0026nbsp;contentType=」text/html;charset=UTF-8″\u0026nbsp;%\u0026gt;在您的視圖頁面,否則能將有問題的「UTF-8數據」正確顯示,尤其是中國漢字。閱讀這篇文章,關於Struts2中國本土化問題。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003elogin.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ page contentType=\"text/html;charset=UTF-8\" %\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 localization example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:form action=\"validateUser\" namespace=\"/user\"\u0026gt;\r\n\r\n\t\u0026lt;s:textfield key=\"global.username\" name=\"username\" /\u0026gt;\r\n\t\u0026lt;s:password key=\"global.password\" name=\"password\"/\u0026gt;\t\r\n\t\u0026lt;s:submit key=\"global.submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;s:url id=\"localeEN\" namespace=\"/\" action=\"locale\" \u0026gt;\r\n \u0026lt;s:param name=\"request_locale\" \u0026gt;en\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:url\u0026gt;\r\n\u0026lt;s:url id=\"localezhCN\" namespace=\"/\" action=\"locale\" \u0026gt;\r\n \u0026lt;s:param name=\"request_locale\" \u0026gt;zh_CN\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:url\u0026gt;\r\n\u0026lt;s:url id=\"localeDE\" namespace=\"/\" action=\"locale\" \u0026gt;\r\n \u0026lt;s:param name=\"request_locale\" \u0026gt;de\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:url\u0026gt;\r\n\u0026lt;s:url id=\"localeFR\" namespace=\"/\" action=\"locale\" \u0026gt;\r\n \u0026lt;s:param name=\"request_locale\" \u0026gt;fr\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:url\u0026gt;\r\n\r\n\u0026lt;s:a href=\"%{localeEN}\" \u0026gt;English\u0026lt;/s:a\u0026gt;\r\n\u0026lt;s:a href=\"%{localezhCN}\" \u0026gt;Chinese\u0026lt;/s:a\u0026gt;\r\n\u0026lt;s:a href=\"%{localeDE}\" \u0026gt;German\u0026lt;/s:a\u0026gt;\r\n\u0026lt;s:a href=\"%{localeFR}\" \u0026gt;France\u0026lt;/s:a\u0026gt;\r\n \r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u0026nbsp;\u003c/pre\u003e \n\u003cdiv\u003e\n 要更改默認的語言環境,只需要聲明「request_locale」參數,設置你喜歡的語言代碼,並傳遞給一個Action類。在 Struts2中,com.opensymphony.xwork2.interceptor.I18nInterceptor\u0026nbsp;攔截器,\u0026nbsp;在 struts-default.xml中聲明將攔截Action類,並相應地處理語言環境。 \n\u003c/div\u003e \n\u003ch2\u003e 5.\u0026nbsp;顯示資源包的消息? \u003c/h2\u003e \n\u003cdiv\u003e\n 在Struts2,有很多的方式來顯示所選擇的語言或語言環境的資源包的信息。有關示例, \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;s:textfield key=\"global.username\" name=\"username\" /\u0026gt;\r\n\u0026lt;s:text name=\"global.username\" /\u0026gt;\t\r\n\u0026lt;s:property value=\"getText('global.username')\" /\u0026gt;\r\n\u0026lt;s:text name=\"global.password\" /\u0026gt;\u0026nbsp;\u003c/pre\u003e \n\u003cdiv\u003e\n 在Struts1,有一個標準的\u0026nbsp;bean:message\u0026nbsp;來顯示資源包的消息。但是在Struts\u0026nbsp;2中,有這麼多相當於顯示資源包的消息(甚至內部的工作不同)方式,基本上,無論選擇的是什麼,在 Struts2 也將顯示正確的資源包的消息。 \n\u003c/div\u003e \n\u003ch2\u003e 6. struts.xml \u003c/h2\u003e \n\u003cdiv\u003e\n Struts2 的配置文件,鏈接一起。 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n\t\u0026lt;constant name=\"struts.custom.i18n.resources\" value=\"global\" /\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \t\r\n\t\u0026lt;package name=\"user\" namespace=\"/user\" extends=\"struts-default\"\u0026gt;\r\n\t \u0026lt;action name=\"login\"\u0026gt;\r\n\t\t\u0026lt;result\u0026gt;/pages/login.jsp\u0026lt;/result\u0026gt;\r\n\t \u0026lt;/action\u0026gt;\r\n\t \u0026lt;action name=\"validateUser\" class=\"com.yiibai.user.action.LoginAction\"\u0026gt;\r\n\t\t\u0026lt;result name=\"SUCCESS\"\u0026gt;/pages/welcome.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;result name=\"input\"\u0026gt;/pages/login.jsp\u0026lt;/result\u0026gt;\r\n\t \u0026lt;/action\u0026gt;\r\n\t\u0026lt;/package\u0026gt;\r\n\t\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t \u0026lt;action name=\"locale\" class=\"com.yiibai.common.action.LocaleAction\"\u0026gt;\r\n\t\t\u0026lt;result name=\"SUCCESS\"\u0026gt;/user/pages/login.jsp\u0026lt;/result\u0026gt;\r\n\t \u0026lt;/action\u0026gt;\r\n\t\u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 7. 示例 \u003c/h2\u003e \n\u003cp\u003e http://localhost:8080/i18nlocalization/user/login.action \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-22.png\" alt=\"Struts2本地化和國際化\"\u003e \u003c/p\u003e \n\u003cp\u003e http://localhost:8080/i18nlocalization/locale.action?request_locale=en \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-22.png\" alt=\"Struts2本地化和國際化\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cp\u003e http://localhost:8080/i18nlocalization/locale.action?request_locale=zh_CN \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-23.png\" alt=\"Struts2本地化和國際化\"\u003e \u003c/p\u003e \n\u003cp\u003e http://localhost:8080/i18nlocalization/locale.action?request_locale=de \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-24.png\" alt=\"Struts2本地化和國際化\"\u003e \u003c/p\u003e \n\u003cp\u003e http://localhost:8080/i18nlocalization/locale.action?request_locale=fr \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-25.png\" alt=\"Struts2本地化和國際化\"\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/localization.html\"\u003ehttp://struts.apache.org/2.1.8/docs/localization.html\u003cbr\u003e \u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e http://www.yiibai.com/java/java-convert-chinese-character-to-unicode-with-native2ascii/ \u003c/li\u003e \n \u003cli\u003e http://www.yiibai.com/struts2/struts-2-resource-bundle-example/ \u003c/li\u003e \n \u003cli\u003e http://www.yiibai.com/struts/struts-internationalizing-or-localization-example/ \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e 代碼下載 -\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1jGCUaJ8\"\u003ehttp://pan.baidu.com/s/1jGCUaJ8\u003c/a\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"74:T92a,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n 在Struts2,在UI組件的「key」屬性來處理本地化的常用方法,也是編碼UI標籤的一個非常有效的方式。見下面兩種情況: \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003ch2\u003e 1. Properties屬性文件 \u003c/h2\u003e \n \u003cdiv\u003e\n 屬性文件包含一條消息。 \n \u003c/div\u003e \n \u003cp\u003e \u003cstrong\u003eglobal.properties\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003eglobal.username = Username\u003c/pre\u003e \n \u003ch2\u003e 2. 示例1 \u003c/h2\u003e \n \u003cp\u003e 如果分配一個「key」屬性到一個文本框。鍵(key)屬性會從資源包中獲取信息,並使其在默認XHTML\u0026nbsp;text.tfl模板基礎上渲染。 \u003c/p\u003e \n \u003cpre\u003e\u0026lt;s:form action=\"validateUser\"\u0026gt;\r\n\t\u0026lt;s:textfield key=\"global.username\" /\u0026gt;\r\n\u0026lt;/s:form\u0026gt;\u003c/pre\u003e \n \u003cdiv\u003e\n 現在它將會使用「global.username\u0026nbsp;{left-side}」和\u0026nbsp;「Username\u0026nbsp;{right-side}」,並匹配相應的XHTML\u0026nbsp;text.tfl模板。 \n \u003c/div\u003e \n \u003cpre\u003e\u0026lt;td class=\"tdLabel\"\u0026gt;\r\n \u0026lt;label for=\"validateUser_{left-side}\" class=\"label\"\u0026gt;{right-side}:\u0026lt;/label\u0026gt;\r\n\u0026lt;/td\u0026gt;\r\n\u0026lt;td\u0026gt;\r\n \u0026lt;input type=\"text\" name=\"{left-side}\" value=\"\" id=\"validateUser_{left-side}\"/\u0026gt;\r\n\u0026lt;/td\u0026gt;\u003c/pre\u003e \n \u003cp\u003e 最後的 HTML \u003c/p\u003e \n \u003cpre\u003e\u0026lt;td class=\"tdLabel\"\u0026gt;\r\n \u0026lt;label for=\"validateUser_global_username\" class=\"label\"\u0026gt;Username:\u0026lt;/label\u0026gt;\r\n\u0026lt;/td\u0026gt;\r\n\u0026lt;td\u0026gt;\r\n \u0026lt;input type=\"text\" name=\"global.username\" value=\"\" id=\"validateUser_global_username\"/\u0026gt;\r\n\u0026lt;/td\u0026gt;\u003c/pre\u003e \n \u003cdiv\u003e\n 鍵屬性將使用\u0026nbsp;{left-side}作爲文本框名稱和ID;\u0026nbsp;{right-side}\u0026nbsp;作爲標籤值。 \n \u003c/div\u003e \n \u003ch2\u003e 3. 示例2 \u003c/h2\u003e \n \u003cdiv\u003e\n 在某些情況下,可能需要顯式聲明的一個不同的名稱的文本框。 \n \u003c/div\u003e \n \u003cpre\u003e\u0026lt;s:form action=\"validateUser\"\u0026gt;\r\n\t\u0026lt;s:textfield key=\"global.username\" name=\"username\"/\u0026gt;\r\n\u0026lt;/s:form\u0026gt;\u0026nbsp;\u003c/pre\u003e \n \u003cp\u003e 現在key屬性將使用「Username\u0026nbsp;{right-side}」來只匹配的標籤值,\u0026nbsp;文本框的名稱和ID將明確覆蓋。 \u003c/p\u003e \n \u003cp\u003e 最後的 HTML \u003c/p\u003e \n \u003cpre\u003e\u0026lt;td class=\"tdLabel\"\u0026gt;\r\n \u0026lt;label for=\"validateUser_username\" class=\"label\"\u0026gt;Username:\u0026lt;/label\u0026gt;\r\n\u0026lt;/td\u0026gt;\r\n\u0026lt;td\u0026gt;\r\n \u0026lt;input type=\"text\" name=\"username\" value=\"\" id=\"validateUser_username\"/\u0026gt;\r\n\u0026lt;/td\u0026gt;\u003c/pre\u003e \n \u003cdiv\u003e \n \u003cdiv\u003e\n key屬性可以提高你的開發速度,使代碼更有效,這是值得學習的。 \n \u003c/div\u003e \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"75:T2117,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n 一個 Struts2 的國際化定位的問題,用來顯示中國漢字... \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003ch2\u003e \n \u003cdiv\u003e\n 案例1:屬性有特殊字符的文件 \n \u003c/div\u003e \u003c/h2\u003e \n\u003cp\u003e 屬性文件存儲用戶名,密碼信息,並以中文字符提交。此屬性文件以UTF-8格式創建的,但內容不使用 native2ascii\u0026nbsp;編碼。 \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-22.jpg\" alt=\"Struts2中文本地化問題\"\u003e \u003c/p\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003cp\u003e 讓我們試着通過一些UI標籤,來顯示中國漢字。查看頁面聲明爲UTF-8格式的HTML元標記來顯示。 \u003c/p\u003e \n\u003cpre\u003e...\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" /\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n...\r\n\u0026lt;s:form action=\"validateUser\"\u0026gt;\r\n\t\u0026lt;s:textfield key=\"global.username\" name=\"username\"/\u0026gt;\r\n\t\u0026lt;s:password key=\"global.password\" name=\"password\"/\u0026gt;\t\r\n\t\u0026lt;s:submit key=\"global.submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\t\u0026lt;div\u0026gt;Testing 1 : \u0026lt;s:property value=\"getText('global.username')\" /\u0026gt;\u0026lt;/div\u0026gt;\r\n\t\u0026lt;div\u0026gt;Testing 2 : \u0026lt;s:text name=\"global.password\" /\u0026gt;\u0026lt;/div\u0026gt;\u0026lt;/br/\u0026gt;\r\n\u0026lt;/s:form\u0026gt;\r\n...\r\n\u0026lt;s:url id=\"localezhCN\" namespace=\"/\" action=\"locale\" \u0026gt;\r\n \u0026lt;s:param name=\"request_locale\" \u0026gt;zh_CN\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:url\u0026gt;\r\n...\r\n\u0026lt;s:a href=\"%{localezhCN}\" \u0026gt;Chinese\u0026lt;/s:a\u0026gt;\r\n...\u003c/pre\u003e \n\u003cp\u003e 結果\u003cbr\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-26.png\" alt=\"Struts2中文本地化問題\"\u003e \u003c/p\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003cdiv\u003e\n 令人驚奇的是,以下三個UI標籤都能夠正確地顯示中國消息 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;s:textfield key=\"global.username\" name=\"username\"/\u0026gt;\r\n\u0026lt;s:password key=\"global.password\" name=\"password\"/\u0026gt;\t\r\nTesting 2 : \u0026lt;s:text name=\"global.password\" /\u0026gt;\u003c/pre\u003e \n\u003cdiv\u003e\n 然而,「s:submit」\u0026nbsp;和\u0026nbsp;「getText()」\u0026nbsp;卻無法顯示呢? \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 據Java的國際化文檔,要使用資源包正確顯示特殊字符,則必須用 native2ascii 工具進行處理。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e 深入到 TextProvider.getText()的源代碼後,它使用的資源\u0026nbsp;bundle.getString()來從資源包檢索的消息,所以不正確的消息是合理的。但是,爲什麼「s:text「,\u0026nbsp;「s:textfield」\u0026nbsp;和\u0026nbsp;「s:password」\u0026nbsp;能夠正確顯示了中文的消息,爲什麼「s:submit」會失敗?在有太多的問題,讓我們看看示例2... \u003c/p\u003e \n\u003ch2\u003e \n \u003cdiv\u003e\n 案例2:有特殊字符的屬性文件(編碼) \n \u003c/div\u003e \u003c/h2\u003e \n\u003cp\u003e 這一次,屬性文件使用native2ascii工具處理中國漢字的編碼正確。 \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-23.jpg\" alt=\"Struts2中文本地化問題\"\u003e \u003c/p\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003cp\u003e 結果如下所示: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-27.png\" alt=\"Struts2中文本地化問題\"\u003e \u003c/p\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003cp\u003e 其結果是完全逆轉,現在\u0026nbsp;「s:submit」\u0026nbsp;和\u0026nbsp;「getText()」\u0026nbsp;是能夠正確地顯示它,但其他UI組件失敗。\u0026nbsp;這裏是按預期方式工作的,因爲在Struts\u0026nbsp;2推薦使用getText(),以顯示國際化或本地化的消息。問題是,爲什麼「s:submit」會不同呢? \u003c/p\u003e \n\u003cdiv\u003e \n \u003ch2\u003e Struts2..哪裏有問題? \u003c/h2\u003e \n \u003cp\u003e 這裏有幾個問題: \u003c/p\u003e \n \u003col\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 爲什麼\u0026nbsp;s:submit\u0026nbsp;有如此不同的效果? \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u003cspan\u003e對國際化應該是非常簡單的,爲什麼在Struts\u0026nbsp;2有這種問題?\u003c/span\u003e\u0026nbsp;\u003cspan\u003e或者我們誤解了Struts2 國際化如何工作了?\u003c/span\u003e \u003c/li\u003e \n \u003cli\u003e \u003cspan\u003e爲什麼有這麼多的方式來顯示來自資源包的消息?\u003c/span\u003e\u003cspan\u003e爲什麼不直接組織成一個方法?\u003c/span\u003e\u003cspan\u003e\u0026nbsp;\u003c/span\u003e\u003cspan\u003e在Struts1,只需使用「bean:message」,爲什麼Struts\u0026nbsp;2中它看起來很複雜?\u003c/span\u003e \u003c/li\u003e \n \u003cli\u003e \u003cspan\u003eStruts2的支持XML資源包?\u003c/span\u003e\u0026nbsp;我們可能\u003cspan\u003e不太喜歡用native2ascii工具對數據進行編碼爲UTF-8格式,\u003c/span\u003e\u003cspan\u003e它使屬性文件不可讀。\u0026nbsp;Apache\u0026nbsp;Wicket的在這個問題做了很好的工作,可能是在Struts\u0026nbsp;2中吸取教訓。\u003c/span\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 那麼,如何正確地在 Struts2 中顯示中國漢字? \n \u003c/div\u003e \u003c/li\u003e \n \u003c/ol\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 許多文章和教程使用以下方法來顯示資源包的消息: \n \u003c/div\u003e \n \u003cpre\u003e\u0026lt;s:text name=\"global.username\"/\u0026gt;\r\n\u0026lt;s:property value=\"getText('global.username')\"/\u0026gt;\u0026nbsp;\u003c/pre\u003e \n \u003cp\u003e \u003cspan\u003e然而,這僅適用於英國或一些「英語狀(歐洲)」 的字符,如法文,德文。\u003c/span\u003e\u003cspan\u003e但對中文或日文,這兩種方法將返回完全不同的輸出。真的不知道Struts2的本地化該怎麼辦了。\u003c/span\u003e \u003c/p\u003e \n\u003c/div\u003e \n\u003ch2\u003e 解決辦法 \u003c/h2\u003e \n\u003cdiv\u003e\n 問題是在HTML\u0026nbsp;meta標籤, \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;head\u0026gt;\r\n\u0026lt;meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" /\u0026gt;\r\n\u0026lt;/head\u0026gt;\u003c/pre\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 在Struts1,上述meta標籤必須正確顯示UTF-8的數據,但這在 Struts2 是有問題的。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cspan\u003e在Struts2,meta標籤不起作用,我們應該把\u0026nbsp;\u0026lt;%@\u0026nbsp;page\u0026nbsp;contentType=」text/html;charset=UTF-8″\u0026nbsp;%\u0026gt;標籤放在頁面的第一行。\u003c/span\u003e例如下面的代碼片斷: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ page contentType=\"text/html;charset=UTF-8\" %\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n...\u003c/pre\u003e \n\u003cp\u003e 結果顯示如下: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-28.png\" alt=\"Struts2中文本地化問題\"\u003e \u003c/p\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003cdiv\u003e\n 所有的中文消息正確顯示。 \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003ch2\u003e \n \u003cdiv\u003e\n 回答之前的問題 \n \u003c/div\u003e \u003c/h2\u003e \n \u003col\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 爲什麼\u0026nbsp;s:submit\u0026nbsp;有如此不同的效果? \n \u003c/div\u003e \u003cstrong\u003eA:\u0026nbsp;\u003c/strong\u003e\u003cspan\u003e暫無評論\u003c/span\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 對國際化應該是非常簡單的,爲什麼在Struts\u0026nbsp;2有這種問題?\u0026nbsp;或者我們誤解了Struts2\u0026nbsp;國際化如何工作了? \n \u003c/div\u003e \u003cstrong\u003eA:\u0026nbsp;\u003cstrong\u003e \n \u003cdiv\u003e\n 確保把 \n \u003c/div\u003e \u003c/strong\u003e\u003cstrong\u003e\u0026nbsp;\u003cstrong\u003e\u0026lt;%@ page contentType=」text/html;charset=UTF-8″ %\u0026gt;\u003c/strong\u003e」 放在頁面的第一行。\u003c/strong\u003e\u003c/strong\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 爲什麼有這麼多的方式來顯示來自資源包的消息?爲什麼不直接組織成一個方法?\u0026nbsp;在Struts1,只需使用「bean:message」,爲什麼Struts\u0026nbsp;2中它看起來很複雜? \n \u003c/div\u003e \u003cstrong\u003eA: s:text, key, getText(), name… ,\u0026nbsp;\u003cstrong\u003e \n \u003cdiv\u003e\n 所有的都能夠正確地顯示中文或UTF-8編碼的數據, \n \u003cstrong\u003e\u003cstrong\u003e \n \u003cdiv\u003e\n 只要確保把正確的「字符集」放在視圖頁面中。 \n \u003c/div\u003e \u003c/strong\u003e\u003c/strong\u003e \n \u003c/div\u003e \u003c/strong\u003e\u003c/strong\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n Struts2的支持XML資源包?\u0026nbsp;我們可能不太喜歡用native2ascii工具對數據進行編碼爲UTF-8格式,它使屬性文件不可讀。\u0026nbsp;Apache\u0026nbsp;Wicket的在這個問題做了很好的工作,可能是在Struts\u0026nbsp;2中吸取教訓。 \n \u003c/div\u003e \u003cstrong\u003eA:\u003c/strong\u003e\u003cspan\u003e希望在Struts2的下一版本可以支持在XML資源包。\u003c/span\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 那麼,如何正確地在\u0026nbsp;Struts2\u0026nbsp;中顯示中國漢字? \n \u003c/div\u003e \u003cstrong\u003eA: 看看上頁的解決辦法\u003c/strong\u003e \u003c/li\u003e \n \u003c/ol\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cdiv\u003e \n \u003ch2\u003e 參考 \u003c/h2\u003e \n \u003col\u003e \n \u003cli\u003e http://www.yiibai.com/java/java-convert-chinese-character-to-unicode-with-native2ascii.html \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://forums.sun.com/thread.jspa?threadID=5185040\"\u003ehttp://forums.sun.com/thread.jspa?threadID=5185040\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://www.coderanch.com/t/452139/Struts/applicationresources-properties-utf-characters#2013557\"\u003ehttp://www.coderanch.com/t/452139/Struts/applicationresources-properties-utf-characters#2013557\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/localization.html\"\u003ehttp://struts.apache.org/2.1.8/docs/localization.html\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://hxzon00.blog.163.com/blog/static/10489241620088121449163/\"\u003ehttp://hxzon00.blog.163.com/blog/static/10489241620088121449163/\u003c/a\u003e \u003c/li\u003e \n \u003c/ol\u003e \n \u003cdiv\u003e \n \u003cbr\u003e 下載代碼( \n \u003cspan\u003eglobalresource\u003c/span\u003e \n \u003cspan\u003e) –\u003c/span\u003e \n \u003cspan\u003e\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1mgzt3dQ\"\u003ehttp://pan.baidu.com/s/1mgzt3dQ\u003c/a\u003e\u003c/span\u003e \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"76:Ta02,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n 通常情況下,您可能需要一個全局資源包(屬性文件)來存儲信息,可用於在應用程序中的所有類。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 在Struts2,有三種方式來配置全局資源包: \n \u003c/div\u003e \n \u003ch2\u003e 1. struts.properties \u003c/h2\u003e \n \u003cdiv\u003e\n 配置全局資源包在\u0026nbsp;「struts.properties」\u0026nbsp;文件,在這裏你定義一個名爲「global.properties」的屬性文件爲全局資源包。 \n \u003c/div\u003e \n \u003cpre\u003estruts.custom.i18n.resources = global\u003c/pre\u003e \n \u003cdiv\u003e\n 對於多個資源包,只是用逗號分隔屬性文件。 \n \u003c/div\u003e \n \u003cpre\u003estruts.custom.i18n.resources = global, another-properties-file\u003c/pre\u003e \n \u003ch2\u003e 2. struts.xml \u003c/h2\u003e \n \u003cdiv\u003e\n 或者,可以配置全局資源包在\u0026nbsp;struts.xml\u0026nbsp;配置文件中的常量值。 \n \u003c/div\u003e \n \u003cpre\u003e\u0026lt;struts\u0026gt;\r\n \u0026lt;constant name=\"struts.custom.i18n.resources\" value=\"global\" /\u0026gt; \t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n \u003ch2\u003e 3. listener \u003c/h2\u003e \n \u003cdiv\u003e\n 最後一個方法是使用servlet監聽器加載一個屬性文件作爲全局資源包。 \n \u003c/div\u003e \n \u003cpre\u003epackage com.yiibai.common.listener;\r\n\r\nimport javax.servlet.ServletContextEvent;\r\nimport javax.servlet.ServletContextListener;\r\n\r\nimport com.opensymphony.xwork2.util.LocalizedTextUtil;\r\n\r\npublic class GlobalMessagesListener implements ServletContextListener {\r\n\t \r\n\t private static final String DEFAULT_RESOURCE = \"global\";\r\n\r\n\t public void contextInitialized(ServletContextEvent arg0) {\r\n\t LocalizedTextUtil.addDefaultResourceBundle(DEFAULT_RESOURCE);\r\n\t }\r\n\r\n\t public void contextDestroyed(ServletContextEvent arg0) {\r\n\t }\r\n}\u003c/pre\u003e \n \u003cp\u003e \u003cstrong\u003eweb.xml\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003e\u0026lt;!DOCTYPE web-app PUBLIC\r\n \"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN\"\r\n \"http://java.sun.com/dtd/web-app_2_3.dtd\" \u0026gt;\r\n\r\n\u0026lt;web-app\u0026gt;\r\n \u0026lt;display-name\u0026gt;Struts 2 Web Application\u0026lt;/display-name\u0026gt;\r\n \r\n \u0026lt;filter\u0026gt;\r\n\t\u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n\t\u0026lt;filter-class\u0026gt;org.apache.struts2.dispatcher.FilterDispatcher\u0026lt;/filter-class\u0026gt;\r\n \u0026lt;/filter\u0026gt;\r\n \r\n \u0026lt;filter-mapping\u0026gt;\r\n\t\u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n\t\u0026lt;url-pattern\u0026gt;/*\u0026lt;/url-pattern\u0026gt;\r\n \u0026lt;/filter-mapping\u0026gt;\r\n \r\n \u0026lt;listener\u0026gt;\r\n \t\u0026lt;listener-class\u0026gt;\r\n com.yiibai.common.listener.GlobalMessagesListener\r\n \u0026lt;/listener-class\u0026gt;\r\n \u0026lt;/listener\u0026gt;\r\n\r\n\u0026lt;/web-app\u0026gt;\u003c/pre\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003cspan\u003e下載源代碼(globalresource)–\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1sj1Rg7r\"\u003ehttp://pan.baidu.com/s/1sj1Rg7r\u003c/a\u003e\u003c/span\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"77:T1dfe,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e \n \u003cspan\u003e在本教程中,我們來學習Struts2和Spring的集成。\u003cbr\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2+spring-1.png\" alt=\"Struts2+Spring集成實例\"\u003e\u003cbr\u003e \u003c/span\u003e \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003ch2\u003e 1. 工程結構 \u003c/h2\u003e \n\u003cdiv\u003e\n 下面的圖是本教程的項目文件夾結構。 \n \u003cbr\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2+spring-2.png\" alt=\"Struts2+Spring集成實例\"\u003e \n \u003cbr\u003e \n\u003c/div\u003e \n\u003ch2\u003e 2. Spring監聽器 \u003c/h2\u003e \n\u003cp\u003e 配置Spring監聽器\u0026nbsp;「org.springframework.web.context.ContextLoaderListener」 到\u0026nbsp;web.xml\u0026nbsp;文件中。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eweb.xml\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;!DOCTYPE web-app PUBLIC\r\n \"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN\"\r\n \"http://java.sun.com/dtd/web-app_2_3.dtd\" \u0026gt;\r\n\r\n\u0026lt;web-app\u0026gt;\r\n \u0026lt;display-name\u0026gt;Struts 2 Web Application\u0026lt;/display-name\u0026gt;\r\n \r\n \u0026lt;filter\u0026gt;\r\n\t\u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n\t\u0026lt;filter-class\u0026gt;\r\n org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter\r\n \u0026lt;/filter-class\u0026gt;\r\n \u0026lt;/filter\u0026gt;\r\n \r\n \u0026lt;filter-mapping\u0026gt;\r\n\t\u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n\t\u0026lt;url-pattern\u0026gt;/*\u0026lt;/url-pattern\u0026gt;\r\n \u0026lt;/filter-mapping\u0026gt;\r\n \r\n \u0026lt;listener\u0026gt;\r\n \u0026lt;listener-class\u0026gt;\r\n org.springframework.web.context.ContextLoaderListener\r\n \u0026lt;/listener-class\u0026gt;\r\n \u0026lt;/listener\u0026gt;\r\n \r\n\u0026lt;/web-app\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. 註冊Spring Bean \u003c/h2\u003e \n\u003cp\u003e 註冊所有的Spring\u0026nbsp;Beans\u0026nbsp;配置在 applicationContext.xml 文件中,\u0026nbsp;Spring監聽器會自動找到這個\u0026nbsp;XML\u0026nbsp;文件。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eapplicationContext.xml\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;beans xmlns=\"http://www.springframework.org/schema/beans\"\r\nxmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\nxsi:schemaLocation=\"http://www.springframework.org/schema/beans\r\nhttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd\"\u0026gt;\r\n \r\n\t\u0026lt;bean id=\"userBo\" class=\"com.yiibai.user.bo.impl.UserBoImpl\" /\u0026gt;\r\n\t\r\n\t\u0026lt;bean id=\"userSpringAction\" class=\"com.yiibai.user.action.UserSpringAction\"\u0026gt;\r\n\t\t\u0026lt;property name=\"userBo\" ref=\"userBo\" /\u0026gt;\t\r\n\t\u0026lt;/bean\u0026gt;\r\n \r\n\u0026lt;/beans\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eUserBo.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.user.bo;\r\n\r\npublic interface UserBo{\r\n\r\n\tpublic void printUser();\r\n\t\r\n}\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eUserBoImpl.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.user.bo.impl;\r\n\r\nimport com.yiibai.user.bo.UserBo;\r\n\r\npublic class UserBoImpl implements UserBo{\r\n\r\n\tpublic void printUser(){\r\n\t\tSystem.out.println(\"printUser() is executed...\");\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eUserSpringAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.user.action;\r\n\r\nimport com.yiibai.user.bo.UserBo;\r\n\r\npublic class UserSpringAction{\r\n\r\n\t//DI via Spring\r\n\tUserBo userBo;\r\n\t\r\n\tpublic UserBo getUserBo() {\r\n\t\treturn userBo;\r\n\t}\r\n\r\n\tpublic void setUserBo(UserBo userBo) {\r\n\t\tthis.userBo = userBo;\r\n\t}\r\n\r\n\tpublic String execute() throws Exception {\r\n\t\t\r\n\t\tuserBo.printUser();\r\n\t\treturn \"success\";\r\n\t\t\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 4. Struts.xml \u003c/h2\u003e \n\u003cdiv\u003e\n 在此聲明的所有關係。 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \t\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\r\n\t\t\u0026lt;action name=\"userAction\" \r\n\t\t\tclass=\"com.yiibai.user.action.UserAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;pages/user.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\t\u0026lt;action name=\"userSpringAction\" \r\n\t\t\tclass=\"userSpringAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;pages/user.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. 示例 \u003c/h2\u003e \n\u003cdiv\u003e\n 現在,所有的Struts2和Spring的集成工作已經完成,現在看到下面的用例來訪問\u0026nbsp;Spring\u0026nbsp;的\u0026nbsp;「userBo」\u0026nbsp;Bean。 \n\u003c/div\u003e \n\u003cul\u003e \n \u003cli\u003e 用例 1 :\u0026nbsp;讓\u0026nbsp;Spring\u0026nbsp;充當\u0026nbsp;Struts2的Action類,並訪問Spring的Bean。 \u003c/li\u003e \n \u003cli\u003e 用例 2 :\u0026nbsp;在Struts2的Action類中訪問Spring的Bean。 \u003c/li\u003e \n\u003c/ul\u003e \n\u003ch2\u003e 用例1 \u003c/h2\u003e \n\u003cdiv\u003e\n 在這個例子中,userSpringAction充當Struts2的Action類,也可以使用普通Spring的方式注入Spring的userBo。 \n\u003c/div\u003e \n\u003cpre\u003e//struts.xml\r\n\u0026lt;action name=\"userSpringAction\" \r\n\tclass=\"userSpringAction\" \u0026gt;\r\n\t\u0026lt;result name=\"success\"\u0026gt;pages/user.jsp\u0026lt;/result\u0026gt;\r\n\u0026lt;/action\u0026gt;\r\n\r\n//applicationContext.xml\r\n\u0026lt;bean id=\"userSpringAction\" class=\"com.yiibai.user.action.UserSpringAction\"\u0026gt;\r\n\t\u0026lt;property name=\"userBo\" ref=\"userBo\" /\u0026gt;\t\r\n\u0026lt;/bean\u0026gt;\u0026nbsp;\u003c/pre\u003e \n\u003cp\u003e 要訪問此操作,請使用網址:\u0026nbsp;\u003ca href=\"http://localhost:8080/struts2spring/userSpringAction.action\"\u003ehttp://localhost:8080/struts2spring/userSpringAction.action\u003c/a\u003e \u003c/p\u003e \n\u003ch2\u003e 用例 2 \u003c/h2\u003e \n\u003cp\u003e 默認情況下,Spring監聽器啓用\u0026nbsp;「通過匹配bean的名字自動裝配「。\u0026nbsp;因此,它會通過setUserBo自動傳遞Spring\u0026nbsp;「userBo」\u0026nbsp;Bean\u0026nbsp;到UserAction。請參閱下面的Struts2動作: \u003c/p\u003e \n\u003cdiv\u003e \n \u003cspan\u003eSpring的自動裝配功能可以修改爲\u003c/span\u003e\u0026nbsp; \n \u003cstrong\u003ename\u003c/strong\u003e(默認),\u0026nbsp; \n \u003cstrong\u003etype\u003c/strong\u003e,\u0026nbsp; \n \u003cstrong\u003eauto\u003c/strong\u003e\u0026nbsp;或\u0026nbsp; \n \u003cstrong\u003econstructor\u003c/strong\u003e,\u0026nbsp; \n \u003cspan\u003e可能需要參考\u0026nbsp;\u003ca href=\"http://struts.apache.org/docs/spring-plugin.html\"\u003eStruts2的Spring插件文檔\u003c/a\u003e。\u003c/span\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eUserAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.user.action;\r\n\r\nimport com.yiibai.user.bo.UserBo;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class UserAction extends ActionSupport{\r\n\r\n\t//DI via Spring\r\n\tUserBo userBo;\r\n\t\r\n\tpublic UserBo getUserBo() {\r\n\t\treturn userBo;\r\n\t}\r\n\r\n\tpublic void setUserBo(UserBo userBo) {\r\n\t\tthis.userBo = userBo;\r\n\t}\r\n\r\n\tpublic String execute() throws Exception {\r\n\t\t\r\n\t\tuserBo.printUser();\r\n\t\treturn SUCCESS;\r\n\t\t\r\n\t}\r\n}\u003c/pre\u003e \n\u003cp\u003e 要訪問此操作,請使用網址:\u0026nbsp;http://localhost:8080/struts2spring/userAction.action \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2+spring-3.png\" alt=\"Struts2+Spring集成實例\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003c/p\u003e \n\u003cdiv\u003e \n \u003cstrong\u003eWebApplicationContextUtils\u003c/strong\u003e \n \u003cbr\u003e \n \u003cspan\u003e另外,也可以使用Spring 通用\u003c/span\u003e\u0026nbsp; \n \u003cstrong\u003eWebApplicationContextUtils\u003c/strong\u003e\u0026nbsp; \n \u003cspan\u003e類來直接獲得Spring的bean。\u003c/span\u003e \n \u003cpre\u003epackage com.yiibai.user.action;\r\n\r\nimport org.apache.struts2.ServletActionContext;\r\nimport org.springframework.web.context.WebApplicationContext;\r\nimport org.springframework.web.context.support.WebApplicationContextUtils;\r\n\r\nimport com.yiibai.user.bo.UserBo;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class UserAction extends ActionSupport{\r\n\r\n\tpublic String execute() throws Exception {\r\n\t\t\r\n\t\tWebApplicationContext context =\r\n\t\t\tWebApplicationContextUtils.getRequiredWebApplicationContext(\r\n ServletActionContext.getServletContext()\r\n );\r\n\t\t\r\n\t\tUserBo userBo1 = (UserBo)context.getBean(\"userBo\");\r\n\t\tuserBo1.printUser();\r\n\r\n\t\treturn SUCCESS;\r\n\t\t\r\n\t}\r\n}\u003c/pre\u003e \n\u003c/div\u003e \n\u003cdiv\u003e\n 這是一個又長又臭的文章(包教不包會),請下載完整的項目並按照源代碼去一步步實現。 \n\u003c/div\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.x/docs/spring-plugin.html\"\u003eStruts2 Spring 插件文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e Struts + Spring 集成實例 \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv\u003e\n 代碼下載 -\u0026nbsp; \n \u003ca href=\"http://pan.baidu.com/s/1dDhqQ5b\"\u003ehttp://pan.baidu.com/s/1dDhqQ5b\u003c/a\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"78:T2f26,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n Struts2並沒有附帶任何現成「Struts2-Quartz.jar」之類的插件,黑客可能會使用標準的\u0026nbsp;Servlet\u0026nbsp;監聽將兩個框架鏈接在一起。請參閱它們的關係 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003cpre\u003eStruts 2 \u0026lt;-- (Listener)--\u0026gt; Quartz \u0026lt;---\u0026gt; Scheduler task\u003c/pre\u003e \n \u003cdiv\u003e\n 在本教程中,我們將學習如何將Struts2和Quartz調度框架集成在一起。 \n \u003c/div\u003e \n \u003cdiv\u003e\n 使用的工具: \n \u003c/div\u003e \n \u003col\u003e \n \u003cli\u003e Struts 2.1.4 \u003c/li\u003e \n \u003cli\u003e Quartz 2.1.5 \u003c/li\u003e \n \u003cli\u003e Tomcat 6/7 \u003c/li\u003e \n \u003cli\u003e MyEclipse 10 \u003c/li\u003e \n \u003c/ol\u003e \n \u003ch2\u003e 1. 調度作業 \u003c/h2\u003e \n \u003cdiv\u003e\n 創建Quartz調度作業任務,並打印出一行。 \n \u003c/div\u003e \n \u003cp\u003e \u003cem\u003eFile : SchedulerJob.java\u003c/em\u003e \u003c/p\u003e \n \u003cpre\u003epackage com.yiibai.quartz;\r\n\r\nimport org.quartz.Job;\r\nimport org.quartz.JobExecutionContext;\r\nimport org.quartz.JobExecutionException;\r\n\r\npublic class SchedulerJob implements Job {\r\n\tpublic void execute(JobExecutionContext context)\r\n\t\tthrows JobExecutionException { \u003cspan\u003eSystem.out.println(\"Struts\u0026nbsp;2.1.4\u0026nbsp;+\u0026nbsp;Quartz\u0026nbsp;2.2.2\u0026nbsp;-\u0026nbsp;by\u0026nbsp;\u003c/span\u003ewww.yiibai.com\u003cspan\u003e\");\u003c/span\u003e \r\n\t\n \n \n \u003cdiv\u003e\n \n \n \r\n\t\t\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;SimpleDateFormat\u0026nbsp;sdf\u0026nbsp;=\u0026nbsp;new\u0026nbsp;SimpleDateFormat(\"yyyy-MM-dd\u0026nbsp;HH:mm:ss\");\r\n\t\n \n \n \u003c/div\u003e\r\n\r\n\t\n \n \n \u003cdiv\u003e\n \n \n \r\n\t\t\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;System.out.println(\u0026nbsp;\"\u0026nbsp;已被安排執行於:\u0026nbsp;\"\u0026nbsp;+\u0026nbsp;sdf.format(new\u0026nbsp;Date()));\r\n\t\n \n \n \u003c/div\u003e\r\n}\r\n}\u003c/pre\u003e \n \u003ch2\u003e 3. Servlet 監聽器 \u003c/h2\u003e \n \u003cp\u003e 創建標準的servlet監聽器類用來做整合工作。它調用Quartz調度框架中的contextInitialized()方法。在Servlet容器初始化,contextInitialized()方法將自動執行。 \u003c/p\u003e \n \u003cp\u003e \u003cem\u003eFile : QuartzSchedulerListener.java\u003c/em\u003e \u003c/p\u003e \n \u003cpre\u003epackage com.yiibai.listener;\r\n\r\nimport javax.servlet.ServletContextEvent;\r\nimport javax.servlet.ServletContextListener;\r\nimport org.quartz.CronScheduleBuilder;\r\nimport org.quartz.JobBuilder;\r\nimport org.quartz.JobDetail;\r\nimport org.quartz.Scheduler;\r\nimport org.quartz.SchedulerException;\r\nimport org.quartz.Trigger;\r\nimport org.quartz.TriggerBuilder;\r\nimport org.quartz.impl.StdSchedulerFactory;\r\nimport com.yiibai.quartz.SchedulerJob;\r\n\r\npublic class QuartzSchedulerListener implements ServletContextListener {\r\n\r\n\tpublic void contextDestroyed(ServletContextEvent arg0) {\r\n\t\t//\r\n\t}\r\n\r\n\tpublic void contextInitialized(ServletContextEvent arg0) {\r\n\r\n\t\tJobDetail job = JobBuilder.newJob(SchedulerJob.class)\r\n\t\t\t.withIdentity(\"anyJobName\", \"group1\").build();\r\n\r\n\t\ttry {\r\n\r\n\t\t\tTrigger trigger = TriggerBuilder\r\n\t\t\t .newTrigger()\r\n\t\t\t .withIdentity(\"anyTriggerName\", \"group1\")\r\n\t\t\t .withSchedule(\r\n\t\t\t CronScheduleBuilder.cronSchedule(\"0/10 * * * * ?\"))\r\n\t\t\t .build();\r\n\r\n\t\t\tScheduler scheduler = new StdSchedulerFactory().getScheduler();\r\n\t\t\tscheduler.start();\r\n\t\t\tscheduler.scheduleJob(job, trigger);\r\n\r\n\t\t} catch (SchedulerException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t}\r\n\r\n\t}\r\n}\u003c/pre\u003e \n \u003ch2\u003e 4. web.xml \u003c/h2\u003e \n \u003cdiv\u003e\n 把監聽器類 QuartzSchedulerListener.java 添加到 web.xml 文件。 \n \u003c/div\u003e \n \u003cp\u003e \u003cem\u003eFile : web.xml\u003c/em\u003e \u003c/p\u003e \n \u003cpre\u003e\u0026lt;!DOCTYPE web-app PUBLIC\r\n \"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN\"\r\n \"http://java.sun.com/dtd/web-app_2_3.dtd\" \u0026gt;\r\n\r\n\u0026lt;web-app\u0026gt;\r\n\t\u0026lt;display-name\u0026gt;Struts 2 Web Application\u0026lt;/display-name\u0026gt;\r\n\r\n\t\u0026lt;filter\u0026gt;\r\n\t \u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n\t \u0026lt;filter-class\u0026gt;\r\n org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter\r\n \u0026lt;/filter-class\u0026gt;\r\n\t\u0026lt;/filter\u0026gt;\r\n\r\n\t\u0026lt;filter-mapping\u0026gt;\r\n\t \u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n\t \u0026lt;url-pattern\u0026gt;/*\u0026lt;/url-pattern\u0026gt;\r\n\t\u0026lt;/filter-mapping\u0026gt;\r\n\r\n\t\u0026lt;listener\u0026gt;\r\n\t \u0026lt;listener-class\u0026gt;\r\n com.yiibai.listener.QuartzSchedulerListener\r\n \u0026lt;/listener-class\u0026gt;\r\n\t\u0026lt;/listener\u0026gt;\r\n\r\n\u0026lt;/web-app\u0026gt;\u003c/pre\u003e \n \u003ch2\u003e \u003cp\u003e \u003cspan\u003eCronTrigger配置格式:\u003cbr\u003e \u003cspan\u003e格式: [秒] [分] [小時] [日] [月] [周] [年]\u003c/span\u003e\u003c/span\u003e \u003c/p\u003e \n \u003ctable\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e序號\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e說明\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e是否必填\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e允許填寫的值\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e允許的通配符\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e1\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e秒\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e是\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e0-59\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e, - * /\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e2\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e分\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e是\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e0-59\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e, - * /\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e3\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e小時\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e是\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e0-23\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e, - * /\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e4\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e日\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e是\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e1-31\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e, - * ? / L W\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e5\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e月\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e是\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e1-12 or JAN-DEC\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e, - * /\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e6\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e周\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e是\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e1-7 or SUN-SAT\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e, - * ? / L #\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e7\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e年\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e否\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eempty 或 1970-2099\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e, - * /\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n \u003c/table\u003e \u003cp\u003e \u003cspan\u003e通配符說明:\u0026nbsp;\u003cspan\u003e\u003cstrong\u003e\u003cspan\u003e\u003cstrong\u003e\u003cstrong\u003e*\u003c/strong\u003e\u003c/strong\u003e\u0026nbsp;\u003c/span\u003e\u003c/strong\u003e表示所有值. 例如:在分的字段上設置 \"*\",表示每一分鐘都會觸發。\u0026nbsp;\u003cspan\u003e\u003cstrong\u003e\u003cspan\u003e\u003cstrong\u003e?\u003c/strong\u003e\u003c/span\u003e\u003c/strong\u003e\u0026nbsp;表示不指定值。使用的場景爲不需要關心當前設置這個字段的值。例如:要在每月的10號觸發一個操作,但不關心是周幾,所以需要周位置的那個字段設置爲\"?\" 具體設置爲 0 0 0 10\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan\u003e\u003cstrong\u003e\u003cspan\u003e\u003cstrong\u003e\u003cstrong\u003e\u003c/strong\u003e\u003c/strong\u003e\u003c/span\u003e\u003c/strong\u003e\u003cspan\u003e\u003cstrong\u003e\u003cspan\u003e\u003cstrong\u003e\u003c/strong\u003e\u003c/span\u003e\u003c/strong\u003e\u0026nbsp;\u003cspan\u003e\u003cspan\u003e* ?\u0026nbsp;\u003cspan\u003e\u003cstrong\u003e\u003cspan\u003e\u003cstrong\u003e\u003cspan\u003e-\u003c/span\u003e\u003c/strong\u003e\u003c/span\u003e\u003c/strong\u003e\u0026nbsp;表示區間。例如 在小時上設置 \"10-12\",表示 10,11,12點都會觸發。\u0026nbsp;\u003cspan\u003e\u003cstrong\u003e\u003cspan\u003e,\u003c/span\u003e\u003c/strong\u003e\u0026nbsp;表示指定多個值,例如在周字段上設置 \"MON,WED,FRI\" 表示週一,週三和週五觸發\u0026nbsp;\u003cspan\u003e\u003cstrong\u003e\u003cspan\u003e\u003cstrong\u003e\u003cstrong\u003e/\u003c/strong\u003e\u003c/strong\u003e\u0026nbsp;\u003c/span\u003e\u003c/strong\u003e用於遞增觸發。如在秒上面設置\"5/15\" 表示從5秒開始,每增15秒觸發(5,20,35,50)。 在月字段上設置'1/3'所示每月1號開始,每隔三天觸發一次。\u0026nbsp;\u003cspan\u003e\u003cstrong\u003e\u003cspan\u003eL\u003c/span\u003e\u003c/strong\u003e\u0026nbsp;表示最後的意思。在日字段設置上,表示當月的最後一天(依據當前月份,如果是二月還會依據是否是潤年[leap]), 在周字段上表示星期六,相當於\"7\"或\"SAT\"。如果在\"L\"前加上數字,則表示該數據的最後一個。例如在周字段上設置\"6L\"這樣的格式,則表示「本月最後一個星期五\"\u0026nbsp;\u003cspan\u003e\u003cstrong\u003e\u003cspan\u003e\u003cstrong\u003eW\u003c/strong\u003e\u003c/span\u003e\u003c/strong\u003e\u0026nbsp;表示離指定日期的最近那個工作日(週一至週五). 例如在日字段上設置\"15W\",表示離每月15號最近的那個工作日觸發。如果15號正好是週六,則找最近的週五(14號)觸發, 如果15號是周未,則找最近的下週一(16號)觸發.如果15號正好在工作日(週一至週五),則就在該天觸發。如果指定格式爲 \"1W\",它則表示每月1號往後最近的工作日觸發。如果1號正是週六,則將在3號下週一觸發。(注,\"W\"前只能設置具體的數字,不允許區間\"-\").\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e \u003c/p\u003e \n \u003ctable\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e小提示\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cp\u003e \u003cspan\u003e'L'和 'W'可以一組合使用。如果在日字段上設置\"LW\",則表示在本月的最後一個工作日觸發(一般指發工資\u0026nbsp;)\u003c/span\u003e \u003c/p\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n \u003c/table\u003e \u003cp\u003e \u003cspan\u003e\u003cstrong\u003e\u003cspan\u003e#\u003c/span\u003e\u003c/strong\u003e\u0026nbsp;序號(表示每月的第幾個周幾),例如在周字段上設置\"6#3\"表示在每月的第三個週六.注意如果指定\"#5\",正好第五週沒有周六,則不會觸發該配置(用在母親節和父親節再合適不過了)\u003c/span\u003e \u003c/p\u003e \n \u003ctable\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e小提示\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cp\u003e \u003cspan\u003e周字段的設置,若使用英文字母是不區分大小寫的\u0026nbsp;MON\u0026nbsp;與mon相同.\u003c/span\u003e \u003c/p\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n \u003c/table\u003e \u003cp\u003e \u003cspan\u003e常用示例:\u003c/span\u003e \u003c/p\u003e \n \u003ctable\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 0 12 * * ?\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e每天12點觸發\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 15 10 ? * *\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e每天10點15分觸發\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 15 10 * * ?\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e每天10點15分觸發\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 15 10 * * ? *\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e每天10點15分觸發\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 15 10 * * ? 2005\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e2005年每天10點15分觸發\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 * 14 * * ?\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e每天下午的 2點到2點59分每分觸發\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 0/5 14 * * ?\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e每天下午的 2點到2點59分(整點開始,每隔5分觸發)\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 0/5 14,18 * * ?\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e每天下午的 2點到2點59分(整點開始,每隔5分觸發)\u0026nbsp;每天下午的 18點到18點59分(整點開始,每隔5分觸發)\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 0-5 14 * * ?\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e每天下午的 2點到2點05分每分觸發\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 10,44 14 ? 3 WED\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e3月分每週三下午的 2點10分和2點44分觸發\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 15 10 ? * MON-FRI\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e從週一到週五每天上午的10點15分觸發\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 15 10 15 * ?\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e每月15號上午10點15分觸發\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 15 10 L * ?\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e每月最後一天的10點15分觸發\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 15 10 ? * 6L\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e每月最後一週的星期五的10點15分觸發\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 15 10 ? * 6L 2002-2005\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e從2002年到2005年每月最後一週的星期五的10點15分觸發\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 15 10 ? * 6#3\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e每月的第三週的星期五開始觸發\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 0 12 1/5 * ?\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e每月的第一個中午開始每隔5天觸發一次\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 11 11 11 11 ?\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e每年的11月11號 11點11分觸發(光棍節)\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n \u003c/table\u003e \u003c/h2\u003e \n \u003ch2\u003e 5. 示例 \u003c/h2\u003e \n \u003cp\u003e 在Struts2項目啓動之後,已註冊的偵聽器類QuartzSchedulerListener.java\u0026nbsp;將被激發,\u0026nbsp;並調用\u0026nbsp;Quartz\u0026nbsp;作業,每10秒執行SchedulerTask.printSchedulerMessage()方法。 \u003c/p\u003e \n \u003ch2\u003e 下載源代碼 \u003c/h2\u003e \n \u003cdiv\u003e\n 下載網址 –\u0026nbsp; \n \u003ca href=\"http://pan.baidu.com/s/1c0E2QM8\"\u003ehttp://pan.baidu.com/s/1c0E2QM8\u003c/a\u003e \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"79:T2b8b,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n 在上篇\u0026nbsp;Struts2 + Hibernate集成\u0026nbsp;實例中,\u0026nbsp;它使用\u0026nbsp;servlet\u0026nbsp;上下文監聽\u0026nbsp;Hibernate\u0026nbsp;的\u0026nbsp;Session,而且把Struts2和Hibernate框架集成。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e 但是,總有一些東西要提高。在本教程中,我們將展示如何整合Struts2+Hibernate,並使用Struts2一個名爲「\u003ca href=\"http://code.google.com/p/full-hibernate-plugin-for-struts2/\"\u003eFull Hibernate Plugin\u003c/a\u003e「的插件。 \u003c/p\u003e \n\u003cdiv\u003e\n 見下面的集成步驟: \n\u003c/div\u003e \n\u003col\u003e \n \u003cli\u003e 把 「Full Hibernate Plugin」 jar 放入到工程類路徑。 \u003c/li\u003e \n \u003cli\u003e 使用 「@SessionTarget」 註釋來注入到 Hibernate session; 當「@TransactionTarget」 註釋注入到Hibernate 事務。 \u003c/li\u003e \n \u003cli\u003e 在\u0026nbsp;struts.xml, 讓包擴展 「hibernate-default「,而不是默認的堆棧。 \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e 看看下面的關係: \u003c/p\u003e \n\u003cpre\u003eStruts 2 \u0026lt;-- (Full Hibernate Plugin) ---\u0026gt; Hibernate \u0026lt;-----\u0026gt; Database\u003c/pre\u003e \n\u003cdiv\u003e \n \u003cstrong\u003e注,\u003c/strong\u003e \n \u003cbr\u003e \n \u003cspan\u003e本教程是從以前的\u003c/span\u003e\u0026nbsp;Struts2 + Hibernate集成\u0026nbsp;實例(servlet context listener)更新版本。 \n \u003cspan\u003e因此,JSP 和 Hibernate 配置基本相同,只是\u003c/span\u003e \n \u003cspan\u003e整合的部分是有點不同,嘗試比較既能發現不同。\u003c/span\u003e \n\u003c/div\u003e \n\u003ch2\u003e 1. 工程結構 \u003c/h2\u003e \n\u003cdiv\u003e\n 在節教程,我們創建一個工程名爲 full-hibernate 的web工程。看看這個項目文件夾的完整結構。 \n \u003cbr\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2+hibernatefull-hibernate-plugin-1.png\" alt=\"Struts2+Hibernate使用Full Hibernate Plugin集成\"\u003e \n \u003cbr\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003ch2\u003e 2. MySQL創建表腳本 \u003c/h2\u003e \n\u003cp\u003e Customer表結構 \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-bsh\"\u003eCREATE TABLE `customer` (\r\n `customer_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,\r\n `name` varchar(45) NOT NULL,\r\n `address` varchar(255) NOT NULL,\r\n `create_date` datetime NOT NULL,\r\n PRIMARY KEY (`customer_id`)\r\n) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;\u003c/pre\u003e \n\u003ch2\u003e 3. Hibernate相關配置 \u003c/h2\u003e \n\u003cdiv\u003e\n 所有\u0026nbsp;Hibernate\u0026nbsp;的模型和配置的東西。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eCustomer.java\u003c/strong\u003e\u0026nbsp;– 爲customer 表創建一個類。 \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.customer.model;\r\n\r\nimport java.util.Date;\r\n\r\npublic class Customer implements java.io.Serializable {\r\n\r\n\tprivate Long customerId;\r\n\tprivate String name;\r\n\tprivate String address;\r\n\tprivate Date createdDate;\r\n\r\n\t//getter and setter methods\r\n}\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eCustomer.hbm.xml\u003c/strong\u003e\u0026nbsp;– Hibernate 的 customer 表映射。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\"?\u0026gt;\r\n\u0026lt;!DOCTYPE hibernate-mapping PUBLIC \"-//Hibernate/Hibernate Mapping DTD 3.0//EN\"\r\n\"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd\"\u0026gt;\r\n\u0026lt;!-- Generated 20 Julai 2010 11:40:18 AM by Hibernate Tools 3.2.5.Beta --\u0026gt;\r\n\u0026lt;hibernate-mapping\u0026gt;\r\n \u0026lt;class name=\"com.yiibai.customer.model.Customer\" \r\n\t\ttable=\"customer\" catalog=\"yiibai\"\u0026gt;\r\n \u0026lt;id name=\"customerId\" type=\"java.lang.Long\"\u0026gt;\r\n \u0026lt;column name=\"CUSTOMER_ID\" /\u0026gt;\r\n \u0026lt;generator class=\"identity\" /\u0026gt;\r\n \u0026lt;/id\u0026gt;\r\n \u0026lt;property name=\"name\" type=\"string\"\u0026gt;\r\n \u0026lt;column name=\"NAME\" length=\"45\" not-null=\"true\" /\u0026gt;\r\n \u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"address\" type=\"string\"\u0026gt;\r\n \u0026lt;column name=\"ADDRESS\" not-null=\"true\" /\u0026gt;\r\n \u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"createdDate\" type=\"timestamp\"\u0026gt;\r\n \u0026lt;column name=\"CREATED_DATE\" length=\"19\" not-null=\"true\" /\u0026gt;\r\n \u0026lt;/property\u0026gt;\r\n \u0026lt;/class\u0026gt;\r\n\u0026lt;/hibernate-mapping\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 文件: hibernate.cfg.xml, Hibernate 數據庫配置 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"utf-8\"?\u0026gt;\r\n\u0026lt;!DOCTYPE hibernate-configuration PUBLIC\r\n\"-//Hibernate/Hibernate Configuration DTD 3.0//EN\"\r\n\"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd\"\u0026gt;\r\n\u0026lt;hibernate-configuration\u0026gt;\r\n \u0026lt;session-factory\u0026gt;\r\n \u0026lt;property name=\"hibernate.bytecode.use_reflection_optimizer\"\u0026gt;false\u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"hibernate.connection.password\"\u0026gt;password\u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"hibernate.connection.url\"\u0026gt;jdbc:mysql://localhost:3306/yiibai\u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"hibernate.connection.username\"\u0026gt;root\u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"hibernate.dialect\"\u0026gt;org.hibernate.dialect.MySQLDialect\u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"show_sql\"\u0026gt;true\u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"format_sql\"\u0026gt;true\u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"use_sql_comments\"\u0026gt;false\u0026lt;/property\u0026gt;\r\n \u0026lt;mapping resource=\"com/yiibai/customer/hibernate/Customer.hbm.xml\" /\u0026gt;\r\n \u0026lt;/session-factory\u0026gt;\r\n\u0026lt;/hibernate-configuration\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. DAO \u003c/h2\u003e \n\u003cp\u003e 實現DAO設計模式執行數據庫操作。在\u0026nbsp;CustomerDAOImpl\u0026nbsp;類,\u0026nbsp;聲明Hibernate會話和事務爲類成員。在Struts\u0026nbsp;2的項目初始化,\u0026nbsp;「Full Hibernate Plugin」\u0026nbsp;使用\u0026nbsp;@SessionTarget\u0026nbsp;和\u0026nbsp;@TransactionTarget\u0026nbsp;分別標註將注入相應的 Hibernate 會話和事務成爲類成員。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eCustomerDAO.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.customer.dao;\r\n\r\nimport java.util.List;\r\n\r\nimport com.yiibai.customer.model.Customer;\r\n \r\npublic interface CustomerDAO{\r\n\t\r\n\tvoid addCustomer(Customer customer);\r\n\t\r\n\tList\u0026lt;Customer\u0026gt; listCustomer();\r\n\t\r\n}\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eCustomerDAOImpl.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.customer.dao.impl;\r\n\r\nimport java.util.List;\r\n\r\nimport org.hibernate.Session;\r\nimport org.hibernate.Transaction;\r\n\r\nimport com.googlecode.s2hibernate.struts2.plugin.annotations.SessionTarget;\r\nimport com.googlecode.s2hibernate.struts2.plugin.annotations.TransactionTarget;\r\nimport com.yiibai.customer.dao.CustomerDAO;\r\nimport com.yiibai.customer.model.Customer;\r\n \r\npublic class CustomerDAOImpl implements CustomerDAO{\r\n\t\r\n\t@SessionTarget\r\n\tSession session;\r\n\t \r\n\t@TransactionTarget\r\n\tTransaction transaction;\r\n\t\r\n\t//add the customer\r\n\tpublic void addCustomer(Customer customer){\r\n\t\t\r\n\t\tsession.save(customer);\r\n\t\t\r\n\t}\r\n\t\r\n\t//return all the customers in list\r\n\tpublic List\u0026lt;Customer\u0026gt; listCustomer(){\r\n\t\t\r\n\t\treturn session.createQuery(\"from Customer\").list();\r\n\t\t\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 6. Action \u003c/h2\u003e \n\u003cdiv\u003e\n 在Action類,調用DAO類來執行數據庫操作。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eCustomerAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.customer.action;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.Date;\r\nimport java.util.List;\r\n\r\nimport com.yiibai.customer.dao.CustomerDAO;\r\nimport com.yiibai.customer.dao.impl.CustomerDAOImpl;\r\nimport com.yiibai.customer.model.Customer;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\nimport com.opensymphony.xwork2.ModelDriven;\r\n \r\npublic class CustomerAction extends ActionSupport \r\n\timplements ModelDriven{\r\n\r\n\tCustomer customer = new Customer();\r\n\tList\u0026lt;Customer\u0026gt; customerList = new ArrayList\u0026lt;Customer\u0026gt;();\r\n\tCustomerDAO customerDAO = new CustomerDAOImpl();\r\n\t\r\n\tpublic String execute() throws Exception {\r\n\t\treturn SUCCESS;\r\n\t}\r\n\r\n\tpublic Object getModel() {\r\n\t\treturn customer;\r\n\t}\r\n\t\r\n\tpublic List\u0026lt;Customer\u0026gt; getCustomerList() {\r\n\t\treturn customerList;\r\n\t}\r\n\r\n\tpublic void setCustomerList(List\u0026lt;Customer\u0026gt; customerList) {\r\n\t\tthis.customerList = customerList;\r\n\t}\r\n\r\n\t//save customer\r\n\tpublic String addCustomer() throws Exception{\r\n\t\t\r\n\t\t//save it\r\n\t\tcustomer.setCreatedDate(new Date());\r\n\t\tcustomerDAO.addCustomer(customer);\r\n\t \r\n\t\t//reload the customer list\r\n\t\tcustomerList = null;\r\n\t\tcustomerList = customerDAO.listCustomer();\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t\r\n\t}\r\n\t\r\n\t//list all customers\r\n\tpublic String listCustomer() throws Exception{\r\n\t\t\r\n\t\tcustomerList = customerDAO.listCustomer();\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 7. JSP 頁面 \u003c/h2\u003e \n\u003cdiv\u003e\n JSP頁面添加並列出客戶。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003ecustomer.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 Full Hibernate Plugin example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;Add Customer\u0026lt;/h2\u0026gt;\r\n\u0026lt;s:form action=\"addCustomerAction\" \u0026gt;\r\n \u0026lt;s:textfield name=\"name\" label=\"Name\" value=\"\" /\u0026gt;\r\n \u0026lt;s:textarea name=\"address\" label=\"Address\" value=\"\" cols=\"50\" rows=\"5\" /\u0026gt;\r\n \u0026lt;s:submit /\u0026gt;\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;All Customers\u0026lt;/h2\u0026gt;\r\n\r\n\u0026lt;s:if test=\"customerList.size() \u0026gt; 0\"\u0026gt;\r\n\u0026lt;table border=\"1px\" cellpadding=\"8px\"\u0026gt;\r\n\t\u0026lt;tr\u0026gt;\r\n\t\t\u0026lt;th\u0026gt;Customer Id\u0026lt;/th\u0026gt;\r\n\t\t\u0026lt;th\u0026gt;Name\u0026lt;/th\u0026gt;\r\n\t\t\u0026lt;th\u0026gt;Address\u0026lt;/th\u0026gt;\r\n\t\t\u0026lt;th\u0026gt;Created Date\u0026lt;/th\u0026gt;\r\n\t\u0026lt;/tr\u0026gt;\r\n\t\u0026lt;s:iterator value=\"customerList\" status=\"userStatus\"\u0026gt;\r\n\t\t\u0026lt;tr\u0026gt;\r\n\t\t\t\u0026lt;td\u0026gt;\u0026lt;s:property value=\"customerId\" /\u0026gt;\u0026lt;/td\u0026gt;\r\n\t\t\t\u0026lt;td\u0026gt;\u0026lt;s:property value=\"name\" /\u0026gt;\u0026lt;/td\u0026gt;\r\n\t\t\t\u0026lt;td\u0026gt;\u0026lt;s:property value=\"address\" /\u0026gt;\u0026lt;/td\u0026gt;\r\n\t\t\t\u0026lt;td\u0026gt;\u0026lt;s:date name=\"createdDate\" format=\"dd/MM/yyyy\" /\u0026gt;\u0026lt;/td\u0026gt;\r\n\t\t\u0026lt;/tr\u0026gt;\r\n\t\u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/table\u0026gt;\r\n\u0026lt;/s:if\u0026gt;\r\n\u0026lt;br/\u0026gt;\r\n\u0026lt;br/\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 8. struts.xml \u003c/h2\u003e \n\u003cp\u003e 鏈接所有〜讓包擴展\u0026nbsp;「hibernate-default」 來代替\u0026nbsp;「struts-default「. \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \t\r\n \u0026lt;package name=\"default\" namespace=\"/\" extends=\"hibernate-default\"\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"addCustomerAction\" \r\n\tclass=\"com.yiibai.customer.action.CustomerAction\" method=\"addCustomer\" \u0026gt;\r\n \u0026lt;result name=\"success\"\u0026gt;pages/customer.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\r\n \u0026lt;action name=\"listCustomerAction\" \r\n\tclass=\"com.yiibai.customer.action.CustomerAction\" method=\"listCustomer\" \u0026gt;\r\n \u0026lt;result name=\"success\"\u0026gt;pages/customer.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\t\r\n\u0026lt;/package\u0026gt;\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 9. 實例 \u003c/h2\u003e \n\u003cp\u003e 訪問以下網址 :\u0026nbsp;\u003ca href=\"http://localhost:8080/full-hibernate/addCustomerAction.action\"\u003ehttp://localhost:8080/full-hibernate/addCustomerAction.action\u003c/a\u003e\u003cbr\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2+hibernatefull-hibernate-plugin-2.png\" alt=\"Struts2+Hibernate使用Full Hibernate Plugin集成\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2+hibernatefull-hibernate-plugin-3.png\" alt=\"Struts2+Hibernate使用Full Hibernate Plugin集成\"\u003e \u003c/p\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://code.google.com/p/full-hibernate-plugin-for-struts2/\"\u003eStruts2 Full Hibernate插件文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e Struts2 + Hibernate集成實例 \u003c/li\u003e \n \u003cli\u003e 安裝庫到Maven本地資源庫 \u003c/li\u003e \n\u003c/ol\u003e \n\u003ch2\u003e 下載代碼 \u003c/h2\u003e \n\u003cdiv\u003e\n 下載所有源代碼 –\u0026nbsp; \n \u003ca href=\"http://pan.baidu.com/s/1o6tjSam\"\u003ehttp://pan.baidu.com/s/1o6tjSam\u003c/a\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"7a:T2e8a,"])</script><script>self.__next_f.push([1,"\u003cdiv class=\"__kindeditor_paste__\"\u003e \n \u003cdiv\u003e \n \u003cdiv\u003e\n 在 Struts2 中,沒有官方的插件集成Hibernate框架。但是,可以通過以下步驟解決方法: \n \u003c/div\u003e \n \u003c/div\u003e \n \u003cdiv\u003e \n \u003col\u003e \n \u003cli\u003e 註冊一個自定義的\u0026nbsp;ServletContextListener \u003c/li\u003e \n \u003cli\u003e 在\u0026nbsp;ServletContextListener\u0026nbsp;類,\u0026nbsp;初始化Hibernate會話,並將其存儲到servlet上下文。 \u003c/li\u003e \n \u003cli\u003e 在動作類,\u0026nbsp;可以通過servlet上下文的Hibernate會話,並執行任務正常的Hibernate操作。 \u003c/li\u003e \n \u003c/ol\u003e \n \u003cdiv\u003e\n 請參閱它們的關係: \n \u003c/div\u003e \n \u003cpre\u003eStruts 2 \u0026lt;-- (Servlet Context) ---\u0026gt; Hibernate \u0026lt;-----\u0026gt; Database \u0026nbsp;\u003c/pre\u003e \n \u003cp\u003e 在本教程中,在Struts中2開發我們顯示了一個簡單的客戶模塊(添加和列表功能),並使用 Hibernate 進行數據庫操作。使用上述部分機制集成(存儲和檢索在servlet上下文Hibernate的Session)。 \u003c/p\u003e \n \u003ch2\u003e 1. 工程目錄結構 \u003c/h2\u003e \n \u003cdiv\u003e\n 來看看這個完整的項目文件夾結構。 \n \u003cbr\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2+hibernate-1.png\" alt=\"Struts2+Hibernate集成實例\"\u003e \n \u003c/div\u003e \n \u003ch2\u003e 2. MySQL表結構腳本 \u003c/h2\u003e \n \u003cdiv\u003e\n 創建一個客戶(customer)表。下面是SQL表腳本。 \n \u003cbr\u003e \n \u003cpre class=\"prettyprint\"\u003eCREATE TABLE `customer` (\r\n `customer_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,\r\n `name` varchar(45) NOT NULL,\r\n `address` varchar(255) NOT NULL,\r\n `create_date` datetime NOT NULL,\r\n PRIMARY KEY (`customer_id`)\r\n) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;\u003c/pre\u003e \n \u003c/div\u003e \n \u003ch2\u003e 4. Hibernate 相關配置 \u003c/h2\u003e \n \u003cdiv\u003e\n Hibernate的模型和配置的東西。 \n \u003c/div\u003e \n \u003cp\u003e Customer.java\u0026nbsp;–\u0026nbsp;創建客戶表對應的一個類。 \u003c/p\u003e \n \u003cpre\u003epackage com.yiibai.customer.model;\r\n\r\nimport java.util.Date;\r\n\r\npublic class Customer implements java.io.Serializable {\r\n\r\n\tprivate Long customerId;\r\n\tprivate String name;\r\n\tprivate String address;\r\n\tprivate Date createdDate;\r\n\r\n\t//getter and setter methods\r\n}\u003c/pre\u003e \n \u003cp\u003e \u003cstrong\u003eCustomer.hbm.xml\u003c/strong\u003e\u0026nbsp;–\u0026nbsp;\u003cspan\u003eHibernate映射文件客戶表。\u003c/span\u003e \u003c/p\u003e \n \u003cpre\u003e\u0026lt;?xml version=\"1.0\"?\u0026gt;\r\n\u0026lt;!DOCTYPE hibernate-mapping PUBLIC \"-//Hibernate/Hibernate Mapping DTD 3.0//EN\"\r\n\"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd\"\u0026gt;\r\n\u0026lt;hibernate-mapping\u0026gt;\r\n \u0026lt;class name=\"com.yiibai.customer.model.Customer\" \r\n\ttable=\"customer\" catalog=\"yiibai\"\u0026gt;\r\n\r\n \u0026lt;id name=\"customerId\" type=\"java.lang.Long\"\u0026gt;\r\n \u0026lt;column name=\"CUSTOMER_ID\" /\u0026gt;\r\n \u0026lt;generator class=\"identity\" /\u0026gt;\r\n \u0026lt;/id\u0026gt;\r\n \u0026lt;property name=\"name\" type=\"string\"\u0026gt;\r\n \u0026lt;column name=\"NAME\" length=\"45\" not-null=\"true\" /\u0026gt;\r\n \u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"address\" type=\"string\"\u0026gt;\r\n \u0026lt;column name=\"ADDRESS\" not-null=\"true\" /\u0026gt;\r\n \u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"createdDate\" type=\"timestamp\"\u0026gt;\r\n \u0026lt;column name=\"CREATED_DATE\" length=\"19\" not-null=\"true\" /\u0026gt;\r\n \u0026lt;/property\u0026gt;\r\n \u0026lt;/class\u0026gt;\r\n\u0026lt;/hibernate-mapping\u0026gt;\u003c/pre\u003e \n \u003cp\u003e \u003cstrong\u003ehibernate.cfg.xml\u003c/strong\u003e\u0026nbsp;– Hibernate數據庫配置文件 \u003c/p\u003e \n \u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"utf-8\"?\u0026gt;\r\n\u0026lt;!DOCTYPE hibernate-configuration PUBLIC\r\n\"-//Hibernate/Hibernate Configuration DTD 3.0//EN\"\r\n\"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd\"\u0026gt;\r\n\u0026lt;hibernate-configuration\u0026gt;\r\n \u0026lt;session-factory\u0026gt;\r\n \u0026lt;property name=\"hibernate.bytecode.use_reflection_optimizer\"\u0026gt;false\u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"hibernate.connection.password\"\u0026gt;password\u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"hibernate.connection.url\"\u0026gt;jdbc:mysql://localhost:3306/yiibai\u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"hibernate.connection.username\"\u0026gt;root\u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"hibernate.dialect\"\u0026gt;org.hibernate.dialect.MySQLDialect\u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"show_sql\"\u0026gt;true\u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"format_sql\"\u0026gt;true\u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"use_sql_comments\"\u0026gt;false\u0026lt;/property\u0026gt;\r\n \u0026lt;mapping resource=\"com/yiibai/customer/hibernate/Customer.hbm.xml\" /\u0026gt;\r\n \u0026lt;/session-factory\u0026gt;\r\n\u0026lt;/hibernate-configuration\u0026gt;\u003c/pre\u003e \n \u003ch2\u003e 5. Hibernate ServletContextListener \u003c/h2\u003e \n \u003cp\u003e 創建一個類\u0026nbsp;ServletContextListener,\u0026nbsp;並初始化Hibernate會話,並將其存儲到servlet上下文。 \u003c/p\u003e \n \u003cp\u003e \u003cstrong\u003eHibernateListener .java\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003epackage com.yiibai.listener;\r\n\r\nimport java.net.URL;\r\n\r\nimport javax.servlet.ServletContextEvent;\r\nimport javax.servlet.ServletContextListener;\r\n\r\nimport org.hibernate.SessionFactory;\r\nimport org.hibernate.cfg.Configuration;\r\n \r\npublic class HibernateListener implements ServletContextListener{\r\n \r\n private Configuration config;\r\n private SessionFactory factory;\r\n private String path = \"/hibernate.cfg.xml\";\r\n private static Class clazz = HibernateListener.class;\r\n \r\n public static final String KEY_NAME = clazz.getName();\r\n\r\n\tpublic void contextDestroyed(ServletContextEvent event) {\r\n\t //\r\n\t}\r\n \r\n\tpublic void contextInitialized(ServletContextEvent event) {\r\n \r\n\t try { \r\n\t URL url = HibernateListener.class.getResource(path);\r\n\t config = new Configuration().configure(url);\r\n\t factory = config.buildSessionFactory();\r\n\t \r\n\t //save the Hibernate session factory into serlvet context\r\n\t event.getServletContext().setAttribute(KEY_NAME, factory);\r\n\t } catch (Exception e) {\r\n\t System.out.println(e.getMessage());\r\n\t }\r\n\t}\r\n}\u003c/pre\u003e \n \u003cdiv\u003e\n 在 web.xml 文件中註冊監聽器。 \n \u003c/div\u003e \n \u003cp\u003e \u003cstrong\u003eweb.xml\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003e\u0026lt;!DOCTYPE web-app PUBLIC\r\n \"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN\"\r\n \"http://java.sun.com/dtd/web-app_2_3.dtd\" \u0026gt;\r\n\r\n\u0026lt;web-app\u0026gt;\r\n \u0026lt;display-name\u0026gt;Struts 2 Web Application\u0026lt;/display-name\u0026gt;\r\n \r\n \u0026lt;filter\u0026gt;\r\n\t\u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n\t\u0026lt;filter-class\u0026gt;\r\n\t org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter\r\n\t\u0026lt;/filter-class\u0026gt;\r\n \u0026lt;/filter\u0026gt;\r\n \r\n \u0026lt;filter-mapping\u0026gt;\r\n\t\u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n\t\u0026lt;url-pattern\u0026gt;/*\u0026lt;/url-pattern\u0026gt;\r\n \u0026lt;/filter-mapping\u0026gt;\r\n \r\n \u0026lt;listener\u0026gt;\r\n \u0026lt;listener-class\u0026gt;\r\n\t com.yiibai.listener.HibernateListener\r\n \u0026lt;/listener-class\u0026gt;\r\n \u0026lt;/listener\u0026gt;\r\n \r\n\u0026lt;/web-app\u0026gt;\u003c/pre\u003e \n \u003ch2\u003e 6. Action \u003c/h2\u003e \n \u003cp\u003e 在動作類,\u0026nbsp;可以通過servlet上下文的Hibernate會話和執行正常的Hibernate任務。 \u003c/p\u003e \n \u003cp\u003e \u003cstrong\u003eCustomerAction.java\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003epackage com.yiibai.customer.action;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.Date;\r\nimport java.util.List;\r\n\r\nimport org.apache.struts2.ServletActionContext;\r\nimport org.hibernate.Session;\r\nimport org.hibernate.SessionFactory;\r\n\r\nimport com.yiibai.customer.model.Customer;\r\nimport com.yiibai.listener.HibernateListener;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\nimport com.opensymphony.xwork2.ModelDriven;\r\n \r\npublic class CustomerAction extends ActionSupport \r\n\timplements ModelDriven{\r\n\r\n\tCustomer customer = new Customer();\r\n\tList\u0026lt;Customer\u0026gt; customerList = new ArrayList\u0026lt;Customer\u0026gt;();\r\n\t\r\n\tpublic String execute() throws Exception {\r\n\t\treturn SUCCESS;\r\n\t}\r\n\r\n\tpublic Object getModel() {\r\n\t\treturn customer;\r\n\t}\r\n\t\r\n\tpublic List\u0026lt;Customer\u0026gt; getCustomerList() {\r\n\t\treturn customerList;\r\n\t}\r\n\r\n\tpublic void setCustomerList(List\u0026lt;Customer\u0026gt; customerList) {\r\n\t\tthis.customerList = customerList;\r\n\t}\r\n\r\n\t//save customer\r\n\tpublic String addCustomer() throws Exception{\r\n\t\t\r\n\t\t//get hibernate session from the servlet context\r\n\t\tSessionFactory sessionFactory = \r\n\t (SessionFactory) ServletActionContext.getServletContext()\r\n .getAttribute(HibernateListener.KEY_NAME);\r\n\r\n\t\tSession session = sessionFactory.openSession();\r\n\r\n\t\t//save it\r\n\t\tcustomer.setCreatedDate(new Date());\r\n\t \r\n\t\tsession.beginTransaction();\r\n\t\tsession.save(customer);\r\n\t\tsession.getTransaction().commit();\r\n\t \r\n\t\t//reload the customer list\r\n\t\tcustomerList = null;\r\n\t\tcustomerList = session.createQuery(\"from Customer\").list();\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t\r\n\t}\r\n\t\r\n\t//list all customers\r\n\tpublic String listCustomer() throws Exception{\r\n\t\t\r\n\t\t//get hibernate session from the servlet context\r\n\t\tSessionFactory sessionFactory = \r\n\t (SessionFactory) ServletActionContext.getServletContext()\r\n .getAttribute(HibernateListener.KEY_NAME);\r\n\r\n\t\tSession session = sessionFactory.openSession();\r\n\r\n\t\tcustomerList = session.createQuery(\"from Customer\").list();\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t\r\n\t}\t\r\n}\u003c/pre\u003e \n \u003ch2\u003e 7. JSP 頁面 \u003c/h2\u003e \n \u003cdiv\u003e\n JSP頁面用來添加和列出的客戶。 \n \u003c/div\u003e \n \u003cp\u003e \u003cstrong\u003ecustomer.jsp\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 + Hibernate integration example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;Add Customer\u0026lt;/h2\u0026gt;\r\n\u0026lt;s:form action=\"addCustomerAction\" \u0026gt;\r\n \u0026lt;s:textfield name=\"name\" label=\"Name\" value=\"\" /\u0026gt;\r\n \u0026lt;s:textarea name=\"address\" label=\"Address\" value=\"\" cols=\"50\" rows=\"5\" /\u0026gt;\r\n \u0026lt;s:submit /\u0026gt;\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;All Customers\u0026lt;/h2\u0026gt;\r\n\r\n\u0026lt;s:if test=\"customerList.size() \u0026gt; 0\"\u0026gt;\r\n\u0026lt;table border=\"1px\" cellpadding=\"8px\"\u0026gt;\r\n\t\u0026lt;tr\u0026gt;\r\n\t\t\u0026lt;th\u0026gt;Customer Id\u0026lt;/th\u0026gt;\r\n\t\t\u0026lt;th\u0026gt;Name\u0026lt;/th\u0026gt;\r\n\t\t\u0026lt;th\u0026gt;Address\u0026lt;/th\u0026gt;\r\n\t\t\u0026lt;th\u0026gt;Created Date\u0026lt;/th\u0026gt;\r\n\t\u0026lt;/tr\u0026gt;\r\n\t\u0026lt;s:iterator value=\"customerList\" status=\"userStatus\"\u0026gt;\r\n\t\t\u0026lt;tr\u0026gt;\r\n\t\t\t\u0026lt;td\u0026gt;\u0026lt;s:property value=\"customerId\" /\u0026gt;\u0026lt;/td\u0026gt;\r\n\t\t\t\u0026lt;td\u0026gt;\u0026lt;s:property value=\"name\" /\u0026gt;\u0026lt;/td\u0026gt;\r\n\t\t\t\u0026lt;td\u0026gt;\u0026lt;s:property value=\"address\" /\u0026gt;\u0026lt;/td\u0026gt;\r\n\t\t\t\u0026lt;td\u0026gt;\u0026lt;s:date name=\"createdDate\" format=\"dd/MM/yyyy\" /\u0026gt;\u0026lt;/td\u0026gt;\r\n\t\t\u0026lt;/tr\u0026gt;\r\n\t\u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/table\u0026gt;\r\n\u0026lt;/s:if\u0026gt;\r\n\u0026lt;br/\u0026gt;\r\n\u0026lt;br/\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n \u003ch2\u003e 8. struts.xml \u003c/h2\u003e \n \u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \t\r\n \u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"addCustomerAction\" \r\n\tclass=\"com.yiibai.customer.action.CustomerAction\" method=\"addCustomer\" \u0026gt;\r\n \u0026lt;result name=\"success\"\u0026gt;pages/customer.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\r\n \u0026lt;action name=\"listCustomerAction\" \r\n\tclass=\"com.yiibai.customer.action.CustomerAction\" method=\"listCustomer\" \u0026gt;\r\n \u0026lt;result name=\"success\"\u0026gt;pages/customer.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\t\t\r\n\r\n \u0026lt;/package\u0026gt;\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n \u003ch2\u003e 9. 實例測試執行 \u003c/h2\u003e \n \u003cp\u003e 訪問客戶模塊:http://localhost:8080/struts2hibernate/listCustomerAction.action\u003cbr\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2+hibernate-2.png\" alt=\"Struts2+Hibernate集成實例\"\u003e \u003c/p\u003e \n \u003cdiv\u003e\n 在名稱和地址字段填寫,點擊提交按鈕,插入的客戶的詳細信息會馬上列出結果。 \n \u003cbr\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2+hibernate-3.png\" alt=\"Struts2+Hibernate集成實例\"\u003e \n \u003cbr\u003e \n \u003c/div\u003e \n \u003ch2\u003e 參考 \u003c/h2\u003e \n \u003col\u003e \n \u003cli\u003e Struts2 + Hibernate使用「Full Hibernate Plugin\"集成 \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://java.sun.com/products/servlet/2.3/javadoc/javax/servlet/ServletContextListener.html\"\u003eServletContextListener 文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e Struts + Hibernate集成實例 \u003c/li\u003e \n \u003c/ol\u003e \n \u003c/div\u003e \n\u003c/div\u003e 代碼下載 - \n\u003ca href=\"http://pan.baidu.com/s/1hqhQJ7A\"\u003ehttp://pan.baidu.com/s/1hqhQJ7A\u003c/a\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"7b:T3dc9,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n 在本教程中,它顯示的集成\u0026nbsp;「Struts2 + Spring + Hibernate「,請務必檢查以下之前繼續學習教程。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003col\u003e \n \u003cli\u003e Struts2 + Hibernate集成實例 \u003c/li\u003e \n \u003cli\u003e Struts2 + Spring 集成實例 \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv\u003e\n 參見集成步驟總結: \n\u003c/div\u003e \n\u003col\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 獲取所有的依賴庫(很多)。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 註冊 Spring 的 ContextLoaderListener 來整合 Struts2 和 Spring。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 使用 Spring 的 LocalSessionFactoryBean 來集成 Spring 和 Hibernate。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 完成所有連接。 \n \u003c/div\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv\u003e\n 請參閱它們之的關係: \n\u003c/div\u003e \n\u003cpre\u003eStruts 2 \u0026lt;-- (ContextLoaderListener) --\u0026gt; Spring \u0026lt;-- (LocalSessionFactoryBean) --\u0026gt; Hibernate\u003c/pre\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 這將是一個很長的教程,相關解釋並不是很多,請務必閱讀上述2篇文章的詳細情況說明以方面學習。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e 這將要創建一個客戶頁面,以添加客戶和列表的自定義函數。前端使用Struts2顯示,Spring作爲依賴注入引擎,而\u0026nbsp;Hibernate\u0026nbsp;用來執行數據庫操作。讓我們開始... \u003c/p\u003e \n\u003ch2\u003e 1. 工程文件夾結構 \u003c/h2\u003e \n\u003cp\u003e 在本章中,我們創建一個 ssh 的web工程,工程的目錄結構如下圖所示:\u003cbr\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2+spring+hibernate-1.png\" alt=\"Struts2+Spring+Hibernate集成實例\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2+spring+hibernate-2.png\" alt=\"Struts2+Spring+Hibernate集成實例\"\u003e \u003c/p\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003ch2\u003e 2. MySQL表結構結構 \u003c/h2\u003e \n\u003cdiv\u003e\n 客戶(customer)表腳本。 \n\u003c/div\u003e \n\u003cpre\u003eDROP TABLE IF EXISTS `yiibai`.`customer`;\r\nCREATE TABLE `yiibai`.`customer` (\r\n `CUSTOMER_ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,\r\n `NAME` varchar(45) NOT NULL,\r\n `ADDRESS` varchar(255) NOT NULL,\r\n `CREATED_DATE` datetime NOT NULL,\r\n PRIMARY KEY (`CUSTOMER_ID`)\r\n) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;\u003c/pre\u003e \n\u003ch2\u003e 3. Hibernate相關配置 \u003c/h2\u003e \n\u003cdiv\u003e\n 只有模型和映射文件是必需的,因爲這裏要用Spring處理Hibernate配置。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eCustomer.java\u003c/strong\u003e\u0026nbsp;–\u0026nbsp;\u003cspan\u003e創建客戶表對應的一個類。\u003c/span\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.customer.model;\r\n\r\nimport java.util.Date;\r\n\r\npublic class Customer implements java.io.Serializable {\r\n\r\n\tprivate Long customerId;\r\n\tprivate String name;\r\n\tprivate String address;\r\n\tprivate Date createdDate;\r\n\r\n\t//getter and setter methods\r\n}\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eCustomer.hbm.xml\u003c/strong\u003e\u0026nbsp;–\u0026nbsp;\u003cspan\u003eHibernate的客戶映射文件。\u003c/span\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\"?\u0026gt;\r\n\u0026lt;!DOCTYPE hibernate-mapping PUBLIC \"-//Hibernate/Hibernate Mapping DTD 3.0//EN\"\r\n\"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd\"\u0026gt;\r\n\u0026lt;!-- Generated 20 Julai 2010 11:40:18 AM by Hibernate Tools 3.2.5.Beta --\u0026gt;\r\n\u0026lt;hibernate-mapping\u0026gt;\r\n \u0026lt;class name=\"com.yiibai.customer.model.Customer\" \r\n\t\ttable=\"customer\" catalog=\"yiibai\"\u0026gt;\r\n \u0026lt;id name=\"customerId\" type=\"java.lang.Long\"\u0026gt;\r\n \u0026lt;column name=\"customer_id\" /\u0026gt;\r\n \u0026lt;generator class=\"identity\" /\u0026gt;\r\n \u0026lt;/id\u0026gt;\r\n \u0026lt;property name=\"name\" type=\"string\"\u0026gt;\r\n \u0026lt;column name=\"name\" length=\"45\" not-null=\"true\" /\u0026gt;\r\n \u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"address\" type=\"string\"\u0026gt;\r\n \u0026lt;column name=\"address\" not-null=\"true\" /\u0026gt;\r\n \u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"createdDate\" type=\"timestamp\"\u0026gt;\r\n \u0026lt;column name=\"create_date\" length=\"19\" not-null=\"true\" /\u0026gt;\r\n \u0026lt;/property\u0026gt;\r\n \u0026lt;/class\u0026gt;\r\n\u0026lt;/hibernate-mapping\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. Struts2相關 \u003c/h2\u003e \n\u003cp\u003e 實現了 Bo 和 DAO 設計模式。所有Bo和DAO將由Spring\u0026nbsp;Spring\u0026nbsp;bean配置文件注入。在DAO中,讓它擴展Spring的HibernateDaoSupport來集成 Spring 和 Hibernate。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eCustomerBo.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.customer.bo;\r\n\r\nimport java.util.List;\r\nimport com.yiibai.customer.model.Customer;\r\n \r\npublic interface CustomerBo{\r\n\t\r\n\tvoid addCustomer(Customer customer);\r\n\tList\u0026lt;Customer\u0026gt; listCustomer();\r\n\t\r\n}\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eCustomerBoImpl.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.customer.bo.impl;\r\n\r\nimport java.util.List;\r\nimport com.yiibai.customer.bo.CustomerBo;\r\nimport com.yiibai.customer.dao.CustomerDAO;\r\nimport com.yiibai.customer.model.Customer;\r\n \r\npublic class CustomerBoImpl implements CustomerBo{\r\n\t\r\n\tCustomerDAO customerDAO;\r\n\t//DI via Spring\r\n\tpublic void setCustomerDAO(CustomerDAO customerDAO) {\r\n\t\tthis.customerDAO = customerDAO;\r\n\t}\r\n\r\n\t//call DAO to save customer\r\n\tpublic void addCustomer(Customer customer){\r\n\t\tcustomerDAO.addCustomer(customer);\r\n\t}\r\n\t\r\n\t//call DAO to return customers\r\n\tpublic List\u0026lt;Customer\u0026gt; listCustomer(){\r\n\t\treturn customerDAO.listCustomer();\r\n\t}\r\n}\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eCustomerDAO.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.customer.dao;\r\n\r\nimport java.util.List;\r\nimport com.yiibai.customer.model.Customer;\r\n \r\npublic interface CustomerDAO{\r\n\t\r\n\tvoid addCustomer(Customer customer);\r\n\tList\u0026lt;Customer\u0026gt; listCustomer();\t\r\n\t\r\n}\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eCustomerDAOImpl.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.customer.dao.impl;\r\n\r\nimport java.util.List;\r\nimport org.springframework.orm.hibernate3.support.HibernateDaoSupport;\r\nimport com.yiibai.customer.dao.CustomerDAO;\r\nimport com.yiibai.customer.model.Customer;\r\n \r\npublic class CustomerDAOImpl extends HibernateDaoSupport \r\n implements CustomerDAO{\r\n\t\r\n\t//add the customer\r\n\tpublic void addCustomer(Customer customer){\r\n\t\tgetHibernateTemplate().save(customer);\r\n\t}\r\n\t\r\n\t//return all the customers in list\r\n\tpublic List\u0026lt;Customer\u0026gt; listCustomer(){\r\n\t\treturn getHibernateTemplate().find(\"from Customer\");\t\t\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eCustomerAction.java\u003c/strong\u003e\u0026nbsp;–\u0026nbsp;\u003cspan\u003eStruts2 的動作不再需要擴展ActionSupport,它將由 Spring 來處理。\u003c/span\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.customer.action;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.Date;\r\nimport java.util.List;\r\n\r\nimport com.yiibai.customer.bo.CustomerBo;\r\nimport com.yiibai.customer.model.Customer;\r\nimport com.opensymphony.xwork2.ModelDriven;\r\n \r\npublic class CustomerAction implements ModelDriven{\r\n\r\n\tCustomer customer = new Customer();\r\n\tList\u0026lt;Customer\u0026gt; customerList = new ArrayList\u0026lt;Customer\u0026gt;();\r\n\t\r\n\tCustomerBo customerBo;\r\n\t//DI via Spring\r\n\tpublic void setCustomerBo(CustomerBo customerBo) {\r\n\t\tthis.customerBo = customerBo;\r\n\t}\r\n\r\n\tpublic Object getModel() {\r\n\t\treturn customer;\r\n\t}\r\n\t\r\n\tpublic List\u0026lt;Customer\u0026gt; getCustomerList() {\r\n\t\treturn customerList;\r\n\t}\r\n\r\n\tpublic void setCustomerList(List\u0026lt;Customer\u0026gt; customerList) {\r\n\t\tthis.customerList = customerList;\r\n\t}\r\n\r\n\t//save customer\r\n\tpublic String addCustomer() throws Exception{\r\n\t\t\r\n\t\t//save it\r\n\t\tcustomer.setCreatedDate(new Date());\r\n\t\tcustomerBo.addCustomer(customer);\r\n\t \r\n\t\t//reload the customer list\r\n\t\tcustomerList = null;\r\n\t\tcustomerList = customerBo.listCustomer();\r\n\t\t\r\n\t\treturn \"success\";\r\n\t\r\n\t}\r\n\t\r\n\t//list all customers\r\n\tpublic String listCustomer() throws Exception{\r\n\t\t\r\n\t\tcustomerList = customerBo.listCustomer();\r\n\t\t\r\n\t\treturn \"success\";\r\n\t\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 6. Spring相關配置 \u003c/h2\u003e \n\u003cdiv\u003e\n 幾乎所有的配置都是在這裏完成是由Spring專門來整合。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eCustomerBean.xml\u003c/strong\u003e\u0026nbsp;–\u0026nbsp;\u003cspan\u003e聲明 Spring 的 bean:Action,\u0026nbsp;BO\u0026nbsp;和\u0026nbsp;DAO.\u003c/span\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\"?\u0026gt;\r\n\u0026lt;beans xmlns=\"http://www.springframework.org/schema/beans\"\r\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans \r\n\thttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd\"\u0026gt;\r\n \r\n \t\u0026lt;bean id=\"customerAction\" class=\"com.yiibai.customer.action.CustomerAction\"\u0026gt;\r\n\t\t\u0026lt;property name=\"customerBo\" ref=\"customerBo\" /\u0026gt;\t\r\n\t\u0026lt;/bean\u0026gt;\r\n\r\n\t\u0026lt;bean id=\"customerBo\" class=\"com.yiibai.customer.bo.impl.CustomerBoImpl\" \u0026gt;\r\n\t\t\u0026lt;property name=\"customerDAO\" ref=\"customerDAO\" /\u0026gt;\r\n\t\u0026lt;/bean\u0026gt;\r\n\t\r\n \t\u0026lt;bean id=\"customerDAO\" class=\"com.yiibai.customer.dao.impl.CustomerDAOImpl\" \u0026gt;\r\n\t\t\u0026lt;property name=\"sessionFactory\" ref=\"sessionFactory\" /\u0026gt;\r\n\t\u0026lt;/bean\u0026gt;\r\n \r\n\u0026lt;/beans\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003edatabase.properties\u003c/strong\u003e\u0026nbsp;– 聲明數據庫詳細信息 \u003c/p\u003e \n\u003cpre\u003ejdbc.driverClassName=com.mysql.jdbc.Driver\r\njdbc.url=jdbc:mysql://localhost:3306/yiibai\r\njdbc.username=root\r\njdbc.password=password\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eDataSource.xml\u003c/strong\u003e\u0026nbsp;– 創建一個數據庫源的Bean\u0026nbsp; \u003c/p\u003e \n\u003cpre\u003e\u0026lt;beans xmlns=\"http://www.springframework.org/schema/beans\"\r\nxmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\nxsi:schemaLocation=\"http://www.springframework.org/schema/beans\r\nhttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd\"\u0026gt;\r\n \r\n \u0026lt;bean \r\n class=\"org.springframework.beans.factory.config.PropertyPlaceholderConfigurer\"\u0026gt;\r\n \u0026lt;property name=\"location\"\u0026gt;\r\n \u0026lt;value\u0026gt;WEB-INF/classes/config/database/properties/database.properties\u0026lt;/value\u0026gt;\r\n \u0026lt;/property\u0026gt;\r\n\u0026lt;/bean\u0026gt;\r\n \r\n \u0026lt;bean id=\"dataSource\" \r\n class=\"org.springframework.jdbc.datasource.DriverManagerDataSource\"\u0026gt;\r\n\t\u0026lt;property name=\"driverClassName\" value=\"${jdbc.driverClassName}\" /\u0026gt;\r\n\t\u0026lt;property name=\"url\" value=\"${jdbc.url}\" /\u0026gt;\r\n\t\u0026lt;property name=\"username\" value=\"${jdbc.username}\" /\u0026gt;\r\n\t\u0026lt;property name=\"password\" value=\"${jdbc.password}\" /\u0026gt;\r\n \u0026lt;/bean\u0026gt;\r\n \r\n\u0026lt;/beans\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eHibernateSessionFactory.xml\u003c/strong\u003e\u0026nbsp;–\u0026nbsp;\u003cspan\u003e創建一個SessionFactory Bean來集成Spring和Hibernate。\u003c/span\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\"?\u0026gt;\r\n\u0026lt;beans xmlns=\"http://www.springframework.org/schema/beans\"\r\nxmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\nxsi:schemaLocation=\"http://www.springframework.org/schema/beans\r\nhttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd\"\u0026gt;\r\n \r\n\u0026lt;!-- Hibernate session factory --\u0026gt;\r\n\u0026lt;bean id=\"sessionFactory\" \r\n class=\"org.springframework.orm.hibernate3.LocalSessionFactoryBean\"\u0026gt;\r\n \r\n \u0026lt;property name=\"dataSource\"\u0026gt;\r\n \u0026lt;ref bean=\"dataSource\"/\u0026gt;\r\n \u0026lt;/property\u0026gt;\r\n \r\n \u0026lt;property name=\"hibernateProperties\"\u0026gt;\r\n \u0026lt;props\u0026gt;\r\n \u0026lt;prop key=\"hibernate.dialect\"\u0026gt;org.hibernate.dialect.MySQLDialect\u0026lt;/prop\u0026gt;\r\n \u0026lt;prop key=\"hibernate.show_sql\"\u0026gt;true\u0026lt;/prop\u0026gt;\r\n \u0026lt;/props\u0026gt;\r\n \u0026lt;/property\u0026gt;\r\n \r\n \u0026lt;property name=\"mappingResources\"\u0026gt;\r\n\t\t\u0026lt;list\u0026gt;\r\n \u0026lt;value\u0026gt;com/yiibai/customer/hibernate/Customer.hbm.xml\u0026lt;/value\u0026gt;\r\n\t\t\u0026lt;/list\u0026gt;\r\n \u0026lt;/property\u0026gt;\t\r\n \r\n\u0026lt;/bean\u0026gt;\r\n\u0026lt;/beans\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eSpringBeans.xml\u003c/strong\u003e\u0026nbsp;–\u0026nbsp;\u003cspan\u003e創建一個核心 Spring 的 bean 配置文件,作爲中央的 bean 管理層。\u003c/span\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;beans xmlns=\"http://www.springframework.org/schema/beans\"\r\nxmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\nxsi:schemaLocation=\"http://www.springframework.org/schema/beans\r\nhttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd\"\u0026gt;\r\n\t\r\n\t\u0026lt;!-- Database Configuration --\u0026gt;\r\n\t\u0026lt;import resource=\"config/spring/DataSource.xml\"/\u0026gt;\r\n\t\u0026lt;import resource=\"config/spring/HibernateSessionFactory.xml\"/\u0026gt;\r\n \r\n\t\u0026lt;!-- Beans Declaration --\u0026gt;\r\n\t\u0026lt;import resource=\"com/yiibai/customer/spring/CustomerBean.xml\"/\u0026gt;\r\n \r\n\u0026lt;/beans\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 7. JSP 頁面 \u003c/h2\u003e \n\u003cdiv\u003e\n JSP頁面來顯示使用 Struts2 標籤的元素。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003ecustomer.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 + Spring + Hibernate integration example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;Add Customer\u0026lt;/h2\u0026gt;\r\n\u0026lt;s:form action=\"addCustomerAction\" \u0026gt;\r\n \u0026lt;s:textfield name=\"name\" label=\"Name\" value=\"\" /\u0026gt;\r\n \u0026lt;s:textarea name=\"address\" label=\"Address\" value=\"\" cols=\"50\" rows=\"5\" /\u0026gt;\r\n \u0026lt;s:submit /\u0026gt;\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;All Customers\u0026lt;/h2\u0026gt;\r\n\r\n\u0026lt;s:if test=\"customerList.size() \u0026gt; 0\"\u0026gt;\r\n\u0026lt;table border=\"1px\" cellpadding=\"8px\"\u0026gt;\r\n\t\u0026lt;tr\u0026gt;\r\n\t\t\u0026lt;th\u0026gt;Customer Id\u0026lt;/th\u0026gt;\r\n\t\t\u0026lt;th\u0026gt;Name\u0026lt;/th\u0026gt;\r\n\t\t\u0026lt;th\u0026gt;Address\u0026lt;/th\u0026gt;\r\n\t\t\u0026lt;th\u0026gt;Created Date\u0026lt;/th\u0026gt;\r\n\t\u0026lt;/tr\u0026gt;\r\n\t\u0026lt;s:iterator value=\"customerList\" status=\"userStatus\"\u0026gt;\r\n\t\t\u0026lt;tr\u0026gt;\r\n\t\t\t\u0026lt;td\u0026gt;\u0026lt;s:property value=\"customerId\" /\u0026gt;\u0026lt;/td\u0026gt;\r\n\t\t\t\u0026lt;td\u0026gt;\u0026lt;s:property value=\"name\" /\u0026gt;\u0026lt;/td\u0026gt;\r\n\t\t\t\u0026lt;td\u0026gt;\u0026lt;s:property value=\"address\" /\u0026gt;\u0026lt;/td\u0026gt;\r\n\t\t\t\u0026lt;td\u0026gt;\u0026lt;s:date name=\"createdDate\" format=\"dd/MM/yyyy\" /\u0026gt;\u0026lt;/td\u0026gt;\r\n\t\t\u0026lt;/tr\u0026gt;\r\n\t\u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/table\u0026gt;\r\n\u0026lt;/s:if\u0026gt;\r\n\u0026lt;br/\u0026gt;\r\n\u0026lt;br/\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 8. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \t\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\r\n\t\t\u0026lt;action name=\"addCustomerAction\" \r\n\t\t\tclass=\"customerAction\" method=\"addCustomer\" \u0026gt;\r\n\t\t \u0026lt;result name=\"success\"\u0026gt;pages/customer.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\r\n\t\t\u0026lt;action name=\"listCustomerAction\"\r\n\t\t\tclass=\"customerAction\" method=\"listCustomer\" \u0026gt;\r\n\t\t \u0026lt;result name=\"success\"\u0026gt;pages/customer.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 9. Struts 2 + Spring \u003c/h2\u003e \n\u003cp\u003e 要集成Struts2和Spring,只需註冊ContextLoaderListener監聽器類,定義一個「contextConfigLocation」參數要求Spring容器來解析「SpringBeans.xml」,而不使用默認的「applicationContext.xml」。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eweb.xml\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;!DOCTYPE web-app PUBLIC\r\n \"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN\"\r\n \"http://java.sun.com/dtd/web-app_2_3.dtd\" \u0026gt;\r\n\r\n\u0026lt;web-app\u0026gt;\r\n \u0026lt;display-name\u0026gt;Struts 2 Web Application\u0026lt;/display-name\u0026gt;\r\n \r\n \u0026lt;filter\u0026gt;\r\n\t\u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n\t\u0026lt;filter-class\u0026gt;\r\n\t org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter\r\n\t\u0026lt;/filter-class\u0026gt;\r\n \u0026lt;/filter\u0026gt;\r\n \r\n \u0026lt;filter-mapping\u0026gt;\r\n\t\u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n\t\u0026lt;url-pattern\u0026gt;/*\u0026lt;/url-pattern\u0026gt;\r\n \u0026lt;/filter-mapping\u0026gt;\r\n \r\n \u0026lt;context-param\u0026gt;\r\n\t\u0026lt;param-name\u0026gt;contextConfigLocation\u0026lt;/param-name\u0026gt;\r\n\t\u0026lt;param-value\u0026gt;/WEB-INF/classes/SpringBeans.xml\u0026lt;/param-value\u0026gt;\r\n \u0026lt;/context-param\u0026gt;\r\n \r\n \u0026lt;listener\u0026gt;\r\n \u0026lt;listener-class\u0026gt;\r\n org.springframework.web.context.ContextLoaderListener\r\n \u0026lt;/listener-class\u0026gt;\r\n \u0026lt;/listener\u0026gt;\r\n \r\n\u0026lt;/web-app\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 10. 運行實例 \u003c/h2\u003e \n\u003cp\u003e 在瀏覽器中打開網址 :\u0026nbsp;http://localhost:8080/ssh/listCustomerAction.action\u003cbr\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2+spring+hibernate-3.png\" alt=\"Struts2+Spring+Hibernate集成實例\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2+spring+hibernate-4.png\" alt=\"Struts2+Spring+Hibernate集成實例\"\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e Struts2 + Hibernate集成實例 \u003c/li\u003e \n \u003cli\u003e Struts2 + Spring集成實例 \u003c/li\u003e \n \u003cli\u003e Struts2 + Hibernate 使用 Full Hibernate Plugin插件集成 \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv\u003e\n 代碼下載 -\u0026nbsp; \n \u003ca href=\"http://pan.baidu.com/s/1mgzt1Xm\"\u003ehttp://pan.baidu.com/s/1mgzt1Xm\u003c/a\u003e\u0026nbsp;(含ssh相關類庫,詳見 lib 目錄,文件大小約:18M)。 \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"7c:T13ad,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n 在本教程中,我們學習如何將log4j框架在Struts2的Web應用程序集成。所有需要做的有: \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003col\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 包含 log4j.jar 作爲項目依賴 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 創建一個 log4j.properties 文件,並把它放入 classpath 的根目錄-放到資源文件夾中。 \n \u003c/div\u003e \u003c/li\u003e \n \u003c/ol\u003e \n \u003cp\u003e 相關技術和工具的使用: \u003c/p\u003e \n \u003col\u003e \n \u003cli\u003e Log4j 1.2.17 \u003c/li\u003e \n \u003cli\u003e Struts 2.1.8 \u003c/li\u003e \n \u003cli\u003e Tomcat 6 \u003c/li\u003e \n \u003cli\u003e MyEclipse 10 \u003c/li\u003e \n \u003c/ol\u003e \n \u003ch2\u003e 1. 工程結構 \u003c/h2\u003e \n \u003cp\u003e 這裏我們創建一個web工程爲:struts2log4j,參見下面最終的工程結構:\u003cbr\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2+log4j-1.png\" alt=\"Struts2+Log4j集成\"\u003e \u003c/p\u003e \n \u003cdiv\u003e \n \u003c/div\u003e \n \u003ch2\u003e 2. log4j.properties \u003c/h2\u003e \n \u003cdiv\u003e\n 創建log4j的屬性文件,並把它放入資源文件夾,請參閱步驟#1。 \n \u003c/div\u003e \n \u003cdiv\u003e\n log4j.properties \n \u003c/div\u003e \n \u003cpre\u003e# Root logger option\r\nlog4j.rootLogger=ERROR, stdout, file\r\n\r\n# Redirect log messages to console\r\nlog4j.appender.stdout=org.apache.log4j.ConsoleAppender\r\nlog4j.appender.stdout.Target=System.out\r\nlog4j.appender.stdout.layout=org.apache.log4j.PatternLayout\r\nlog4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n\r\n\r\n# Redirect log messages to a log file, support rolling backup file.\r\nlog4j.appender.file=org.apache.log4j.RollingFileAppender\r\nlog4j.appender.file.File=${catalina.home}/logs/mystruts2app.log\r\nlog4j.appender.file.MaxFileSize=5MB\r\nlog4j.appender.file.MaxBackupIndex=10\r\nlog4j.appender.file.layout=org.apache.log4j.PatternLayout\r\nlog4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n\u003c/pre\u003e \n \u003ch2\u003e 4. Struts2 Action 和 Logging \u003c/h2\u003e \n \u003cdiv\u003e\n 一個簡單的動作返回一個頁面,並顯示瞭如何來執行\u0026nbsp;log4j\u0026nbsp;消息日誌記錄。 \n \u003c/div\u003e \n \u003cdiv\u003e\n WelcomeAction.java \n \u003c/div\u003e \n \u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport org.apache.log4j.Logger;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class WelcomeAction extends ActionSupport {\r\n\r\n\tprivate static final long serialVersionUID = 1L;\r\n\r\n\t//get log4j\r\n\tprivate static final Logger logger = Logger.getLogger(WelcomeAction.class);\r\n\r\n\tpublic String execute() throws Exception {\r\n\r\n\t\t// logs debug message\r\n\t\tif (logger.isDebugEnabled()) {\r\n\t\t\tlogger.debug(\"execute()!\");\r\n\t\t}\r\n\r\n\t\t// logs exception\r\n\t\tlogger.error(\"This is Error message\", new Exception(\"Testing\"));\r\n\r\n\t\treturn SUCCESS;\r\n\r\n\t}\r\n}\u003c/pre\u003e \n \u003ch2\u003e 5. Struts2配置 \u003c/h2\u003e \n \u003cdiv\u003e\n Struts2 的配置和JSP頁面,如果想了解的話。 \n \u003c/div\u003e \n \u003cdiv\u003e\n struts.xml \n \u003c/div\u003e \n \u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n\r\n\u0026lt;struts\u0026gt;\r\n\t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\r\n\t\u0026lt;package name=\"welcome\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\r\n\t\t\u0026lt;action name=\"welcome\" class=\"com.yiibai.common.action.WelcomeAction\"\u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;pages/success.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\r\n\t\u0026lt;/package\u0026gt;\r\n\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n \u003cdiv\u003e\n web.xml \n \u003c/div\u003e \n \u003cpre\u003e\u0026lt;web-app xmlns=\"http://java.sun.com/xml/ns/javaee\" \r\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee \r\n\thttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\r\n\tversion=\"2.5\"\u0026gt;\r\n\r\n\t\u0026lt;display-name\u0026gt;Struts 2 Web Application\u0026lt;/display-name\u0026gt;\r\n\r\n\t\u0026lt;filter\u0026gt;\r\n\t\t\u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n\t\t\u0026lt;filter-class\u0026gt;\r\n\t\t\torg.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter\r\n\t\t\u0026lt;/filter-class\u0026gt;\r\n\t\u0026lt;/filter\u0026gt;\r\n\r\n\t\u0026lt;filter-mapping\u0026gt;\r\n\t\t\u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n\t\t\u0026lt;url-pattern\u0026gt;/*\u0026lt;/url-pattern\u0026gt;\r\n\t\u0026lt;/filter-mapping\u0026gt;\r\n\r\n\u0026lt;/web-app\u0026gt;\u003c/pre\u003e \n \u003cdiv\u003e\n pages/success.jsp \n \u003c/div\u003e \n \u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 + Log4j integration example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n \u003ch2\u003e 6. 實例測試 \u003c/h2\u003e \n \u003cdiv\u003e\n 運行Struts\u0026nbsp;2的Web應用程序,並訪問welcome的動作。 \n \u003c/div\u003e \n \u003cp\u003e 在瀏覽器中打開 URL : http://localhost:8888/struts2log4j/welcome \u003c/p\u003e \n \u003cp\u003e \u003cem\u003e6.1\u003c/em\u003e\u0026nbsp;\u003cspan\u003e所有日誌消息將顯示在控制檯中。\u003c/span\u003e \u003c/p\u003e \n \u003cdiv\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2+log4j-2.png\" alt=\"Struts2+Log4j集成\"\u003e \n \u003c/div\u003e \n \u003cp\u003e \u003cem\u003eFigure : Eclipse 終端\u003c/em\u003e \u003c/p\u003e \n \u003cp\u003e \u003cem\u003e6.2\u003c/em\u003e\u0026nbsp;\u003cspan\u003e此外,日誌文件將在Tomcat 的日誌文件夾中被創建。\u003c/span\u003e \u003c/p\u003e \n \u003cdiv\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2+log4j-3.png\" alt=\"Struts2+Log4j集成\"\u003e \n \u003c/div\u003e \n \u003cp\u003e \u003cem\u003e圖片: C:\\mystruts2app.log\u003c/em\u003e \u003c/p\u003e \n \u003cdiv\u003e\n 下載代碼 –\u0026nbsp;http://pan.baidu.com/s/1nt7yVep \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"7d:T792,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n 在Struts2的開發時,很多人會問爲什麼有些聲明過濾器類是\u0026nbsp;「FilterDispatcher「; 而有一些又是「StrutsPrepareAndExecuteFilter「?\u0026nbsp;但兩者都可以正常使用,並有什麼區別? \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003cp\u003e \u003cem\u003e1. FilterDispatcher 示例\u003c/em\u003e \u003c/p\u003e \n \u003cpre\u003e...\r\n\u0026lt;filter\u0026gt;\r\n \u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n \u0026lt;filter-class\u0026gt;\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u0026lt;/filter-class\u0026gt;\r\n\u0026lt;/filter\u0026gt;\r\n \r\n\u0026lt;filter-mapping\u0026gt;\r\n \u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n \u0026lt;url-pattern\u0026gt;/*\u0026lt;/url-pattern\u0026gt;\r\n\u0026lt;/filter-mapping\u0026gt;\r\n...\u003c/pre\u003e \n \u003cp\u003e \u003cem\u003e2. StrutsPrepareAndExecuteFilter 示例\u003c/em\u003e \u003c/p\u003e \n \u003cpre\u003e...\r\n\u0026lt;filter\u0026gt;\r\n \u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n \u0026lt;filter-class\u0026gt;\r\n org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter\r\n \u0026lt;/filter-class\u0026gt;\r\n\u0026lt;/filter\u0026gt;\r\n \r\n\u0026lt;filter-mapping\u0026gt;\r\n \u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n \u0026lt;url-pattern\u0026gt;/*\u0026lt;/url-pattern\u0026gt;\r\n\u0026lt;/filter-mapping\u0026gt;\r\n...\u003c/pre\u003e \n \u003ch2\u003e 回答: \u003c/h2\u003e \n \u003cp\u003e The\u0026nbsp;FilterDispatcher\u0026nbsp;(org.apache.struts2.dispatcher.FilterDispatcher)\u0026nbsp;被用在早期的Struts2開發,並且在\u0026nbsp;Struts\u0026nbsp;2.1.3中它就被廢棄了。 \u003c/p\u003e \n \u003cp\u003e 如果使用Struts版本\u0026nbsp;\u0026gt;= 2.1.3,\u0026nbsp;它總是建議升級到新的過濾器類\u0026nbsp;–StrutsPrepareAndExecuteFilter\u0026nbsp;(org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter). \u003c/p\u003e \n \u003ch2\u003e 參考 \u003c/h2\u003e \n \u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/struts2-core/apidocs/org/apache/struts2/dispatcher/FilterDispatcher.htmll\"\u003eFilterDispatcher 文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/struts2-core/apidocs/org/apache/struts2/dispatcher/ng/filter/StrutsPrepareAndExecuteFilter.htmll\"\u003eStrutsPrepareAndExecuteFilter 文檔\u003c/a\u003e \u003c/li\u003e \n \u003c/ol\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"7e:T825,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n 在Struts2中,可以使用以下兩種方法來獲取HttpServletRequest對象。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003ch2\u003e 1. ServletActionContext \u003c/h2\u003e \n \u003cdiv\u003e\n 直接從 org.apache.struts2.ServletActionContext 獲取 HttpServletRequest 對象。 \n \u003c/div\u003e \n \u003cpre\u003eimport javax.servlet.http.HttpServletRequest;\r\nimport org.apache.struts2.ServletActionContext;\r\n\r\npublic class LocaleAction{\r\n\t//business logic\r\n\tpublic String execute() {\r\n\t\tHttpServletRequest request = ServletActionContext.getRequest();\r\n\t\treturn \"SUCCESS\";\r\n\t}\r\n}\u003c/pre\u003e \n \u003ch2\u003e 2. ServletRequestAware \u003c/h2\u003e \n \u003cdiv\u003e\n 讓你的類實現org.apache.struts2.interceptor.ServletRequestAware。 \n \u003c/div\u003e \n \u003cdiv\u003e\n 當\u0026nbsp;Struts2\u0026nbsp;的\u0026nbsp;「servlet-config」\u0026nbsp;攔截器的一個Action類實現ServletRequestAware接口,它會通過一個\u0026nbsp;HttpServletRequest\u0026nbsp;的引用請求,通過Action類的setServletRequest()方法完成。 \n \u003c/div\u003e \n \u003cpre\u003eimport javax.servlet.http.HttpServletRequest;\r\nimport org.apache.struts2.interceptor.ServletRequestAware;\r\n\r\npublic class LocaleAction implements ServletRequestAware{\r\n\r\n\tHttpServletRequest request;\r\n\t\r\n\t//business logic\r\n\tpublic String execute() {\r\n\t\tString param = getServletRequest().getParameter(\"param\");\r\n\t\treturn \"SUCCESS\";\r\n\r\n\t}\r\n\r\n\tpublic void setServletRequest(HttpServletRequest request) {\r\n\t\tthis.request = request;\r\n\t}\r\n\r\n\tpublic HttpServletRequest getServletRequest() {\r\n\t\treturn this.request;\r\n\t}\r\n}\u003c/pre\u003e \n \u003cdiv\u003e \n \u003cdiv\u003e\n Struts2\u0026nbsp;文檔中建議使用\u0026nbsp;ServletRequestAware\u0026nbsp;代替\u0026nbsp;ServletActionContext。 \n \u003c/div\u003e \n \u003c/div\u003e \n \u003ch2\u003e 參考 \u003c/h2\u003e \n \u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.x/docs/how-can-we-access-the-httpservletrequest.htmll\"\u003ehttp://struts.apache.org/2.x/docs/how-can-we-access-the-httpservletrequest.htmll\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.6/struts2-core/apidocs/org/apache/struts2/interceptor/ServletRequestAware.htmll\"\u003ehttp://struts.apache.org/2.0.6/struts2-core/apidocs/org/apache/struts2/interceptor/ServletRequestAware.htmll\u003c/a\u003e \u003c/li\u003e \n \u003c/ol\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"7f:T935,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n 在Struts2中,可以用以下兩種方式來獲取HttpServletResponse對象。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003ch2\u003e 1. ServletActionContext \u003c/h2\u003e \n \u003cp\u003e 通過\u0026nbsp;ServletActionContext\u0026nbsp;類來訪問\u0026nbsp;HttpServletResponse\u0026nbsp;。 \u003c/p\u003e \n \u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport javax.servlet.http.HttpServletResponse;\r\nimport org.apache.struts2.ServletActionContext;\r\n\r\npublic class LocaleAction{\r\n\t//business logic\r\n\tpublic String execute() {\r\n\t\tHttpServletResponse response = ServletActionContext.getResponse();\r\n\t\t\r\n\t\treturn \"SUCCESS\";\r\n\t}\r\n}\u003c/pre\u003e \n \u003ch2\u003e 2. ServletResponseAware \u003c/h2\u003e \n \u003cdiv\u003e\n 通過實現 ServletResponseAware 接口並覆蓋 setServletResponse()方法來訪問HttpServletResponse。 \n \u003c/div\u003e \n \u003cdiv\u003e \n \u003cstrong\u003e注意\u003c/strong\u003e \n \u003cbr\u003e 當Struts2的「servlet-config」攔截器是看到一個Action類實現ServletResponseAware接口,它會通過一個HttpServletResponse的引用Action類通過setServletResponse()方法請求。 \n \u003cdiv\u003e\n 當然,也可以創建自定義 getServletResponse()來獲得 HttpServletResponse。 \n \u003c/div\u003e \n \u003c/div\u003e \n \u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.util.Locale;\r\nimport javax.servlet.http.HttpServletResponse;\r\nimport org.apache.struts2.interceptor.ServletResponseAware;\r\n\r\npublic class LocaleAction implements ServletResponseAware{\r\n\r\n\tHttpServletResponse response;\r\n\t\r\n\t//business logic\r\n\tpublic String execute() {\r\n\t\tLocale locale = getServletResponse().getLocale();\r\n\t\treturn \"SUCCESS\";\r\n\t}\r\n\r\n\tpublic void setServletResponse(HttpServletResponse response) {\r\n\t\tthis.response = response;\r\n\t}\r\n\tpublic HttpServletResponse getServletResponse() {\r\n\t\treturn this.response;\r\n\t}\t\r\n}\u0026nbsp;\u003c/pre\u003e \n \u003cp\u003e 這兩個機制都可以得到同樣 HttpServletResponse 對象,但 Struts2 文檔推薦使用 ServletResponseAware,請參見下面的參考資料: \u003c/p\u003e \n \u003ch2\u003e 參考 \u003c/h2\u003e \n \u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.x/docs/how-can-we-access-the-httpservletresponse.htmll\"\u003ehttp://struts.apache.org/2.x/docs/how-can-we-access-the-httpservletresponse.htmll\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.2/struts2-core/apidocs/org/apache/struts2/interceptor/ServletResponseAware.htmll\"\u003ehttp://struts.apache.org/2.1.2/struts2-core/apidocs/org/apache/struts2/interceptor/ServletResponseAware.htmll\u003c/a\u003e \u003c/li\u003e \n \u003c/ol\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"80:T6a5,"])</script><script>self.__next_f.push([1,"\u003cdiv class=\"__kindeditor_paste__\"\u003e \n \u003cdiv\u003e \n \u003cdiv\u003e\n 在Struts2中,可以使用以下兩種方法來獲取ServletContext對象。 \n \u003c/div\u003e \n \u003c/div\u003e \n \u003cdiv\u003e \n \u003ch2\u003e 1. ServletActionContext \u003c/h2\u003e \n \u003cdiv\u003e\n 直接從 org.apache.struts2.ServletActionContext 獲取 ServletContext 對象。 \n \u003c/div\u003e \n \u003cpre\u003eimport javax.servlet.ServletContext;\r\nimport org.apache.struts2.ServletActionContext;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class CustomerAction extends ActionSupport{\r\n\t\r\n\tpublic String execute() throws Exception {\r\n\t\t\r\n\t\tServletContext context = ServletActionContext.getServletContext();\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t\t\r\n\t}\r\n\r\n}\u003c/pre\u003e \n \u003ch2\u003e 2. ServletContextAware \u003c/h2\u003e \n \u003cdiv\u003e\n 讓你的類實現了org.apache.struts2.util.ServletContextAware接口。 \n \u003c/div\u003e \n \u003cdiv\u003e\n 當Struts2\u0026nbsp;的\u0026nbsp;「servlet-config」攔截器是看到了一個Action類實現ServletContextAwareinterface,它會通過一個ServletContext引用Action類通過setServletContext()方法請求。 \n \u003c/div\u003e \n \u003cpre\u003eimport javax.servlet.ServletContext;\r\nimport org.apache.struts2.util.ServletContextAware;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class CustomerAction \r\n extends ActionSupport implements ServletContextAware{\r\n\r\n\tServletContext context;\r\n\t\r\n\tpublic String execute() throws Exception {\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t\t\r\n\t}\r\n\r\n\tpublic void setServletContext(ServletContext context) {\r\n\t\tthis.context = context;\r\n\t}\r\n}\u003c/pre\u003e \n \u003ch2\u003e 參考 \u003c/h2\u003e \n \u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.11.1/struts2-core/apidocs/org/apache/struts2/util/ServletContextAware.htmll\"\u003eStruts 2 ServletContextAware文檔\u003c/a\u003e \u003c/li\u003e \n \u003c/ol\u003e \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"81:Td1b,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e \n \u003cspan\u003e在某些情況下,可能需要一個Action類分配一些預定義或靜態的參數值。\u003c/span\u003e \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e \n \u003ch2\u003e \n \u003cdiv\u003e\n 爲動作定義靜態參數 \n \u003c/div\u003e \u003c/h2\u003e \n \u003cdiv\u003e\n 在Struts2,可以在 struts.xml\u0026nbsp;文件中的通過\u0026lt;param\u0026gt;標記進行配置,例如, \n \u003c/div\u003e \n \u003cp\u003e \u003cstrong\u003estruts.xml\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003e\u0026lt;struts\u0026gt;\r\n\r\n \u0026lt;constant name=\"struts.custom.i18n.resources\" value=\"global\" /\u0026gt;\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\r\n \u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\u0026lt;action name=\"locale\" class=\"com.yiibai.common.action.LocaleAction\"\u0026gt;\r\n\t\t\u0026lt;result name=\"SUCCESS\"\u0026gt;pages/welcome.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;param name=\"EnglishParam\"\u0026gt;English\u0026lt;/param\u0026gt;\r\n \t \u0026lt;param name=\"ChineseParam\"\u0026gt;Chinese\u0026lt;/param\u0026gt;\r\n \t \u0026lt;param name=\"FranceParam\"\u0026gt;France\u0026lt;/param\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n \u003cdiv\u003e\n 它分配三個預定義的參數值到LocaleAction\u0026nbsp;Action類。 \n \u003c/div\u003e \n \u003ch2\u003e \n \u003cdiv\u003e\n 從動作獲取靜態參數 \n \u003c/div\u003e \u003c/h2\u003e \n \u003cp\u003e 要從struts.xml中獲取靜態參數值,Action類必須實現參數化Parameterizable接口。動作的靜態參數是由staticParams攔截,其中包括在默認堆棧控制 \u003c/p\u003e \n \u003cdiv\u003e \n \u003cdiv\u003e\n 動作的靜態參數是由staticParams攔截,包括在默認堆棧 「struts-default.xml」\u0026nbsp;中控制。 \n \u003c/div\u003e \n \u003c/div\u003e \n \u003ch2\u003e 1. Map屬性 \u003c/h2\u003e \n \u003cdiv\u003e\n 在操作類初始化期間,staticParams攔截器將通過動作類的setParams()方法獲取預先定義的參數值。 \n \u003c/div\u003e \n \u003cpre\u003e//...\r\nimport com.opensymphony.xwork2.config.entities.Parameterizable;\r\n\r\npublic class LocaleAction implements Parameterizable{\r\n\r\n\tMap\u0026lt;String, String\u0026gt; params;\r\n\t//...\r\n\tpublic void setParams(Map\u0026lt;String, String\u0026gt; params) {\r\n\t\tthis.params = params;\r\n\t}\r\n}\u003c/pre\u003e \n \u003ch2\u003e 2. JavaBean 屬性 \u003c/h2\u003e \n \u003cp\u003e 在動作類的初始化,如果創建了getter和setter方法得當,staticParams攔截器將設置預先定義的參數值,以對應於該「參數」的每JavaBean屬性。 \u003c/p\u003e \n \u003cpre\u003e//...\r\nimport com.opensymphony.xwork2.config.entities.Parameterizable;\r\n\r\npublic class LocaleAction implements Parameterizable{\r\n\r\n\tString englishParam;\r\n\tString chineseParam;\r\n\tString franceParam;\r\n\t\r\n\tpublic String getEnglishParam() {\r\n\t\treturn englishParam;\r\n\t}\r\n\r\n\tpublic void setEnglishParam(String englishParam) {\r\n\t\tthis.englishParam = englishParam;\r\n\t}\r\n\r\n\tpublic String getChineseParam() {\r\n\t\treturn chineseParam;\r\n\t}\r\n\r\n\tpublic void setChineseParam(String chineseParam) {\r\n\t\tthis.chineseParam = chineseParam;\r\n\t}\r\n\r\n\tpublic String getFranceParam() {\r\n\t\treturn franceParam;\r\n\t}\r\n\r\n\tpublic void setFranceParam(String franceParam) {\r\n\t\tthis.franceParam = franceParam;\r\n\t}\r\n //...\r\n}\u003c/pre\u003e \n \u003c/div\u003e \n \u003cp\u003e \u003c/p\u003e \n \u003ch2\u003e 2. 運行實例 \u003c/h2\u003e \n \u003cp\u003e 在瀏覽器中打開URL:http://localhost:8080/configure-param/locale.action \u003c/p\u003e \n \u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2action-1.png\" alt=\"Struts2配置Action類的靜態參數\"\u003e \u003c/p\u003e \n \u003cp\u003e\u003c/p\u003e \n \u003cdiv\u003e \n \u003c/div\u003e \n \u003cdiv\u003e\n 代碼下載(configure-param) -\u0026nbsp; \n \u003ca href=\"http://pan.baidu.com/s/1dDmGDK9\"\u003ehttp://pan.baidu.com/s/1dDmGDK9\u003c/a\u003e \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"82:T1162,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e \n \u003cspan\u003e這是一個Struts2的例子來說明使用定製返回類型,允許用戶下載文件。web工程的文件夾結構如下所示:\u003cbr\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-29.png\" alt=\"Struts2下載文件實例\"\u003e\u003cbr\u003e \u003c/span\u003e \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003ch2\u003e 1. Action \u003c/h2\u003e \n \u003cdiv\u003e\n 在Action類中,聲明一個\u0026nbsp;InputStream\u0026nbsp;的數據類型和getter方法。 \n \u003c/div\u003e \n \u003cp\u003e \u003cstrong\u003eDownloadAction.java\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.io.File;\r\nimport java.io.FileInputStream;\r\nimport java.io.InputStream;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class DownloadAction extends ActionSupport{\r\n\r\n\tprivate InputStream fileInputStream;\r\n\t\r\n\tpublic InputStream getFileInputStream() {\r\n\t\treturn fileInputStream;\r\n\t}\r\n\r\n\tpublic String execute() throws Exception {\r\n\t fileInputStream = new FileInputStream(new File(\"C:\\\\\u003cspan\u003efile-for-download\u003c/span\u003e\u003cspan\u003e.txt\"));\u003c/span\u003e return SUCCESS;\r\n\t}\r\n}\u003c/pre\u003e \n \u003ch2\u003e 2. 視圖文件 \u003c/h2\u003e \n \u003cdiv\u003e\n 一個正常的頁面,有一個下載鏈接,用於下載文件。 \n \u003c/div\u003e \n \u003cp\u003e \u003cstrong\u003edownloadPage.jsp\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 download file example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:url id=\"fileDownload\" namespace=\"/\" action=\"download\" \u0026gt;\u0026lt;/s:url\u0026gt;\r\n\r\n\u0026lt;div\u0026gt;\u0026lt;div class=\"ads-in-post hide_if_width_less_800\"\u0026gt;\r\n\u0026lt;script async src=\"//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\"\u0026gt;\u0026lt;/script\u0026gt;\r\n\u0026lt;!-- 728x90 - After2ndH4 --\u0026gt;\r\n\u0026lt;ins class=\"adsbygoogle hide_if_width_less_800\" \r\n style=\"display:inline-block;width:728px;height:90px\"\r\n data-ad-client=\"ca-pub-2836379775501347\"\r\n data-ad-slot=\"3642936086\"\r\n\t data-ad-region=\"yiibairegion\"\u0026gt;\u0026lt;/ins\u0026gt;\r\n\u0026lt;script\u0026gt;\r\n(adsbygoogle = window.adsbygoogle || []).push({});\r\n\u0026lt;/script\u0026gt;\r\n\u0026lt;/div\u0026gt;\u0026lt;/div\u0026gt;\u0026lt;h2\u0026gt;Download file - \u0026lt;s:a href=\"%{fileDownload}\"\u0026gt;fileABC.txt\u0026lt;/s:a\u0026gt;\r\n\u0026lt;/h2\u0026gt;\r\n\t\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n \u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n \u003cp\u003e 定義下載文件的細節。\u0026nbsp;\u0026lt;param name=」inputName」\u0026gt;\u0026nbsp;值是從Action的InputStream屬性的名稱。 \u003c/p\u003e \n \u003cdiv\u003e\n 閱讀 \n \u003ca href=\"http://struts.apache.org/2.x/docs/stream-result.html\"\u003eStruts2的數據流結果文檔\u003c/a\u003e以瞭解更詳細信息。 \n \u003c/div\u003e \n \u003cp\u003e \u003cstrong\u003estruts.xml\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\r\n\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n \u0026lt;action name=\"show\"\u0026gt;\r\n\t\u0026lt;result name=\"success\"\u0026gt;pages/downloadPage.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"download\" class=\"com.yiibai.common.action.DownloadAction\"\u0026gt;\r\n\t\u0026lt;result name=\"success\" type=\"stream\"\u0026gt;\r\n\t \u0026lt;param name=\"contentType\"\u0026gt;application/octet-stream\u0026lt;/param\u0026gt;\r\n\t \u0026lt;param name=\"inputName\"\u0026gt;fileInputStream\u0026lt;/param\u0026gt;\r\n\t \u0026lt;param name=\"contentDisposition\"\u0026gt;attachment;filename=\"\u003cspan\u003efile-for-download\u003c/span\u003e\u003cspan\u003e.txt\"\u0026lt;/param\u0026gt;\u003c/span\u003e \u0026lt;param name=\"bufferSize\"\u0026gt;1024\u0026lt;/param\u0026gt;\r\n\t\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n \u003ch2\u003e 4. 執行結果 \u003c/h2\u003e \n \u003cp\u003e 在瀏覽器中打開:http://localhost:8080/struts2download/\u003cbr\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-30.png\" alt=\"Struts2下載文件實例\"\u003e \u003c/p\u003e \n \u003ch2\u003e 參考 \u003c/h2\u003e \n \u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.x/docs/stream-result.html\"\u003ehttp://struts.apache.org/2.x/docs/stream-result.html\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://www.iana.org/assignments/media-types/\"\u003ehttp://www.iana.org/assignments/media-types/\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e http://www.yiibai.com/struts/struts-download-file-from-website-example.html \u003c/li\u003e \n \u003cli\u003e http://www.yiibai.com/java/how-to-download-file-from-website-java-jsp.html \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.x/docs/how-can-we-return-a-text-string-as-the-response.html\"\u003ehttp://struts.apache.org/2.x/docs/how-can-we-return-a-text-string-as-the-response.html\u003c/a\u003e \u003c/li\u003e \n \u003c/ol\u003e \n \u003cdiv\u003e\n 代碼下載(struts2download) -\u0026nbsp; \n \u003ca href=\"http://pan.baidu.com/s/1n2C5S\"\u003ehttp://pan.baidu.com/s/1jGg0Lzo\u003c/a\u003e \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"83:Tfdd,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n 在這個Struts2例子,將學習如何通過「struts2-json-plugin.jar」庫將對象轉換爲JSON格式的數據。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003ch2\u003e 1. Action (JSON) \u003c/h2\u003e \n \u003cdiv\u003e\n 這是一個將被轉換成JSON格式的 Action 類。 \n \u003c/div\u003e \n \u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.HashMap;\r\nimport java.util.List;\r\nimport java.util.Map;\r\n\r\nimport com.opensymphony.xwork2.Action;\r\n\r\npublic class JSONDataAction{\r\n\r\n\tprivate String string1 = \"A\";\r\n\tprivate String[] stringarray1 = {\"A1\",\"B1\"};\r\n\tprivate int number1 = 123456789;\r\n\tprivate int[] numberarray1 = {1,2,3,4,5,6,7,8,9};\r\n\tprivate List\u0026lt;String\u0026gt; lists = new ArrayList\u0026lt;String\u0026gt;();\r\n\tprivate Map\u0026lt;String, String\u0026gt; maps = new HashMap\u0026lt;String, String\u0026gt;();\r\n\t\r\n\t//no getter method, will not include in the JSON\r\n\tprivate String string2 = \"B\";\r\n\t\r\n\tpublic JSONDataAction(){\r\n\t\tlists.add(\"list1\");\r\n\t\tlists.add(\"list2\");\r\n\t\tlists.add(\"list3\");\r\n\t\tlists.add(\"list4\");\r\n\t\tlists.add(\"list5\");\r\n\t\t\r\n\t\tmaps.put(\"key1\", \"value1\");\r\n\t\tmaps.put(\"key2\", \"value2\");\r\n\t\tmaps.put(\"key3\", \"value3\");\r\n\t\tmaps.put(\"key4\", \"value4\");\r\n\t\tmaps.put(\"key5\", \"value5\");\r\n\t}\r\n\r\n\tpublic String execute() {\r\n return Action.SUCCESS;\r\n }\r\n\t\r\n\tpublic String getString1() {\r\n\t\treturn string1;\r\n\t}\r\n\r\n\tpublic void setString1(String string1) {\r\n\t\tthis.string1 = string1;\r\n\t}\r\n\r\n\tpublic String[] getStringarray1() {\r\n\t\treturn stringarray1;\r\n\t}\r\n\r\n\tpublic void setStringarray1(String[] stringarray1) {\r\n\t\tthis.stringarray1 = stringarray1;\r\n\t}\r\n\r\n\tpublic int getNumber1() {\r\n\t\treturn number1;\r\n\t}\r\n\r\n\tpublic void setNumber1(int number1) {\r\n\t\tthis.number1 = number1;\r\n\t}\r\n\r\n\tpublic int[] getNumberarray1() {\r\n\t\treturn numberarray1;\r\n\t}\r\n\r\n\tpublic void setNumberarray1(int[] numberarray1) {\r\n\t\tthis.numberarray1 = numberarray1;\r\n\t}\r\n\r\n\tpublic List\u0026lt;String\u0026gt; getLists() {\r\n\t\treturn lists;\r\n\t}\r\n\r\n\tpublic void setLists(List\u0026lt;String\u0026gt; lists) {\r\n\t\tthis.lists = lists;\r\n\t}\r\n\r\n\tpublic Map\u0026lt;String, String\u0026gt; getMaps() {\r\n\t\treturn maps;\r\n\t}\r\n\r\n\tpublic void setMaps(Map\u0026lt;String, String\u0026gt; maps) {\r\n\t\tthis.maps = maps;\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n \u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n \u003cdiv\u003e\n 要輸出JSON數據,需要聲明一個包,它擴展「json-default」,會將結果類型轉爲「json」。 \n \u003c/div\u003e \n \u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\r\n \u0026lt;package name=\"default\" namespace=\"/\" extends=\"json-default\"\u0026gt;\r\n \u0026lt;action name=\"getJSONResult\" \r\n class=\"com.yiibai.common.action.JSONDataAction\"\u0026gt;\r\n \t \u0026lt;result type=\"json\" /\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n \u003ch2\u003e 4. 實例 \u003c/h2\u003e \n \u003cdiv\u003e\n 訪問動作URL時,JSONDataAction屬性將被轉換成JSON格式。 \n \u003c/div\u003e \n \u003cp\u003e \u003cem\u003ehttp://localhost:8080/struts2json/getJSONResult.action\u003cbr\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2json-1.png\" alt=\"Struts2和JSON實例\"\u003e\u003cbr\u003e \u003c/em\u003e \u003c/p\u003e \n \u003cp\u003e JSON 格式 … \u003c/p\u003e \n \u003cpre\u003e{\r\n \"lists\":[\"list-1\",\"list-2\",\"list-3\",\"list-4\",\"list-5\"],\r\n \"maps\":\r\n {\r\n \"key4\":\"value4\",\"key3\":\"value3\",\"key5\":\"value5\",\"key2\":\"value2\",\"key1\":\"value1\"\r\n },\r\n \"number1\":123456789,\r\n \"numberarray1\":[1,2,3,4,5,6,7,8,9],\r\n \"string1\":\"A\",\r\n \"stringarray1\":[\"A1\",\"B1\"]\r\n}\u0026nbsp;\u003c/pre\u003e \n \u003cdiv\u003e\n 希望這個簡單的例子可以瞭解JSON插件在Struts2是如何工作的有一個總體的思路。不過,還是有很多有用的參數不包括在這裏,請務必閱讀\u0026nbsp; \n \u003ca href=\"http://struts.apache.org/docs/json-plugin.html\"\u003eStruts2 JSON插件文檔\u003c/a\u003e\u0026nbsp;以獲取更多詳細信息。 \n \u003c/div\u003e \n \u003cdiv\u003e \n \u003cbr\u003e \n \u003c/div\u003e \n \u003cdiv\u003e\n 下載源代碼(struts2json)\u0026nbsp;–\u0026nbsp; \n \u003ca href=\"http://pan.baidu.com/s/1bnv8l9X\"\u003ehttp://pan.baidu.com/s/1bnv8l9X\u003c/a\u003e \n \u003c/div\u003e \n \u003cdiv\u003e \n \u003cbr\u003e \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"84:T1293,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e\n Struts2 的「action」標籤是用來直接從JSP頁面中調用Action類。如果「executeResult」屬性設置爲true,則結果頁的內容將直接在當前網頁渲染。 \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cdiv\u003e\n 這是用一個完整的例子很好地說明: \n\u003c/div\u003e \n\u003ch2\u003e 1. 動作 \u003c/h2\u003e \n\u003cdiv\u003e\n Action類有幾個方法用來轉發不同結果的結果頁面。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eParamTagAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class ActionTagAction extends ActionSupport{\r\n\t\r\n\tpublic String execute() {\r\n\t\treturn SUCCESS;\r\n\t}\r\n\t\r\n\tpublic String sayHello(){\r\n\t\treturn \"sayHello\";\r\n\t}\r\n\t\r\n\tpublic String sayStruts2(){\r\n\t\treturn \"sayStruts2\";\r\n\t}\r\n\t\r\n\tpublic String saySysOut(){\r\n\t\tSystem.out.println(\"SysOut SysOut SysOut\");\r\n\t\treturn \"saySysOut\";\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. \u0026lt;s:action\u0026gt;標籤示例 \u003c/h2\u003e \n\u003cp\u003e 下面的JSP頁面顯示如何使用「action」標籤。如果\u0026nbsp;executeResult=」true」,動作標籤被指定方法執行且結果頁面將直接顯示;\u0026nbsp;否則,它只是執行的方法,結果頁面不會顯示出來。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eaction.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\u0026lt;title\u0026gt;struts2 action標籤示例\u0026lt;title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2 action標籤示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;ol\u0026gt;\r\n\r\n\u0026lt;li\u0026gt;\r\nExecute the action's result, render the page here. \r\n\u0026lt;s:action name=\"sayHelloAction\" executeResult=\"true\"/\u0026gt;\r\n\u0026lt;/li\u0026gt;\r\n\r\n\u0026lt;li\u0026gt;\r\nDoing the same as above, but call action's sayStruts2() method. \r\n\u0026lt;s:action name=\"sayHelloAction!sayStruts2\" executeResult=\"true\"/\u0026gt;\r\n\u0026lt;/li\u0026gt;\r\n\r\n\u0026lt;li\u0026gt;\r\nCall the action's saySysOut() method only, no result will be rendered,\r\nBy defautlt, executeResult=\"false\". \r\n\u0026lt;s:action name=\"sayHelloAction!saySysOut\" /\u0026gt;\r\n\u0026lt;/li\u0026gt;\r\n\r\n\u0026lt;/ol\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003esayHello.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;div\u0026gt;\u0026lt;div class=\"ads-in-post hide_if_width_less_800\"\u0026gt;\r\n\u0026lt;script async src=\"//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\"\u0026gt;\u0026lt;/script\u0026gt;\r\n\u0026lt;!-- 728x90 - After2ndH4 --\u0026gt;\r\n\u0026lt;ins class=\"adsbygoogle hide_if_width_less_800\" \r\n style=\"display:inline-block;width:728px;height:90px\"\r\n data-ad-client=\"ca-pub-2836379775501347\"\r\n data-ad-slot=\"3642936086\"\r\n\t data-ad-region=\"yiibairegion\"\u0026gt;\u0026lt;/ins\u0026gt;\r\n\u0026lt;script\u0026gt;\r\n(adsbygoogle = window.adsbygoogle || []).push({});\r\n\u0026lt;/script\u0026gt;\r\n\u0026lt;/div\u0026gt;\u0026lt;/div\u0026gt;\u0026lt;h2\u0026gt;Hello Hello Hello ~ from sayHello.jsp\u0026lt;/h2\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003esayStruts2.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h2\u0026gt;Struts 2 Struts 2 Struts 2 ~ from sayStruts2.jsp\u0026lt;/h2\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003esaySysOut.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h2\u0026gt;SysOut SysOut SysOut ~ from saySysOut.jsp\u0026lt;/h2\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cdiv\u003e\n 聲明一些結果名稱來演示\u0026nbsp;ExecuteReuslt\u0026nbsp;的效果。 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\u0026lt;action name=\"actionTagAction\" \r\n\t\tclass=\"com.yiibai.common.action.ActionTagAction\" \u0026gt;\r\n\t\t\u0026lt;result name=\"success\"\u0026gt;pages/action.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;action name=\"sayHelloAction\" \r\n\t\tclass=\"com.yiibai.common.action.ActionTagAction\" \r\n method=\"sayHello\"\u0026gt;\r\n\r\n\t\t\u0026lt;result name=\"sayHello\"\u0026gt;sayHello.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;result name=\"sayStruts2\"\u0026gt;sayStruts2.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;result name=\"saySysOut\"\u0026gt;saySysOut.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n \u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e http://localhost:8080/struts2actiontag/actionTagAction.action \u003c/p\u003e \n\u003cp\u003e 在瀏覽器中打開上面的URL,顯示結果如下圖: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/action-1.png\" alt=\"Struts2 \u003cs:action\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/action.html\"\u003eStruts2 \u0026lt;s:action\u0026gt;標籤文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e 代碼下載 -\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1kT8NTUf\"\u003ehttp://pan.baidu.com/s/1kT8NTUf\u003c/a\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"85:Teb6,"])</script><script>self.__next_f.push([1,"Struts2 的「action」標籤是用來直接從JSP頁面中調用Action類。如果「executeResult」屬性設置爲true,則結果頁的內容將直接在當前網頁渲染。\n\n \n\n這是用一個完整的例子很好地說明:\n\n1\\. 動作\n------\n\nAction類有幾個方法用來轉發不同結果的結果頁面。\n\n**ParamTagAction.java**\n\npackage com.yiibai.common.action;\n\nimport com.opensymphony.xwork2.ActionSupport;\n \npublic class ActionTagAction extends ActionSupport{\n\t\n\tpublic String execute() {\n\t\treturn SUCCESS;\n\t}\n\t\n\tpublic String sayHello(){\n\t\treturn \"sayHello\";\n\t}\n\t\n\tpublic String sayStruts2(){\n\t\treturn \"sayStruts2\";\n\t}\n\t\n\tpublic String saySysOut(){\n\t\tSystem.out.println(\"SysOut SysOut SysOut\");\n\t\treturn \"saySysOut\";\n\t}\n\t\n}\n\n2\\. \u003cs:action\u003e標籤示例\n------------------\n\n下面的JSP頁面顯示如何使用「action」標籤。如果 executeResult=」true」,動作標籤被指定方法執行且結果頁面將直接顯示; 否則,它只是執行的方法,結果頁面不會顯示出來。\n\n**action.jsp**\n\n\u003c%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u003e\n\u003chtml\u003e\n\u003chead\u003e\u003ctitle\u003estruts2 action標籤示例\u003ctitle\u003e\n\u003c/head\u003e\n \n\u003cbody\u003e\n\u003ch1\u003eStruts2 action標籤示例\u003c/h1\u003e\n\n\u003col\u003e\n\n\u003cli\u003e\nExecute the action's result, render the page here. \n\u003cs:action name=\"sayHelloAction\" executeResult=\"true\"/\u003e\n\u003c/li\u003e\n\n\u003cli\u003e\nDoing the same as above, but call action's sayStruts2() method. \n\u003cs:action name=\"sayHelloAction!sayStruts2\" executeResult=\"true\"/\u003e\n\u003c/li\u003e\n\n\u003cli\u003e\nCall the action's saySysOut() method only, no result will be rendered,\nBy defautlt, executeResult=\"false\". \n\u003cs:action name=\"sayHelloAction!saySysOut\" /\u003e\n\u003c/li\u003e\n\n\u003c/ol\u003e\n\n\u003c/body\u003e\n\u003c/html\u003e\n\n**sayHello.jsp**\n\n\u003chtml\u003e\n\u003chead\u003e\n\u003c/head\u003e\n \n\u003cbody\u003e\n\u003cdiv\u003e\u003cdiv class=\"ads-in-post hide\\_if\\_width\\_less\\_800\"\u003e\n\u003cscript async src=\"//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\"\u003e\u003c/script\u003e\n\u003c!-- 728x90 - After2ndH4 --\u003e\n\u003cins class=\"adsbygoogle hide\\_if\\_width\\_less\\_800\" \n style=\"display:inline-block;width:728px;height:90px\"\n data-ad-client=\"ca-pub-2836379775501347\"\n data-ad-slot=\"3642936086\"\n\t data-ad-region=\"yiibairegion\"\u003e\u003c/ins\u003e\n\u003cscript\u003e\n(adsbygoogle = window.adsbygoogle || \\[\\]).push({});\n\u003c/script\u003e\n\u003c/div\u003e\u003c/div\u003e\u003ch2\u003eHello Hello Hello ~ from sayHello.jsp\u003c/h2\u003e\n\n\u003c/body\u003e\n\u003c/html\u003e\n\n**sayStruts2.jsp**\n\n\u003chtml\u003e\n\u003chead\u003e\n\u003c/head\u003e\n \n\u003cbody\u003e\n\u003ch2\u003eStruts 2 Struts 2 Struts 2 ~ from sayStruts2.jsp\u003c/h2\u003e\n\n\u003c/body\u003e\n\u003c/html\u003e\n\n**saySysOut.jsp**\n\n\u003chtml\u003e\n\u003chead\u003e\n\u003c/head\u003e\n \n\u003cbody\u003e\n\u003ch2\u003eSysOut SysOut SysOut ~ from saySysOut.jsp\u003c/h2\u003e\n\n\u003c/body\u003e\n\u003c/html\u003e\n\n3\\. struts.xml\n--------------\n\n聲明一些結果名稱來演示 ExecuteReuslt 的效果。\n\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\" ?\u003e\n\u003c!DOCTYPE struts PUBLIC\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u003e\n \n\u003cstruts\u003e\n \u003cconstant name=\"struts.devMode\" value=\"true\" /\u003e\n \u003cpackage name=\"default\" namespace=\"/\" extends=\"struts-default\"\u003e\n\t\n\t\u003caction name=\"actionTagAction\" \n\t\tclass=\"com.yiibai.common.action.ActionTagAction\" \u003e\n\t\t\u003cresult name=\"success\"\u003epages/action.jsp\u003c/result\u003e\n\t\u003c/action\u003e\n\t\t\n\t\u003caction name=\"sayHelloAction\" \n\t\tclass=\"com.yiibai.common.action.ActionTagAction\" \n method=\"sayHello\"\u003e\n\n\t\t\u003cresult name=\"sayHello\"\u003esayHello.jsp\u003c/result\u003e\n\t\t\u003cresult name=\"sayStruts2\"\u003esayStruts2.jsp\u003c/result\u003e\n\t\t\u003cresult name=\"saySysOut\"\u003esaySysOut.jsp\u003c/result\u003e\n\t\u003c/action\u003e\n\t\t\n \u003c/package\u003e\n\u003c/struts\u003e\n\n4\\. 示例\n------\n\nhttp://localhost:8080/struts2actiontag/actionTagAction.action\n\n在瀏覽器中打開上面的URL,顯示結果如下圖:\n\n![Struts2 \u003cs:action\u003e標籤示例](https://asset.1ju.org/cmsstatic/action-1.png)\n\n參考\n--\n\n \n\n1. [Struts2 \u003cs:action\u003e標籤文檔](http://struts.apache.org/2.0.14/docs/action.html)\n\n代碼下載 - [http://pan.baidu.com/s/1kT8NTUf](http://pan.baidu.com/s/1kT8NTUf)"])</script><script>self.__next_f.push([1,"86:T1215,"])</script><script>self.__next_f.push([1,"\u003cp\u003eStruts2 的「action」標籤是用來直接從JSP頁面中調用Action類。如果「executeResult」屬性設置爲true,則結果頁的內容將直接在當前網頁渲染。\u003c/p\u003e\n\u003cp\u003e這是用一個完整的例子很好地說明:\u003c/p\u003e\n\u003ch2 id=\"1-動作\"\u003e1. 動作\u003c/h2\u003e\n\u003cp\u003eAction類有幾個方法用來轉發不同結果的結果頁面。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eParamTagAction.java\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003epackage com.yiibai.common.action;\u003c/p\u003e\n\u003cp\u003eimport com.opensymphony.xwork2.ActionSupport;\u003c/p\u003e\n\u003cp\u003epublic class ActionTagAction extends ActionSupport{\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003epublic String execute() {\n return SUCCESS;\n}\n\npublic String sayHello(){\n return \u0026quot;sayHello\u0026quot;;\n}\n\npublic String sayStruts2(){\n return \u0026quot;sayStruts2\u0026quot;;\n}\n\npublic String saySysOut(){\n System.out.println(\u0026quot;SysOut SysOut SysOut\u0026quot;);\n return \u0026quot;saySysOut\u0026quot;;\n}\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003ch2 id=\"2-saction標籤示例\"\u003e2. \u0026lt;s:action\u0026gt;標籤示例\u003c/h2\u003e\n\u003cp\u003e下面的JSP頁面顯示如何使用「action」標籤。如果 executeResult=」true」,動作標籤被指定方法執行且結果頁面將直接顯示; 否則,它只是執行的方法,結果頁面不會顯示出來。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eaction.jsp\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u0026lt;%@ taglib prefix=\u0026quot;s\u0026quot; uri=\u0026quot;/struts-tags\u0026quot; %\u0026gt;\u003c/p\u003e\n\u003chtml\u003e\n\u003chead\u003e\u003ctitle\u003estruts2 action標籤示例\u003ctitle\u003e\n\u003c/head\u003e\n\n\u003cbody\u003e\n\u003ch1\u003eStruts2 action標籤示例\u003c/h1\u003e\n\n\u003col\u003e\n\n\u003cli\u003e\nExecute the action's result, render the page here. \n\u003cs:action name=\"sayHelloAction\" executeResult=\"true\"/\u003e\n\u003c/li\u003e\n\n\u003cli\u003e\nDoing the same as above, but call action's sayStruts2() method. \n\u003cs:action name=\"sayHelloAction!sayStruts2\" executeResult=\"true\"/\u003e\n\u003c/li\u003e\n\n\u003cli\u003e\nCall the action's saySysOut() method only, no result will be rendered,\nBy defautlt, executeResult=\"false\". \n\u003cs:action name=\"sayHelloAction!saySysOut\" /\u003e\n\u003c/li\u003e\n\n\u003c/ol\u003e\n\n\u003c/body\u003e\n\u003c/html\u003e\n\n\u003cp\u003e\u003cstrong\u003esayHello.jsp\u003c/strong\u003e\u003c/p\u003e\n\u003chtml\u003e\n\u003chead\u003e\n\u003c/head\u003e\n\n\u003cbody\u003e\n\u003cdiv\u003e\u003cdiv class=\"ads-in-post hide\\_if\\_width\\_less\\_800\"\u003e\n\u003cscript async src=\"//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\"\u003e\u003c/script\u003e\n\u003c!-- 728x90 - After2ndH4 --\u003e\n\u003cins class=\"adsbygoogle hide\\_if\\_width\\_less\\_800\" \n style=\"display:inline-block;width:728px;height:90px\"\n data-ad-client=\"ca-pub-2836379775501347\"\n data-ad-slot=\"3642936086\"\n data-ad-region=\"yiibairegion\"\u003e\u003c/ins\u003e\n\u003cscript\u003e\n(adsbygoogle = window.adsbygoogle || \\[\\]).push({});\n\u003c/script\u003e\n\u003c/div\u003e\u003c/div\u003e\u003ch2\u003eHello Hello Hello ~ from sayHello.jsp\u003c/h2\u003e\n\n\u003c/body\u003e\n\u003c/html\u003e\n\n\u003cp\u003e\u003cstrong\u003esayStruts2.jsp\u003c/strong\u003e\u003c/p\u003e\n\u003chtml\u003e\n\u003chead\u003e\n\u003c/head\u003e\n\n\u003cbody\u003e\n\u003ch2\u003eStruts 2 Struts 2 Struts 2 ~ from sayStruts2.jsp\u003c/h2\u003e\n\n\u003c/body\u003e\n\u003c/html\u003e\n\n\u003cp\u003e\u003cstrong\u003esaySysOut.jsp\u003c/strong\u003e\u003c/p\u003e\n\u003chtml\u003e\n\u003chead\u003e\n\u003c/head\u003e\n\n\u003cbody\u003e\n\u003ch2\u003eSysOut SysOut SysOut ~ from saySysOut.jsp\u003c/h2\u003e\n\n\u003c/body\u003e\n\u003c/html\u003e\n\n\u003ch2 id=\"3-strutsxml\"\u003e3. struts.xml\u003c/h2\u003e\n\u003cp\u003e聲明一些結果名稱來演示 ExecuteReuslt 的效果。\u003c/p\u003e\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\" ?\u003e\n\u003c!DOCTYPE struts PUBLIC\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u003e\n\n\u003cstruts\u003e\n \u003cconstant name=\"struts.devMode\" value=\"true\" /\u003e\n \u003cpackage name=\"default\" namespace=\"/\" extends=\"struts-default\"\u003e\n\n\u003cpre\u003e\u003ccode\u003e\u0026lt;action name=\u0026quot;actionTagAction\u0026quot; \n class=\u0026quot;com.yiibai.common.action.ActionTagAction\u0026quot; \u0026gt;\n \u0026lt;result name=\u0026quot;success\u0026quot;\u0026gt;pages/action.jsp\u0026lt;/result\u0026gt;\n\u0026lt;/action\u0026gt;\n\n\u0026lt;action name=\u0026quot;sayHelloAction\u0026quot; \n class=\u0026quot;com.yiibai.common.action.ActionTagAction\u0026quot; \n method=\u0026quot;sayHello\u0026quot;\u0026gt;\n\n \u0026lt;result name=\u0026quot;sayHello\u0026quot;\u0026gt;sayHello.jsp\u0026lt;/result\u0026gt;\n \u0026lt;result name=\u0026quot;sayStruts2\u0026quot;\u0026gt;sayStruts2.jsp\u0026lt;/result\u0026gt;\n \u0026lt;result name=\u0026quot;saySysOut\u0026quot;\u0026gt;saySysOut.jsp\u0026lt;/result\u0026gt;\n\u0026lt;/action\u0026gt;\u003c/code\u003e\u003c/pre\u003e\n \u003c/package\u003e\n\u003c/struts\u003e\n\n\u003ch2 id=\"4-示例\"\u003e4. 示例\u003c/h2\u003e\n\u003cp\u003e\u003ca target=\"_blank\" rel=\"nofollow noreferrer\" href=\"http://localhost:8080/struts2actiontag/actionTagAction.action\"\u003ehttp://localhost:8080/struts2actiontag/actionTagAction.action\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e在瀏覽器中打開上面的URL,顯示結果如下圖:\u003c/p\u003e\n\u003cp\u003e\n \u003cimg src=https://asset.1ju.org/cmsstatic/action-1.png loading='lazy' alt=Struts2 \u0026lt;s:action\u0026gt;標籤示例 class='my-8 w-full relative rounded-sm object-cover shadow-lg' /\u003e\n\u003c/p\u003e\n\u003ch2 id=\"參考\"\u003e參考\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e \u003ca target=\"_blank\" rel=\"nofollow noreferrer\" href=\"http://struts.apache.org/2.0.14/docs/action.html\"\u003eStruts2 \u0026lt;s:action\u0026gt;標籤文檔\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e代碼下載 - \u003ca target=\"_blank\" rel=\"nofollow noreferrer\" href=\"http://pan.baidu.com/s/1kT8NTUf\"\u003ehttp://pan.baidu.com/s/1kT8NTUf\u003c/a\u003e\u003c/p\u003e\n"])</script><script>self.__next_f.push([1,"89:T1215,"])</script><script>self.__next_f.push([1,"\u003cp\u003eStruts2 的「action」標籤是用來直接從JSP頁面中調用Action類。如果「executeResult」屬性設置爲true,則結果頁的內容將直接在當前網頁渲染。\u003c/p\u003e\n\u003cp\u003e這是用一個完整的例子很好地說明:\u003c/p\u003e\n\u003ch2 id=\"1-動作\"\u003e1. 動作\u003c/h2\u003e\n\u003cp\u003eAction類有幾個方法用來轉發不同結果的結果頁面。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eParamTagAction.java\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003epackage com.yiibai.common.action;\u003c/p\u003e\n\u003cp\u003eimport com.opensymphony.xwork2.ActionSupport;\u003c/p\u003e\n\u003cp\u003epublic class ActionTagAction extends ActionSupport{\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003epublic String execute() {\n return SUCCESS;\n}\n\npublic String sayHello(){\n return \u0026quot;sayHello\u0026quot;;\n}\n\npublic String sayStruts2(){\n return \u0026quot;sayStruts2\u0026quot;;\n}\n\npublic String saySysOut(){\n System.out.println(\u0026quot;SysOut SysOut SysOut\u0026quot;);\n return \u0026quot;saySysOut\u0026quot;;\n}\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003ch2 id=\"2-saction標籤示例\"\u003e2. \u0026lt;s:action\u0026gt;標籤示例\u003c/h2\u003e\n\u003cp\u003e下面的JSP頁面顯示如何使用「action」標籤。如果 executeResult=」true」,動作標籤被指定方法執行且結果頁面將直接顯示; 否則,它只是執行的方法,結果頁面不會顯示出來。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eaction.jsp\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u0026lt;%@ taglib prefix=\u0026quot;s\u0026quot; uri=\u0026quot;/struts-tags\u0026quot; %\u0026gt;\u003c/p\u003e\n\u003chtml\u003e\n\u003chead\u003e\u003ctitle\u003estruts2 action標籤示例\u003ctitle\u003e\n\u003c/head\u003e\n\n\u003cbody\u003e\n\u003ch1\u003eStruts2 action標籤示例\u003c/h1\u003e\n\n\u003col\u003e\n\n\u003cli\u003e\nExecute the action's result, render the page here. \n\u003cs:action name=\"sayHelloAction\" executeResult=\"true\"/\u003e\n\u003c/li\u003e\n\n\u003cli\u003e\nDoing the same as above, but call action's sayStruts2() method. \n\u003cs:action name=\"sayHelloAction!sayStruts2\" executeResult=\"true\"/\u003e\n\u003c/li\u003e\n\n\u003cli\u003e\nCall the action's saySysOut() method only, no result will be rendered,\nBy defautlt, executeResult=\"false\". \n\u003cs:action name=\"sayHelloAction!saySysOut\" /\u003e\n\u003c/li\u003e\n\n\u003c/ol\u003e\n\n\u003c/body\u003e\n\u003c/html\u003e\n\n\u003cp\u003e\u003cstrong\u003esayHello.jsp\u003c/strong\u003e\u003c/p\u003e\n\u003chtml\u003e\n\u003chead\u003e\n\u003c/head\u003e\n\n\u003cbody\u003e\n\u003cdiv\u003e\u003cdiv class=\"ads-in-post hide\\_if\\_width\\_less\\_800\"\u003e\n\u003cscript async src=\"//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\"\u003e\u003c/script\u003e\n\u003c!-- 728x90 - After2ndH4 --\u003e\n\u003cins class=\"adsbygoogle hide\\_if\\_width\\_less\\_800\" \n style=\"display:inline-block;width:728px;height:90px\"\n data-ad-client=\"ca-pub-2836379775501347\"\n data-ad-slot=\"3642936086\"\n data-ad-region=\"yiibairegion\"\u003e\u003c/ins\u003e\n\u003cscript\u003e\n(adsbygoogle = window.adsbygoogle || \\[\\]).push({});\n\u003c/script\u003e\n\u003c/div\u003e\u003c/div\u003e\u003ch2\u003eHello Hello Hello ~ from sayHello.jsp\u003c/h2\u003e\n\n\u003c/body\u003e\n\u003c/html\u003e\n\n\u003cp\u003e\u003cstrong\u003esayStruts2.jsp\u003c/strong\u003e\u003c/p\u003e\n\u003chtml\u003e\n\u003chead\u003e\n\u003c/head\u003e\n\n\u003cbody\u003e\n\u003ch2\u003eStruts 2 Struts 2 Struts 2 ~ from sayStruts2.jsp\u003c/h2\u003e\n\n\u003c/body\u003e\n\u003c/html\u003e\n\n\u003cp\u003e\u003cstrong\u003esaySysOut.jsp\u003c/strong\u003e\u003c/p\u003e\n\u003chtml\u003e\n\u003chead\u003e\n\u003c/head\u003e\n\n\u003cbody\u003e\n\u003ch2\u003eSysOut SysOut SysOut ~ from saySysOut.jsp\u003c/h2\u003e\n\n\u003c/body\u003e\n\u003c/html\u003e\n\n\u003ch2 id=\"3-strutsxml\"\u003e3. struts.xml\u003c/h2\u003e\n\u003cp\u003e聲明一些結果名稱來演示 ExecuteReuslt 的效果。\u003c/p\u003e\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\" ?\u003e\n\u003c!DOCTYPE struts PUBLIC\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u003e\n\n\u003cstruts\u003e\n \u003cconstant name=\"struts.devMode\" value=\"true\" /\u003e\n \u003cpackage name=\"default\" namespace=\"/\" extends=\"struts-default\"\u003e\n\n\u003cpre\u003e\u003ccode\u003e\u0026lt;action name=\u0026quot;actionTagAction\u0026quot; \n class=\u0026quot;com.yiibai.common.action.ActionTagAction\u0026quot; \u0026gt;\n \u0026lt;result name=\u0026quot;success\u0026quot;\u0026gt;pages/action.jsp\u0026lt;/result\u0026gt;\n\u0026lt;/action\u0026gt;\n\n\u0026lt;action name=\u0026quot;sayHelloAction\u0026quot; \n class=\u0026quot;com.yiibai.common.action.ActionTagAction\u0026quot; \n method=\u0026quot;sayHello\u0026quot;\u0026gt;\n\n \u0026lt;result name=\u0026quot;sayHello\u0026quot;\u0026gt;sayHello.jsp\u0026lt;/result\u0026gt;\n \u0026lt;result name=\u0026quot;sayStruts2\u0026quot;\u0026gt;sayStruts2.jsp\u0026lt;/result\u0026gt;\n \u0026lt;result name=\u0026quot;saySysOut\u0026quot;\u0026gt;saySysOut.jsp\u0026lt;/result\u0026gt;\n\u0026lt;/action\u0026gt;\u003c/code\u003e\u003c/pre\u003e\n \u003c/package\u003e\n\u003c/struts\u003e\n\n\u003ch2 id=\"4-示例\"\u003e4. 示例\u003c/h2\u003e\n\u003cp\u003e\u003ca target=\"_blank\" rel=\"nofollow noreferrer\" href=\"http://localhost:8080/struts2actiontag/actionTagAction.action\"\u003ehttp://localhost:8080/struts2actiontag/actionTagAction.action\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e在瀏覽器中打開上面的URL,顯示結果如下圖:\u003c/p\u003e\n\u003cp\u003e\n \u003cimg src=https://asset.1ju.org/cmsstatic/action-1.png loading='lazy' alt=Struts2 \u0026lt;s:action\u0026gt;標籤示例 class='my-8 w-full relative rounded-sm object-cover shadow-lg' /\u003e\n\u003c/p\u003e\n\u003ch2 id=\"參考\"\u003e參考\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e \u003ca target=\"_blank\" rel=\"nofollow noreferrer\" href=\"http://struts.apache.org/2.0.14/docs/action.html\"\u003eStruts2 \u0026lt;s:action\u0026gt;標籤文檔\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e代碼下載 - \u003ca target=\"_blank\" rel=\"nofollow noreferrer\" href=\"http://pan.baidu.com/s/1kT8NTUf\"\u003ehttp://pan.baidu.com/s/1kT8NTUf\u003c/a\u003e\u003c/p\u003e\n"])</script><script>self.__next_f.push([1,"8b:T1293,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e\n Struts2 的「action」標籤是用來直接從JSP頁面中調用Action類。如果「executeResult」屬性設置爲true,則結果頁的內容將直接在當前網頁渲染。 \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cdiv\u003e\n 這是用一個完整的例子很好地說明: \n\u003c/div\u003e \n\u003ch2\u003e 1. 動作 \u003c/h2\u003e \n\u003cdiv\u003e\n Action類有幾個方法用來轉發不同結果的結果頁面。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eParamTagAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class ActionTagAction extends ActionSupport{\r\n\t\r\n\tpublic String execute() {\r\n\t\treturn SUCCESS;\r\n\t}\r\n\t\r\n\tpublic String sayHello(){\r\n\t\treturn \"sayHello\";\r\n\t}\r\n\t\r\n\tpublic String sayStruts2(){\r\n\t\treturn \"sayStruts2\";\r\n\t}\r\n\t\r\n\tpublic String saySysOut(){\r\n\t\tSystem.out.println(\"SysOut SysOut SysOut\");\r\n\t\treturn \"saySysOut\";\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. \u0026lt;s:action\u0026gt;標籤示例 \u003c/h2\u003e \n\u003cp\u003e 下面的JSP頁面顯示如何使用「action」標籤。如果\u0026nbsp;executeResult=」true」,動作標籤被指定方法執行且結果頁面將直接顯示;\u0026nbsp;否則,它只是執行的方法,結果頁面不會顯示出來。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eaction.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\u0026lt;title\u0026gt;struts2 action標籤示例\u0026lt;title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2 action標籤示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;ol\u0026gt;\r\n\r\n\u0026lt;li\u0026gt;\r\nExecute the action's result, render the page here. \r\n\u0026lt;s:action name=\"sayHelloAction\" executeResult=\"true\"/\u0026gt;\r\n\u0026lt;/li\u0026gt;\r\n\r\n\u0026lt;li\u0026gt;\r\nDoing the same as above, but call action's sayStruts2() method. \r\n\u0026lt;s:action name=\"sayHelloAction!sayStruts2\" executeResult=\"true\"/\u0026gt;\r\n\u0026lt;/li\u0026gt;\r\n\r\n\u0026lt;li\u0026gt;\r\nCall the action's saySysOut() method only, no result will be rendered,\r\nBy defautlt, executeResult=\"false\". \r\n\u0026lt;s:action name=\"sayHelloAction!saySysOut\" /\u0026gt;\r\n\u0026lt;/li\u0026gt;\r\n\r\n\u0026lt;/ol\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003esayHello.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;div\u0026gt;\u0026lt;div class=\"ads-in-post hide_if_width_less_800\"\u0026gt;\r\n\u0026lt;script async src=\"//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\"\u0026gt;\u0026lt;/script\u0026gt;\r\n\u0026lt;!-- 728x90 - After2ndH4 --\u0026gt;\r\n\u0026lt;ins class=\"adsbygoogle hide_if_width_less_800\" \r\n style=\"display:inline-block;width:728px;height:90px\"\r\n data-ad-client=\"ca-pub-2836379775501347\"\r\n data-ad-slot=\"3642936086\"\r\n\t data-ad-region=\"yiibairegion\"\u0026gt;\u0026lt;/ins\u0026gt;\r\n\u0026lt;script\u0026gt;\r\n(adsbygoogle = window.adsbygoogle || []).push({});\r\n\u0026lt;/script\u0026gt;\r\n\u0026lt;/div\u0026gt;\u0026lt;/div\u0026gt;\u0026lt;h2\u0026gt;Hello Hello Hello ~ from sayHello.jsp\u0026lt;/h2\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003esayStruts2.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h2\u0026gt;Struts 2 Struts 2 Struts 2 ~ from sayStruts2.jsp\u0026lt;/h2\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003esaySysOut.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h2\u0026gt;SysOut SysOut SysOut ~ from saySysOut.jsp\u0026lt;/h2\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cdiv\u003e\n 聲明一些結果名稱來演示\u0026nbsp;ExecuteReuslt\u0026nbsp;的效果。 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\u0026lt;action name=\"actionTagAction\" \r\n\t\tclass=\"com.yiibai.common.action.ActionTagAction\" \u0026gt;\r\n\t\t\u0026lt;result name=\"success\"\u0026gt;pages/action.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;action name=\"sayHelloAction\" \r\n\t\tclass=\"com.yiibai.common.action.ActionTagAction\" \r\n method=\"sayHello\"\u0026gt;\r\n\r\n\t\t\u0026lt;result name=\"sayHello\"\u0026gt;sayHello.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;result name=\"sayStruts2\"\u0026gt;sayStruts2.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;result name=\"saySysOut\"\u0026gt;saySysOut.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n \u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e http://localhost:8080/struts2actiontag/actionTagAction.action \u003c/p\u003e \n\u003cp\u003e 在瀏覽器中打開上面的URL,顯示結果如下圖: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/action-1.png\" alt=\"Struts2 \u003cs:action\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/action.html\"\u003eStruts2 \u0026lt;s:action\u0026gt;標籤文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e 代碼下載 -\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1kT8NTUf\"\u003ehttp://pan.baidu.com/s/1kT8NTUf\u003c/a\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"8c:Teb6,"])</script><script>self.__next_f.push([1,"Struts2 的「action」標籤是用來直接從JSP頁面中調用Action類。如果「executeResult」屬性設置爲true,則結果頁的內容將直接在當前網頁渲染。\n\n \n\n這是用一個完整的例子很好地說明:\n\n1\\. 動作\n------\n\nAction類有幾個方法用來轉發不同結果的結果頁面。\n\n**ParamTagAction.java**\n\npackage com.yiibai.common.action;\n\nimport com.opensymphony.xwork2.ActionSupport;\n \npublic class ActionTagAction extends ActionSupport{\n\t\n\tpublic String execute() {\n\t\treturn SUCCESS;\n\t}\n\t\n\tpublic String sayHello(){\n\t\treturn \"sayHello\";\n\t}\n\t\n\tpublic String sayStruts2(){\n\t\treturn \"sayStruts2\";\n\t}\n\t\n\tpublic String saySysOut(){\n\t\tSystem.out.println(\"SysOut SysOut SysOut\");\n\t\treturn \"saySysOut\";\n\t}\n\t\n}\n\n2\\. \u003cs:action\u003e標籤示例\n------------------\n\n下面的JSP頁面顯示如何使用「action」標籤。如果 executeResult=」true」,動作標籤被指定方法執行且結果頁面將直接顯示; 否則,它只是執行的方法,結果頁面不會顯示出來。\n\n**action.jsp**\n\n\u003c%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u003e\n\u003chtml\u003e\n\u003chead\u003e\u003ctitle\u003estruts2 action標籤示例\u003ctitle\u003e\n\u003c/head\u003e\n \n\u003cbody\u003e\n\u003ch1\u003eStruts2 action標籤示例\u003c/h1\u003e\n\n\u003col\u003e\n\n\u003cli\u003e\nExecute the action's result, render the page here. \n\u003cs:action name=\"sayHelloAction\" executeResult=\"true\"/\u003e\n\u003c/li\u003e\n\n\u003cli\u003e\nDoing the same as above, but call action's sayStruts2() method. \n\u003cs:action name=\"sayHelloAction!sayStruts2\" executeResult=\"true\"/\u003e\n\u003c/li\u003e\n\n\u003cli\u003e\nCall the action's saySysOut() method only, no result will be rendered,\nBy defautlt, executeResult=\"false\". \n\u003cs:action name=\"sayHelloAction!saySysOut\" /\u003e\n\u003c/li\u003e\n\n\u003c/ol\u003e\n\n\u003c/body\u003e\n\u003c/html\u003e\n\n**sayHello.jsp**\n\n\u003chtml\u003e\n\u003chead\u003e\n\u003c/head\u003e\n \n\u003cbody\u003e\n\u003cdiv\u003e\u003cdiv class=\"ads-in-post hide\\_if\\_width\\_less\\_800\"\u003e\n\u003cscript async src=\"//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\"\u003e\u003c/script\u003e\n\u003c!-- 728x90 - After2ndH4 --\u003e\n\u003cins class=\"adsbygoogle hide\\_if\\_width\\_less\\_800\" \n style=\"display:inline-block;width:728px;height:90px\"\n data-ad-client=\"ca-pub-2836379775501347\"\n data-ad-slot=\"3642936086\"\n\t data-ad-region=\"yiibairegion\"\u003e\u003c/ins\u003e\n\u003cscript\u003e\n(adsbygoogle = window.adsbygoogle || \\[\\]).push({});\n\u003c/script\u003e\n\u003c/div\u003e\u003c/div\u003e\u003ch2\u003eHello Hello Hello ~ from sayHello.jsp\u003c/h2\u003e\n\n\u003c/body\u003e\n\u003c/html\u003e\n\n**sayStruts2.jsp**\n\n\u003chtml\u003e\n\u003chead\u003e\n\u003c/head\u003e\n \n\u003cbody\u003e\n\u003ch2\u003eStruts 2 Struts 2 Struts 2 ~ from sayStruts2.jsp\u003c/h2\u003e\n\n\u003c/body\u003e\n\u003c/html\u003e\n\n**saySysOut.jsp**\n\n\u003chtml\u003e\n\u003chead\u003e\n\u003c/head\u003e\n \n\u003cbody\u003e\n\u003ch2\u003eSysOut SysOut SysOut ~ from saySysOut.jsp\u003c/h2\u003e\n\n\u003c/body\u003e\n\u003c/html\u003e\n\n3\\. struts.xml\n--------------\n\n聲明一些結果名稱來演示 ExecuteReuslt 的效果。\n\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\" ?\u003e\n\u003c!DOCTYPE struts PUBLIC\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u003e\n \n\u003cstruts\u003e\n \u003cconstant name=\"struts.devMode\" value=\"true\" /\u003e\n \u003cpackage name=\"default\" namespace=\"/\" extends=\"struts-default\"\u003e\n\t\n\t\u003caction name=\"actionTagAction\" \n\t\tclass=\"com.yiibai.common.action.ActionTagAction\" \u003e\n\t\t\u003cresult name=\"success\"\u003epages/action.jsp\u003c/result\u003e\n\t\u003c/action\u003e\n\t\t\n\t\u003caction name=\"sayHelloAction\" \n\t\tclass=\"com.yiibai.common.action.ActionTagAction\" \n method=\"sayHello\"\u003e\n\n\t\t\u003cresult name=\"sayHello\"\u003esayHello.jsp\u003c/result\u003e\n\t\t\u003cresult name=\"sayStruts2\"\u003esayStruts2.jsp\u003c/result\u003e\n\t\t\u003cresult name=\"saySysOut\"\u003esaySysOut.jsp\u003c/result\u003e\n\t\u003c/action\u003e\n\t\t\n \u003c/package\u003e\n\u003c/struts\u003e\n\n4\\. 示例\n------\n\nhttp://localhost:8080/struts2actiontag/actionTagAction.action\n\n在瀏覽器中打開上面的URL,顯示結果如下圖:\n\n![Struts2 \u003cs:action\u003e標籤示例](https://asset.1ju.org/cmsstatic/action-1.png)\n\n參考\n--\n\n \n\n1. [Struts2 \u003cs:action\u003e標籤文檔](http://struts.apache.org/2.0.14/docs/action.html)\n\n代碼下載 - [http://pan.baidu.com/s/1kT8NTUf](http://pan.baidu.com/s/1kT8NTUf)"])</script><script>self.__next_f.push([1,"8d:T1215,"])</script><script>self.__next_f.push([1,"\u003cp\u003eStruts2 的「action」標籤是用來直接從JSP頁面中調用Action類。如果「executeResult」屬性設置爲true,則結果頁的內容將直接在當前網頁渲染。\u003c/p\u003e\n\u003cp\u003e這是用一個完整的例子很好地說明:\u003c/p\u003e\n\u003ch2 id=\"1-動作\"\u003e1. 動作\u003c/h2\u003e\n\u003cp\u003eAction類有幾個方法用來轉發不同結果的結果頁面。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eParamTagAction.java\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003epackage com.yiibai.common.action;\u003c/p\u003e\n\u003cp\u003eimport com.opensymphony.xwork2.ActionSupport;\u003c/p\u003e\n\u003cp\u003epublic class ActionTagAction extends ActionSupport{\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003epublic String execute() {\n return SUCCESS;\n}\n\npublic String sayHello(){\n return \u0026quot;sayHello\u0026quot;;\n}\n\npublic String sayStruts2(){\n return \u0026quot;sayStruts2\u0026quot;;\n}\n\npublic String saySysOut(){\n System.out.println(\u0026quot;SysOut SysOut SysOut\u0026quot;);\n return \u0026quot;saySysOut\u0026quot;;\n}\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e}\u003c/p\u003e\n\u003ch2 id=\"2-saction標籤示例\"\u003e2. \u0026lt;s:action\u0026gt;標籤示例\u003c/h2\u003e\n\u003cp\u003e下面的JSP頁面顯示如何使用「action」標籤。如果 executeResult=」true」,動作標籤被指定方法執行且結果頁面將直接顯示; 否則,它只是執行的方法,結果頁面不會顯示出來。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eaction.jsp\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u0026lt;%@ taglib prefix=\u0026quot;s\u0026quot; uri=\u0026quot;/struts-tags\u0026quot; %\u0026gt;\u003c/p\u003e\n\u003chtml\u003e\n\u003chead\u003e\u003ctitle\u003estruts2 action標籤示例\u003ctitle\u003e\n\u003c/head\u003e\n\n\u003cbody\u003e\n\u003ch1\u003eStruts2 action標籤示例\u003c/h1\u003e\n\n\u003col\u003e\n\n\u003cli\u003e\nExecute the action's result, render the page here. \n\u003cs:action name=\"sayHelloAction\" executeResult=\"true\"/\u003e\n\u003c/li\u003e\n\n\u003cli\u003e\nDoing the same as above, but call action's sayStruts2() method. \n\u003cs:action name=\"sayHelloAction!sayStruts2\" executeResult=\"true\"/\u003e\n\u003c/li\u003e\n\n\u003cli\u003e\nCall the action's saySysOut() method only, no result will be rendered,\nBy defautlt, executeResult=\"false\". \n\u003cs:action name=\"sayHelloAction!saySysOut\" /\u003e\n\u003c/li\u003e\n\n\u003c/ol\u003e\n\n\u003c/body\u003e\n\u003c/html\u003e\n\n\u003cp\u003e\u003cstrong\u003esayHello.jsp\u003c/strong\u003e\u003c/p\u003e\n\u003chtml\u003e\n\u003chead\u003e\n\u003c/head\u003e\n\n\u003cbody\u003e\n\u003cdiv\u003e\u003cdiv class=\"ads-in-post hide\\_if\\_width\\_less\\_800\"\u003e\n\u003cscript async src=\"//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\"\u003e\u003c/script\u003e\n\u003c!-- 728x90 - After2ndH4 --\u003e\n\u003cins class=\"adsbygoogle hide\\_if\\_width\\_less\\_800\" \n style=\"display:inline-block;width:728px;height:90px\"\n data-ad-client=\"ca-pub-2836379775501347\"\n data-ad-slot=\"3642936086\"\n data-ad-region=\"yiibairegion\"\u003e\u003c/ins\u003e\n\u003cscript\u003e\n(adsbygoogle = window.adsbygoogle || \\[\\]).push({});\n\u003c/script\u003e\n\u003c/div\u003e\u003c/div\u003e\u003ch2\u003eHello Hello Hello ~ from sayHello.jsp\u003c/h2\u003e\n\n\u003c/body\u003e\n\u003c/html\u003e\n\n\u003cp\u003e\u003cstrong\u003esayStruts2.jsp\u003c/strong\u003e\u003c/p\u003e\n\u003chtml\u003e\n\u003chead\u003e\n\u003c/head\u003e\n\n\u003cbody\u003e\n\u003ch2\u003eStruts 2 Struts 2 Struts 2 ~ from sayStruts2.jsp\u003c/h2\u003e\n\n\u003c/body\u003e\n\u003c/html\u003e\n\n\u003cp\u003e\u003cstrong\u003esaySysOut.jsp\u003c/strong\u003e\u003c/p\u003e\n\u003chtml\u003e\n\u003chead\u003e\n\u003c/head\u003e\n\n\u003cbody\u003e\n\u003ch2\u003eSysOut SysOut SysOut ~ from saySysOut.jsp\u003c/h2\u003e\n\n\u003c/body\u003e\n\u003c/html\u003e\n\n\u003ch2 id=\"3-strutsxml\"\u003e3. struts.xml\u003c/h2\u003e\n\u003cp\u003e聲明一些結果名稱來演示 ExecuteReuslt 的效果。\u003c/p\u003e\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\" ?\u003e\n\u003c!DOCTYPE struts PUBLIC\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u003e\n\n\u003cstruts\u003e\n \u003cconstant name=\"struts.devMode\" value=\"true\" /\u003e\n \u003cpackage name=\"default\" namespace=\"/\" extends=\"struts-default\"\u003e\n\n\u003cpre\u003e\u003ccode\u003e\u0026lt;action name=\u0026quot;actionTagAction\u0026quot; \n class=\u0026quot;com.yiibai.common.action.ActionTagAction\u0026quot; \u0026gt;\n \u0026lt;result name=\u0026quot;success\u0026quot;\u0026gt;pages/action.jsp\u0026lt;/result\u0026gt;\n\u0026lt;/action\u0026gt;\n\n\u0026lt;action name=\u0026quot;sayHelloAction\u0026quot; \n class=\u0026quot;com.yiibai.common.action.ActionTagAction\u0026quot; \n method=\u0026quot;sayHello\u0026quot;\u0026gt;\n\n \u0026lt;result name=\u0026quot;sayHello\u0026quot;\u0026gt;sayHello.jsp\u0026lt;/result\u0026gt;\n \u0026lt;result name=\u0026quot;sayStruts2\u0026quot;\u0026gt;sayStruts2.jsp\u0026lt;/result\u0026gt;\n \u0026lt;result name=\u0026quot;saySysOut\u0026quot;\u0026gt;saySysOut.jsp\u0026lt;/result\u0026gt;\n\u0026lt;/action\u0026gt;\u003c/code\u003e\u003c/pre\u003e\n \u003c/package\u003e\n\u003c/struts\u003e\n\n\u003ch2 id=\"4-示例\"\u003e4. 示例\u003c/h2\u003e\n\u003cp\u003e\u003ca target=\"_blank\" rel=\"nofollow noreferrer\" href=\"http://localhost:8080/struts2actiontag/actionTagAction.action\"\u003ehttp://localhost:8080/struts2actiontag/actionTagAction.action\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e在瀏覽器中打開上面的URL,顯示結果如下圖:\u003c/p\u003e\n\u003cp\u003e\n \u003cimg src=https://asset.1ju.org/cmsstatic/action-1.png loading='lazy' alt=Struts2 \u0026lt;s:action\u0026gt;標籤示例 class='my-8 w-full relative rounded-sm object-cover shadow-lg' /\u003e\n\u003c/p\u003e\n\u003ch2 id=\"參考\"\u003e參考\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e \u003ca target=\"_blank\" rel=\"nofollow noreferrer\" href=\"http://struts.apache.org/2.0.14/docs/action.html\"\u003eStruts2 \u0026lt;s:action\u0026gt;標籤文檔\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e代碼下載 - \u003ca target=\"_blank\" rel=\"nofollow noreferrer\" href=\"http://pan.baidu.com/s/1kT8NTUf\"\u003ehttp://pan.baidu.com/s/1kT8NTUf\u003c/a\u003e\u003c/p\u003e\n"])</script><script>self.__next_f.push([1,"8e:T3186,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cp\u003e Apache\u0026nbsp;\u003ca href=\"http://struts.apache.org/2.x/\"\u003eStruts 2\u003c/a\u003e\u0026nbsp;是一種流行的 Java模型 - 視圖 - 控制器(MVC)框架,成功地結合了\u0026nbsp;WebWork和Struts1.x 兩種 web 框架。 \u003c/p\u003e \n \u003cp\u003e Apache Struts2與Struts1完全不同,它的核心功能都是使用攔截實現「值棧」的概念,OGNL表達式和Struts2標籤來解決應用程序數據,很多註解和約定,使這個框架更加易於使用。 在本教程中,它提供了許多使用Struts2的MVC框架的實例和解釋。 \u003c/p\u003e \n \u003cp\u003e 歡迎來到易百教程學習Struts2。 \u003c/p\u003e \n \u003ch2\u003e Struts2 快速入門 \u003c/h2\u003e \n \u003cp\u003e Struts2快速入門的例子。 \u003c/p\u003e \n \u003cul\u003e \n \u003cli\u003e Struts 2 hello world (XML版本)\u003cbr\u003e 使用XML文件的Struts 2 Hello World 示例 \u003c/li\u003e \n \u003cli\u003e Struts 2 Hello World (註解版本)\u003cbr\u003e 使用註釋的Struts 2 Hello World 示例 \u003c/li\u003e \n \u003cli\u003e @ResultPath 註釋示例\u003cbr\u003e @ResultPath 註釋說明和示例 \u003c/li\u003e \n \u003c/ul\u003e \n \u003ch2\u003e Struts2 配置 \u003c/h2\u003e \n \u003cp\u003e 任何關於 Struts2 的配置文件。 \u003c/p\u003e \n \u003cul\u003e \n \u003cli\u003e 多個Struts配置文件示例\u003cbr\u003e 拆分大的Struts配置文件分成多個小的配置文件。 \u003c/li\u003e \n \u003cli\u003e Struts2 命名空間配置和解釋 \u003cbr\u003e \n \u003cdiv\u003e\n Struts2命名空間是一個新的概念,用來處理多個模塊,由下式給出一個命名空間對應的每個模塊。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e Struts2開發模式\u003cbr\u003e \n \u003cdiv\u003e\n 啓用了Struts2開發模式將會使調試變得更容易。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 如何刪除Struts2動作的後綴擴展名 \n \u003c/div\u003e \u003cbr\u003e \n \u003cdiv\u003e\n 默認的「.action」擴展名是醜陋的,並不是用戶友好的,可以刪除或用另一個擴展名來取代它。 \n \u003c/div\u003e \u003c/li\u003e \n \u003c/ul\u003e \n \u003ch2\u003e Struts2 動作和表單 \u003c/h2\u003e \n \u003cdiv\u003e\n Struts\u0026nbsp;2的動作和表單數據管理。 \n \u003c/div\u003e \n \u003cul\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 使用Struts2動作 \n \u003c/div\u003e \n \u003cdiv\u003e\n Struts\u0026nbsp;2的動作說明和示例。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e Struts 2 ActionError \u0026amp; ActionMessage Example\u003cbr\u003e \n \u003cdiv\u003e\n Struts\u0026nbsp;2的ActionError和ActionMessage的解釋和例子。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e Struts 2 ModelDriven example\u003cbr\u003e \n \u003cdiv\u003e\n 自動將的表單數據傳輸到對象。 \n \u003c/div\u003e \u003c/li\u003e \n \u003c/ul\u003e \n \u003ch2\u003e Struts2 攔截器 \u003c/h2\u003e \n \u003cdiv\u003e\n 關於Struts\u0026nbsp;2的攔截器。 \n \u003c/div\u003e \n \u003cul\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 映射攔截動作 \n \u003c/div\u003e \n \u003cdiv\u003e\n 配置攔截器動作。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 重寫攔截器參數 \n \u003c/div\u003e \n \u003cdiv\u003e\n 幾種方法來覆蓋攔截器的參數。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 攔截器棧的例子 \n \u003c/div\u003e \n \u003cdiv\u003e\n 攔截器堆棧用於建立一組的攔截器,以再利用。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 創建自己的攔截器 \n \u003c/div\u003e \n \u003cdiv\u003e\n 創建自己的攔截器指南,以滿足您的需求。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n execAndWait攔截器例子 \n \u003c/div\u003e \n \u003cdiv\u003e\n 一個非常方便的攔截器長時間運行動作在後臺,顯示用戶的自定義的等待頁面。 \n \u003c/div\u003e \u003c/li\u003e \n \u003c/ul\u003e \n \u003ch2\u003e Struts 2 UI標籤 \u003c/h2\u003e \n \u003cdiv\u003e\n Struts\u0026nbsp;2的UI標籤,來渲染HTML表單和非表單組件。 \n \u003c/div\u003e \n \u003cul\u003e \n \u003cli\u003e TextBox文檔示例\u003cbr\u003e Struts2 \u0026lt;s:textfield\u0026gt; 文本實例. \u003c/li\u003e \n \u003cli\u003e Password 示例\u003cbr\u003e Struts2 \u0026lt;s:password\u0026gt; 密碼實例. \u003c/li\u003e \n \u003cli\u003e Hidden隱藏值示例\u003cbr\u003e Struts2 \u0026lt;s:hidden\u0026gt;\u0026nbsp;隱藏值例子 \u003c/li\u003e \n \u003cli\u003e Textarea - 文本域\u003cbr\u003e Struts2 \u0026lt;s:textarea\u0026gt;\u0026nbsp;textarea例子 \u003c/li\u003e \n \u003cli\u003e Radio 單選按鍵示例\u003cbr\u003e Struts2 \u0026lt;s:radio\u0026gt; radio單選按鈕例子 \u003c/li\u003e \n \u003cli\u003e \u0026nbsp;預選單選按鈕\u003cbr\u003e \n \u003cdiv\u003e\n 預選單選按鈕值示例 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e 複選框heckbox 示例\u003cbr\u003e Struts2 \u0026lt;s:checkbox\u0026gt; 複選框示例 \u003c/li\u003e \n \u003cli\u003e 複選框checkboxes 示例\u003cbr\u003e Struts2 \u0026lt;s:checkboxlist\u0026gt;\u0026nbsp;多發覆選框的例子 \u003c/li\u003e \n \u003cli\u003e 設置複選框的默認值\u003cbr\u003e \n \u003cdiv\u003e\n 設置多個複選框的默認值 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e 下拉框示例\u003cbr\u003e Struts2 \u0026lt;s:select\u0026gt;\u0026nbsp;下拉框例子 \u003c/li\u003e \n \u003cli\u003e 自動選擇下拉框示例\u003cbr\u003e \n \u003cdiv\u003e\n 自動選擇下拉框值指南 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e 組合框示例\u003cbr\u003e Struts2 \u0026lt;s:combobox\u0026gt;\u0026nbsp;組合框的例子 \u003c/li\u003e \n \u003cli\u003e head 示例\u003cbr\u003e Struts2 \u0026lt;s:head\u0026gt;,\u0026nbsp;呈現一個HTML頭組件 \u003c/li\u003e \n \u003cli\u003e 文件上傳示例\u003cbr\u003e Struts2 \u0026lt;s:file\u0026gt; 文件上傳示例 \u003c/li\u003e \n \u003cli\u003e 多文件上傳示例\u003cbr\u003e Struts2 \u0026lt;s:file\u0026gt; 多文件上傳示例 \u003c/li\u003e \n \u003cli\u003e 級聯選擇示例\u003cbr\u003e Struts2 \u0026lt;s:doubleselect\u0026gt;,\u0026nbsp;創建兩個HTML下拉框,當第一下拉列表中選擇,第二下拉列表將相應地改變 \u003c/li\u003e \n \u003cli\u003e updownselect 示例\u003cbr\u003e Struts2 \u0026lt;s:updownselect\u0026gt;,\u0026nbsp;創建一個帶有按鈕,向上或向下移動在選擇組件的選項選擇HTML組件。 \u003c/li\u003e \n \u003cli\u003e optiontransferselect 示例\u003cbr\u003e Struts2 \u0026lt;s:optiontransferselect\u0026gt;,\u0026nbsp;兩個「updownselect」選擇組件排列在左側和右側,在它們中間包含有按鈕來移動自己的選擇選項。 \u003c/li\u003e \n \u003cli\u003e datetimepicker 日期選擇\u003cbr\u003e Struts2 \u0026lt;s:datetimepicker\u0026gt;,\u0026nbsp;將呈現一個文本框和追加後面的日曆圖標,單擊日曆圖標上會提示的日期時間選擇器組件。 \u003c/li\u003e \n \u003cli\u003e autocompleter自動完成示例\u003cbr\u003e Struts2 \u0026lt;s:autocompleter\u0026gt;,\u0026nbsp;一個組合框,會自動提示下拉的提示菜單,在用戶輸入文本框時。 \u003c/li\u003e \n \u003cli\u003e autocompleter + JSON 示例\u003cbr\u003e \n \u003cdiv\u003e\n 舉個例子,使用JSON數據填充到autocompleter組件。 \n \u003c/div\u003e \u003c/li\u003e \n \u003c/ul\u003e \n \u003ch2\u003e Struts 2 控制標籤 \u003c/h2\u003e \n \u003cdiv\u003e\n 在 Struts2 中的控制標籤或邏輯標籤,用來做條件處理,迭代,處理和顯示數據。 \n \u003c/div\u003e \n \u003cul\u003e \n \u003cli\u003e \u0026lt;s:iterator\u0026gt;標籤迭代示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts2迭代器標籤用來迭代一個值,它可以是任何的 java.util.Collection 或 java.util.Iterator \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u0026lt;s:if\u0026gt;, \u0026lt;s:elseIf\u0026gt;, \u0026lt;s:else\u0026gt; 標籤示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts2\u0026nbsp;if,elseif和else標籤被用來執行基本條件檢查。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u0026lt;s:append\u0026gt;標籤示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts2\u0026nbsp;\u0026lt;s:append\u0026gt;標籤用來組合幾個迭代器(由列表或映射創建)到一個迭代器 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u0026lt;s:generator\u0026gt; 標籤示例\u003cbr\u003e \n \u003cdiv\u003e\n struts2\u0026nbsp;\u0026lt;s:generator\u0026gt;標記用於基於在頁中提供「val」屬性,以產生一個迭代。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u0026lt;s:merge\u0026gt;標籤示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts2\u0026nbsp;\u0026lt;s:merge\u0026gt;標籤用來合併幾個迭代器(以列表或映射創建)成一個迭代器。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u0026lt;s:sort\u0026gt;標籤示例\u003cbr\u003e Struts2 \u0026lt;s:sort\u0026gt;是用於排序一個列表,它通過使用 java.util.Comparator 來實現。 \u003c/li\u003e \n \u003cli\u003e subset tag example\u003cbr\u003e Struts2 \u0026lt;s:subset\u0026gt;標記用於輸出一個迭代元素的子集或部分。 \u003c/li\u003e \n \u003c/ul\u003e \n \u003ch2\u003e Struts2 數據標籤 \u003c/h2\u003e \n \u003cdiv\u003e\n Struts2數據標籤,從ValueStack中獲取數據,或將數據放入ValusStack。 \n \u003c/div\u003e \n \u003cul\u003e \n \u003cli\u003e \u0026lt;s:a\u0026gt;標籤示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts2的\u0026lt;s:a\u0026gt;標籤被用於渲染HTML的「\u0026lt;a\u0026gt;」標籤。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u0026lt;s:action\u0026gt;標籤示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts2的\u0026lt;s:action\u0026gt;標籤用來直接在一個JSP頁面中調用Action類 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u0026lt;s:bean\u0026gt;標籤示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts2的\u0026lt;s:bean\u0026gt;標籤用來在JSP頁面中實例化一個類 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u0026lt;s:date\u0026gt;標籤示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts2的\u0026lt;s:date\u0026gt;標籤用來在JSP頁面格式Date對象。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u0026lt;s:debug\u0026gt;標籤示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts\u0026nbsp;2的\u0026lt;s:debug\u0026gt;標籤是一個非常有用的調試標記,用於輸出「值棧」的內容,並在JSP頁面中輸出「堆棧上下文」的詳細信息。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u0026lt;s:include\u0026gt;標籤示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts\u0026nbsp;2的\u0026lt;s:include\u0026gt;標籤用來直接包含JSP或HTML頁面到當前頁面。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u0026lt;s:i18n\u0026gt;標籤示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts\u0026nbsp;2的\u0026lt;s:i18n\u0026gt;標籤用來獲取聲明的資源包,而不僅僅是資源包,也可獲取當前操作相關聯的消息。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u0026lt;s:param\u0026gt;標籤示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts2的\u0026lt;s:param\u0026gt;標籤用來參數化其他標籤。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u0026lt;s:property\u0026gt;標籤示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts2的\u0026lt;s:property\u0026gt;標籤用來從一個類獲取當前默認Action類的屬性值。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u0026lt;s:push\u0026gt;標籤示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts2的\u0026lt;s:push\u0026gt;標籤用來推值到堆棧的頂部,以便它可以容易訪問或參考。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u0026lt;s:set\u0026gt;標籤示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts2的\u0026lt;s:set\u0026gt;標籤用來在指定的範圍內(應用,會話,請求,頁面,或動作)賦值給一個變量 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u0026lt;s:text\u0026gt;標籤示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts2的\u0026lt;s:text\u0026gt;標籤用於從操作類取出資源包消息 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u0026lt;s:url\u0026gt;標籤示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts2的\u0026nbsp;\u0026lt;s:url\u0026gt;\u0026nbsp;標籤用來創建一個URL,並輸出作爲文本格式 \n \u003c/div\u003e \u003c/li\u003e \n \u003c/ul\u003e \n \u003ch2\u003e Struts2 資源包和本地化 \u003c/h2\u003e \n \u003cdiv\u003e\n Struts2的資源包來支持網絡定位功能(多語言) \n \u003c/div\u003e \n \u003cul\u003e \n \u003cli\u003e 資源包使用示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts2的資源包的解釋和例子 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e i18n 或本地化示例\u003cbr\u003e \n \u003cdiv\u003e\n 一個Struts\u0026nbsp;2的國際化和多語言的例子來說明如何使用資源包來顯示不同語言的消息 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e key 屬性示例\u003cbr\u003e \n \u003cdiv\u003e\n Struts\u0026nbsp;2\u0026nbsp;key屬性在UI組件是處理本地化的常用方法,也UI標籤編碼的一個非常有效的方法 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e Chinese 本地化問題\u003cbr\u003e \n \u003cdiv\u003e\n 一個常見的中國本地化的問題 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e 配置全局資源包\u003cbr\u003e \n \u003cdiv\u003e\n 配置Struts2的全局資源包指南 \n \u003c/div\u003e \u003c/li\u003e \n \u003c/ul\u003e \n \u003ch2\u003e Struts2主題 \u003c/h2\u003e \n \u003cdiv\u003e\n Struts2 的佈局是由「XHTML」主題設計的,所以瞭解 Struts2 主題概念是必須的。 \n \u003c/div\u003e \n \u003cul\u003e \n \u003cli\u003e Struts2 主題和模板\u003cbr\u003e \n \u003cdiv\u003e\n Struts\u0026nbsp;2主題和模板的說明和示例 \n \u003c/div\u003e \u003c/li\u003e \n \u003c/ul\u003e \n \u003ch2\u003e Struts2集成其它框架 \u003c/h2\u003e \n \u003cdiv\u003e\n Struts2與任何他人框架的整合\u0026nbsp;-\u0026nbsp;Spring,\u0026nbsp;Hibernate,\u0026nbsp;Quartz,\u0026nbsp;Log4j… \n \u003c/div\u003e \n \u003cul\u003e \n \u003cli\u003e Struts2 + Spring集成實例\u003cbr\u003e \n \u003cdiv\u003e\n Struts2和Spring框架集成。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e Struts2 + Quartz調度集成實例\u003cbr\u003e \n \u003cdiv\u003e\n Struts2和Quartz調度框架集成。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e Struts2 + Hibernate 集成實例\u003cbr\u003e \n \u003cdiv\u003e\n 集成 Struts2 和 Hibernate 框架。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e Struts2 + Hibernate使用「Full Hibernate Plugin\"插件集成\u003cbr\u003e 使用 「Full Hibernate Plugin」集成Struts2 和Hibernate3 \u003c/li\u003e \n \u003cli\u003e Struts2 + Spring + Hibernate集成實例\u003cbr\u003e \n \u003cdiv\u003e\n 集成Struts2,Spring和Hibernate三個框架。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e Struts 2 + Log4j 集成實例\u003cbr\u003e 集成Struts 2 和Log4j 框架. \u003c/li\u003e \n \u003c/ul\u003e \n \u003ch2\u003e Struts2 FAQ \u003c/h2\u003e \n \u003cul\u003e \n \u003cli\u003e FilterDispatcher 和 StrutsPrepareAndExecuteFilter區別?\u003cbr\u003e \n \u003cdiv\u003e\n 關於開發問\u0026nbsp;filterdispatcher\u0026nbsp;和\u0026nbsp;strutsprepareandexecutefilter\u0026nbsp;之間的差異。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e 在Struts2中獲取 HttpServletRequest\u003cbr\u003e \n \u003cdiv\u003e\n 獲取\u0026nbsp;Struts2\u0026nbsp;HttpServletRequest對象的實例。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e 在Struts2獲取HttpServletResponse對象\u003cbr\u003e 在Struts2中如何獲取 HttpServletResponse 對象實例 \u003c/li\u003e \n \u003cli\u003e 在Struts2中如何獲取ServletContext對象\u003cbr\u003e 在Struts2獲取ServletContext對象實例 \u003c/li\u003e \n \u003cli\u003e 在Struts2中配置靜態參數(有示例代碼)\u003cbr\u003e \n \u003cdiv\u003e\n 在Struts2配置靜態參數實例 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e Struts2下載文件實例(有實例代碼)\u003cbr\u003e \n \u003cdiv\u003e\n Struts2實現下載文件實例 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e Struts2 和 JSON 實例(有實例代碼)\u003cbr\u003e \n \u003cdiv\u003e\n 舉個例子來說明Struts2集成JSON數據。 \n \u003c/div\u003e \u003c/li\u003e \n \u003c/ul\u003e \n \u003ch2\u003e Struts2 參考 \u003c/h2\u003e \n \u003cul\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.x/\"\u003eStruts2 官方文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/generic-tag-reference.html\"\u003eStruts2 通用標籤\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://en.wikipedia.org/wiki/Apache_Struts\"\u003ehttp://en.wikipedia.org/wiki/Apache_Struts\u003c/a\u003e \u003c/li\u003e \n \u003c/ul\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"8f:T11bfb,"])</script><script>self.__next_f.push([1,"\u003cp\u003e Struts2是基於MVC設計模式的流行和成熟的Web應用程序框架。Struts2並不只是\u003cspan\u003eStruts 1\u003c/span\u003e下一個版本,但它是一個完全重寫的Struts架構。 \u003c/p\u003e \n\u003cp\u003e WebWork框架開始了與Struts框架爲基礎,其目標是建立在Struts的Web開發更容易爲開發人員提供了加強和改進的框架。 \u003c/p\u003e \n\u003cp\u003e 一段時間後,WebWork框架和Struts社區聯手打造著名的Struts2框架。 \u003c/p\u003e \n\u003ch2\u003e Struts 2 框架特性: \u003c/h2\u003e \n\u003cp\u003e 這裏有一些偉大的特性,可能會迫使你考慮使用Struts2: \u003c/p\u003e \n\u003col\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003ePOJO形式和POJO動作\u003c/span\u003e\u0026nbsp;- 已經擺脫了Struts2的動作表單的Struts框架的一個組成部分。Struts2可以使用任何的POJO接收的形式輸入。同樣的,你現在可以看到任何POJO的Action類。 \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003eTag支持\u003c/span\u003e\u0026nbsp;- Struts2的形式提高了標籤的新標籤讓開發人員寫更少的代碼。 \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003eAJAX支持\u003c/span\u003e- Struts2中已經認識到了Web2.0技術,並整合到產品中AJAX支持創建AJAX的標籤,該功能非常相似的標準Struts2的標籤。 \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003e容易整合\u003c/span\u003e\u0026nbsp;- 與其他框架如Spring,Tiles和SiteMesh的整合是現在更容易與各種集成Struts2。 \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003e模板支持\u003c/span\u003e\u0026nbsp;- 支持生成使用模板。 \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003e插件支持\u003c/span\u003e\u0026nbsp;- 核心Struts2行爲,可以加強和擴大使用插件。大量的插件可供Struts2。 \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003e概要分析\u003c/span\u003e- Struts2的提供集成的配置,調試和分析應用程序。此外,Struts還提供了內置調試工具的幫助下,集成調試。 \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003e標籤修改容易\u003c/span\u003e\u0026nbsp;- 在Struts2標籤標記,可以調整使用FreeMarker模板。這並不需要JSP或Java知識。基本的HTML,XML和CSS知識是不夠的修改的標籤。 \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003e提升更少的配置\u003c/span\u003e\u0026nbsp;- Struts2的促進更少的配置與用於各種設置的幫助下,使用默認值。你沒有的東西,除非它偏離由Struts2的默認設置的配置。 \u003c/p\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003ch1\u003e Struts 2 環境配置: \u003c/h1\u003e \n\u003cp\u003e 我們的首要任務是要得到一個最小的Struts2中運行的應用程序。本章將指導您如何使用\u003cspan\u003eStruts2\u003c/span\u003e編寫一個應用程序。我假設你已經在你的機器上安裝JDK(5+),Tomcat和Eclipse。如果你沒有安裝這些組件,請執行以下步驟: \u003c/p\u003e \n\u003ch2\u003e Step 1 - 設置JAVA開發工具包 (JDK): \u003c/h2\u003e \n\u003cp\u003e \u003cbr\u003e 從Oracle的Java站點:Java SE下載,您可以\u003ca href=\"http://www.oracle.com/technetwork/java/javase/downloads/index.html\"\u003e下載最新版本的SDK\u003c/a\u003e。您會發現說明安裝JDK下載的文件,按照給定的說明來安裝和配置的設置。最後,設置PATH和JAVA_HOME環境變量指向的目錄,其中包含java和javac,通常\u003cspan\u003e分別爲:\u003c/span\u003ejava_install_dir/bin和java_install_dir。 \u003c/p\u003e \n\u003cp\u003e 如果運行的是Windows SDK安裝在c:\\jdk1.5.0_20,你就必須把你的C:\\autoexec.bat文件中的以下行。 \u003c/p\u003e \n\u003cpre\u003eset PATH=C:\\jdk1.5.0_20\\bin;%PATH%\r\nset JAVA_HOME=C:\\jdk1.5.0_20\r\u003c/pre\u003e \n\u003cp\u003e 另外,在Windows NT/2000/XP中,您也可以右鍵單擊「我的電腦」,選擇「屬性」,再先進,環境變量。然後,您會更新PATH的值,然後按「確定」按鈕。\u003cbr\u003e 在Unix(Solaris和Linux等),如果SDK安裝在/usr/local/jdk1.5.0_20,你使用的是C shell,把下面的到.cshrc文件寫入。 \u003c/p\u003e \n\u003cpre\u003esetenv PATH /usr/local/jdk1.5.0_20/bin:$PATH\r\nsetenv JAVA_HOME /usr/local/jdk1.5.0_20\r\u003c/pre\u003e \n\u003cp\u003e 另外,如果你使用像Borland的JBuilder,Eclipse的IntelliJ IDEA或Sun ONE Studio集成開發環境(IDE),編譯並運行一個簡單的程序,以確認該IDE知道在哪裏安裝Java,否則不正確的設置爲給定的文檔IDE。 \u003c/p\u003e \n\u003ch2\u003e Step 2 - 安裝Apache Tomcat: \u003c/h2\u003e \n\u003cp\u003e \u003cbr\u003e 您可以下載最新版本Tomcat\u0026nbsp;\u003ca href=\"http://tomcat.apache.org/\"\u003ehttp://tomcat.apache.org/\u003c/a\u003e。一旦下載安裝,解壓縮的二進制分發到一個方便的位置。例如,Window下在C:\\Apache或/usr/local/apache-tomcat-6.0.33 tomcat-6.0.33 Linux/Unix和創建CATALINA_HOME環境變量指向這些位置上。\u003cspan\u003eTomcat可以開始執行下面的命令在Windows機器上,可以簡單地雙擊的startup.bat\u003c/span\u003e \u003c/p\u003e \n\u003cpre\u003e %CATALINA_HOME%\\bin\\startup.bat\r\n or\r\n C:\\apache-tomcat-6.0.33\\bin\\startup.bat\r\u003c/pre\u003e \n\u003cp\u003e Tomcat可以開始UNIX(Solaris和Linux等)的機器上執行下面的命令: \u003c/p\u003e \n\u003cpre\u003e$CATALINA_HOME/bin/startup.sh\r\nor\r\n/usr/local/apache-tomcat-6.0.33/bin/startup.sh\r\u003c/pre\u003e \n\u003cp\u003e 成功啓動後,默認包含在Tomcat中的Web應用程序將可以通過訪問輸入http://localhost:8080/。如果一切順利,那麼它應該顯示以下結果: \u003c/p\u003e \n\u003cimg alt=\"Struts2快速入門\" src=\"https://asset.1ju.org/cmsstatic/struts2-1.jpg\"\u003e \n\u003cp\u003e 有關配置和運行Tomcat的進一步信息包含在文檔中,可以找到這裏,以及在Tomcat Web站點:http://tomcat.apache.org\u003cbr\u003e 停止Tomcat既可以通過Windows機器上執行下面的命令: \u003c/p\u003e \n\u003cpre\u003e%CATALINA_HOME%\\bin\\shutdown\r\nor\r\n\r\nC:\\apache-tomcat-5.5.29\\bin\\shutdown\r\u003c/pre\u003e \n\u003cp\u003e Tomcat可以停止執行下面命令在Unix(Solaris和Linux等)機器: \u003c/p\u003e \n\u003cpre\u003e$CATALINA_HOME/bin/shutdown.sh\r\nor\r\n/usr/local/apache-tomcat-5.5.29/bin/shutdown.sh\r\u003c/pre\u003e \n\u003ch2\u003e Step 3 - 安裝Eclipse (IDE) \u003c/h2\u003e \n\u003cp\u003e 在本教程中所有的例子已經寫入使用Eclipse IDE。所以,我建議你有你的機器上安裝最新版本Eclipse。 \u003c/p\u003e \n\u003cp\u003e 要安裝Eclipse的dDownload的最新的Eclipse二進制文件\u003ca href=\"http://www.eclipse.org/downloads/\"\u003ehttp://www.eclipse.org/downloads/\u003c/a\u003e。一旦你下載安裝,解壓縮的二進制分發到一個方便的位置。例如,在\u003cspan\u003eC:\\eclipse\u003c/span\u003e上Eclipse,或\u003cspan\u003e/usr/local/eclipse\u003c/span\u003e在Linux/Unix終於適當設置PATH變量。 \u003c/p\u003e \n\u003cp\u003e Eclipse可以啓動Windows機器上執行下面的命令,或者你可以簡單地雙擊的eclipse.exe \u003c/p\u003e \n\u003cpre\u003e %C:\\eclipse\\eclipse.exe\r\u003c/pre\u003e \n\u003cp\u003e Eclipse可以啓動UNIX(Solaris和Linux等)的機器上執行下面的命令: \u003c/p\u003e \n\u003cpre\u003e$/usr/local/eclipse/eclipse\r\u003c/pre\u003e \n\u003cp\u003e 成功啓動後,如果一切正常,那麼它應顯示以下結果: \u003c/p\u003e \n\u003cimg alt=\"Struts2快速入門\" src=\"https://asset.1ju.org/cmsstatic/struts2-2.jpg\"\u003e \n\u003ch2\u003e Step 4 - 安裝Struts2 類庫 \u003c/h2\u003e \n\u003cp\u003e 現在,如果一切正常,那麼你可以繼續設置您的Struts 2框架。以下是簡單的步驟,下載並安裝在機器上Struts2。 \u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e 請選擇是否要安裝Hibernate在Windows或Unix,然後繼續進行下一個步驟下載.zip文件窗口.tz文件爲Unix。 \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 下載最新版本的Struts2的二進制文件:\u0026nbsp;\u003ca href=\"http://struts.apache.org/download.cgi\"\u003ehttp://struts.apache.org/download.cgi\u003c/a\u003e. \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 在寫這篇教程的時候,我下載的是struts-2.0.14-all.zip,當解壓下載的文件時,它有C:\\struts-2.2.3如下的目錄結構內。 \u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cimg alt=\"Struts2快速入門\" src=\"https://asset.1ju.org/cmsstatic/struts2-3.jpg\"\u003e \n\u003cp\u003e 第二個步驟是解壓zip文件中的任何位置,我下載和提取struts-2.2.3-all.zip在c:\\文件夾中,我的Windows 7機器上的所有jar文件複製到c:\\struts-2.20.3\\lib中。確保正確設置CLASSPATH變量,否則將出現錯誤問題,同時運行您的應用程序。 \u003c/p\u003e \n\u003ch1\u003e Struts 2 體系結構: \u003c/h1\u003e \n\u003cp\u003e 從高層次來看,Struts2是一個上拉MVC(MVC2)框架。在Struts2的Model-View-Controller模式實現以下五個核心組件: \u003c/p\u003e \n\u003col\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003eActions\u003c/span\u003e \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003eInterceptors\u003c/span\u003e \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003eValue Stack / OGNL\u003c/span\u003e \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003eResults / Result types\u003c/span\u003e \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003eView technologies\u003c/span\u003e \u003c/p\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e Struts 2的是從傳統的MVC框架,在該框架中的作用的模式,而不是控制器的作用略有不同,雖然有一些重疊。 \u003c/p\u003e \n\u003cimg alt=\"Struts2快速入門\" src=\"https://asset.1ju.org/cmsstatic/struts2-1.gif\"\u003e \n\u003cp\u003e 上圖描述了Struts2的高層體系結構模型,視圖和控制器。一個Struts2的調度Servlet過濾器和攔截器與控制器實現,該模型實現的動作和視圖的組合的結果類型和結果。值棧和OGNL提供了共同點,其他部件之間的連接和集成。 \u003c/p\u003e \n\u003cp\u003e 除了從上述組分中,將有一個特定的信息涉及到配置。爲Web應用程序的配置以及配置動作,攔截器,結果等。\u003cbr\u003e 這是Struts的MVC模式的體系結構概述。我們將在隨後的章節中通過每個組件\u003cspan\u003e更詳細地熟悉和理解\u003c/span\u003e。 \u003c/p\u003e \n\u003ch2\u003e 請求生命週期: \u003c/h2\u003e \n\u003cp\u003e 基於上述數據圖,可以解釋用戶的請求的生命週期在Struts 2如下所示: \u003c/p\u003e \n\u003col\u003e \n \u003cli\u003e \u003cp\u003e 用戶發送請求到服務器,用於請求對某些資源(即頁). \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e FilterDispatcher排着眼於該請求,然後確定適當的Action. \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 配置攔截器的功能適用於如驗證,文件上傳等。 \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 選擇的動作執行,執行所請求的操作。 \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 同樣,配置攔截器做任何後期處理,如果需要的話。 \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 最後的結果是由視圖準備,並且將結果返回給用戶。 \u003c/p\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003ch1\u003e Struts 2 Hello World 實例: \u003c/h1\u003e \n\u003cp\u003e 從中學到了Struts 2的架構,當你點擊一個超鏈接或提交一個Struts2的Web應用程序的HTML表單中,輸入被髮送到一個Java類操作的控制器,收集。執行該操作後,結果選擇了一個資源來呈現的響應。資源通常是一個JSP,但它也可以是一個PDF文件,Excel電子表格,或Java小應用程序窗口。 \u003c/p\u003e \n\u003cp\u003e 假設你已經建立您的開發環境。現在,讓我們繼續建立我們的第一個Hello World struts2的項目。這個項目的目的是建立一個Web應用程序,收集用戶的username,並顯示「Hello World」,後面的用戶名。我們將創建任何Struts2項目的四個組成部分: \u003c/p\u003e \n\u003ctable width=\"100%\"\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003cth width=\"5\"\u003e SN \u003c/th\u003e \n \u003cth\u003e 組件\u0026amp;描述 \u003c/th\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 1 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eAction\u003c/span\u003e\u003cbr\u003e Create an action class which will contain complete business logic and conrol the interaction between the user, the model, and the view. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 2 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eInterceptors\u003c/span\u003e\u003cbr\u003e Create interceptors if required, or use existing interceptors. This is part of Controller. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 3 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eView\u003c/span\u003e\u003cbr\u003e Create a JSPs to interact with the user to take input and to present the final messages. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 4 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eConfiguration Files\u003c/span\u003e\u003cbr\u003e Create configuration files to couple the Action, View and Controllers. These files are struts.xml, web.xml, struts.properties. \u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n\u003c/table\u003e \n\u003cp\u003e 我要使用Eclipse IDE,所以下創建一個動態Web項目所需的所有組件。因此,讓我們開始創建動態Web項目。 \u003c/p\u003e \n\u003ch2\u003e 創建一個動態Web項目: \u003c/h2\u003e \n\u003cp\u003e 開始你的Eclipse,然後進入「文件」\u0026gt;「新建」\u0026gt;「動態Web項目,然後輸入項目名稱爲HelloWorldStruts2和設置其他的選項,在下面的屏幕: \u003c/p\u003e \n\u003cimg alt=\"Struts2快速入門\" src=\"https://asset.1ju.org/cmsstatic/struts2-4.jpg\"\u003e \n\u003cp\u003e 選擇在屏幕上的所有默認選項,最後檢查生成的web.xml部署描述符選項。這將創建一個動態Web項目在Eclipse中。現在去窗口\u0026gt;顯示視圖\u0026gt;項目資源管理器,你會看到你的項目窗口中的東西如下: \u003c/p\u003e \n\u003cimg alt=\"Struts2快速入門\" height=\"425\" src=\"https://asset.1ju.org/cmsstatic/struts2-5.jpg\" width=\"560\"\u003e \n\u003cp\u003e 現在複製以下文件從Struts 2的lib文件夾C:\\struts-2.2.3\\lib添加到我們的工程WEB-INF\\lib文件夾中。所以這個可以簡單地拖動和丟棄所有的WEB-INF\\lib文件夾中的下列文件到。 \u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e commons-fileupload-x.y.z.jar \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e commons-io-x.y.z.jar \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e commons-lang-x.y.jar \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e commons-logging-x.y.z.jar \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e commons-logging-api-x.y.jar \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e freemarker-x.y.z.jar \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e javassist-.xy.z.GA \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e ognl-x.y.z.jar \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e struts2-core-x.y.z.jar \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e xwork-core.x.y.z.jar \u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003ch2\u003e 創建動作action類: \u003c/h2\u003e \n\u003cp\u003e Action類是Struts 2應用程序的關鍵,我們實現了大部分Action類中的業務邏輯。因此,讓我們創建一個Java文件HelloWorldAction.java的Java資源\u0026gt; SRC下一個的包名com.yiibai.struts2並有下面的內容。 \u003c/p\u003e \n\u003cp\u003e Action類來響應用戶的操作,當用戶點擊一個URL。 Action類中的一個或多個方法被執行,並返回一個字符串結果。基於結果的價值,一個特定的JSP頁面的呈現方式。 \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.struts2;\r\n\r\npublic class HelloWorldAction{\r\n private String name;\r\n\r\n public String execute() throws Exception {\r\n return \"success\";\r\n }\r\n \r\n public String getName() {\r\n return name;\r\n }\r\n\r\n public void setName(String name) {\r\n this.name = name;\r\n }\r\n}\r\u003c/pre\u003e \n\u003cp\u003e 這是一個非常簡單的類,一個名爲「name」屬性。我們有標準「名稱」屬性getter和setter方法,返回字符串「SUCCESS」執行方法。\u003cbr\u003e Struts2框架的HelloWorldAction類將創建一個對象並調用execute方法在響應用戶的操作。你把業務邏輯裏面execute方法,並最終返回的字符串常量。簡單地說爲每個URL執行一個動作類,或者你可以直接使用這個類的名稱作爲操作名,也可以映射到一些其他的名稱使用struts.xml文件,如下圖所示。 \u003c/p\u003e \n\u003cp\u003e \u0026nbsp; \u003c/p\u003e \n\u003ch2\u003e 創建一個視圖 \u003c/h2\u003e \n\u003cp\u003e 我們需要一個JSP提交最後的消息,這個頁面會被稱爲Struts 2框架中預定義的動作時,會發生此映射將在struts.xml文件中定義的。所以,讓我們創建下面的JSP文件的helloWorld.jsp,在WebContent文件夾在您的Eclipse項目。要做到這一點,右鍵單擊WebContent文件夾中的項目資源管理器,然後選擇「新建」\u0026gt;「JSP文件。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ page contentType=\"text/html; charset=UTF-8\" %\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;title\u0026gt;Hello World\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n Hello World, \u0026lt;s:property value=\"name\"/\u0026gt;\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e taglib指令告訴Servlet容器中,這個頁面將使用Struts2標籤,這些標籤之前,將通過s:property標籤中顯示的動作類的屬性名稱\u0026gt;HelloWorldAction類的getName()方法返回的值。 \u003c/p\u003e \n\u003ch2\u003e 創建主頁面: \u003c/h2\u003e \n\u003cp\u003e 我們還需要在WebContent文件夾中創建的index.jsp。該文件將作爲初始動作URL,用戶可以直接點擊告訴Struts 2框架調用的HelloWorldAction類定義的方法,使HelloWorld.jsp視圖。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ page language=\"java\" contentType=\"text/html; charset=ISO-8859-1\"\r\n pageEncoding=\"ISO-8859-1\"%\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\"%\u0026gt;\r\n \u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;title\u0026gt;Hello World\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n \u0026lt;h1\u0026gt;Hello World From Struts2\u0026lt;/h1\u0026gt;\r\n \u0026lt;form action=\"hello\"\u0026gt;\r\n \u0026lt;label for=\"name\"\u0026gt;Please enter your name\u0026lt;/label\u0026gt;\u0026lt;br/\u0026gt;\r\n \u0026lt;input type=\"text\" name=\"name\"/\u0026gt;\r\n \u0026lt;input type=\"submit\" value=\"Say Hello\"/\u0026gt;\r\n \u0026lt;/form\u0026gt;\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e hello操作定義在上面的視圖文件將被映射到的HelloWorldAction類和它的執行方法使用struts.xml文件。當用戶點擊「提交」按鈕,它會導致Struts2框架運行執行方法定義在其中,HelloWorldAction類和方法的返回值的基礎上,將相應的視圖選擇和呈現的一種反應。 \u003c/p\u003e \n\u003ch2\u003e 配置文件 \u003c/h2\u003e \n\u003cp\u003e 我們需要一個映射,以配合URL,HelloWorldAction類(模型),HelloWorld.jsp(圖)。映射告訴Struts 2框架的類將響應用戶的操作(URL),這一類的方法將被執行,什麼視圖來顯示字符串結果的基礎上,該方法返回。 \u003c/p\u003e \n\u003cp\u003e 因此,讓我們創建一個名爲struts.xml中。由於Struts2要求struts.xml中存在的類文件夾中。因此,創建的WebContent/WEB-INF/classes文件夾下struts.xml文件。Eclipse不會創建「類」文件夾下,所以你需要自己做。要做到這一點,在項目瀏覽器和WEB-INF文件夾上點擊右鍵,選擇「新建」\u0026gt;「文件夾」。你的struts.xml中應該是這樣的: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\"?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n\u0026lt;struts\u0026gt;\r\n\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \u0026lt;package name=\"helloworld\" extends=\"struts-default\"\u0026gt;\r\n \r\n \u0026lt;action name=\"hello\" \r\n class=\"com.yiibai.struts2.HelloWorldAction\" \r\n method=\"execute\"\u0026gt;\r\n \u0026lt;result name=\"success\"\u0026gt;/HelloWorld.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 上面的配置文件的幾句話。在這裏,我們設置常數struts.devModeto爲true,因爲我們需要看到一些有用的日誌消息。我們再定義一個名爲HelloWorld包。創建一個包是有用的,當你想要創建新的動作。在我們的例子中,我們的行動命名爲「hello」相應的URL/hello.action和備份HelloWorldAction.class。執行方法HelloWorldAction.class方法被調用時運行URL/hello.action。如果結果execute方法返回「success」,那麼我們就用戶HelloWorld.jsp。 \u003c/p\u003e \n\u003cp\u003e 下一步是創建一個web.xml文件,該文件的任何請求的入口點到Struts2。Struts2的應用程序的入口點,將是一個部署描述符(web.xml)中定義的過濾器。因此,我們將定義在web.xml中一個條目oforg.apache.struts2.dispatcher.FilterDispatcher類。WebContent下WEB-INF文件夾下\u003cspan\u003e需要創建\u003c/span\u003eweb.xml文件。 Eclipse已經在\u003cspan\u003e創建項目\u003cspan\u003e時\u003c/span\u003e\u003c/span\u003e創建了\u003cspan\u003e\u003cspan\u003e一個\u003c/span\u003e\u003c/span\u003eweb.xml文件。但是我們還需要修改如下: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\"?\u0026gt;\r\n\u0026lt;web-app xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n xmlns=\"http://java.sun.com/xml/ns/javaee\" \r\n xmlns:web=\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\r\n xsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\r\n id=\"WebApp_ID\" version=\"3.0\"\u0026gt;\r\n \r\n \u0026lt;display-name\u0026gt;Struts 2\u0026lt;/display-name\u0026gt;\r\n \u0026lt;welcome-file-list\u0026gt;\r\n \u0026lt;welcome-file\u0026gt;index.jsp\u0026lt;/welcome-file\u0026gt;\r\n \u0026lt;/welcome-file-list\u0026gt;\r\n \u0026lt;filter\u0026gt;\r\n \u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n \u0026lt;filter-class\u0026gt;\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u0026lt;/filter-class\u0026gt;\r\n \u0026lt;/filter\u0026gt;\r\n\r\n \u0026lt;filter-mapping\u0026gt;\r\n \u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n \u0026lt;url-pattern\u0026gt;/*\u0026lt;/url-pattern\u0026gt;\r\n \u0026lt;/filter-mapping\u0026gt;\r\n\u0026lt;/web-app\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 我們已經指定index.jsp是我們歡迎(welcome)文件。我們已經配置Struts2過濾器上運行的所有URL(即,任何URL匹配模式/*) \u003c/p\u003e \n\u003ch2\u003e 啓用詳細的日誌: \u003c/h2\u003e \n\u003cp\u003e 可以啓用日誌記錄功能齊全,工作時用Struts 2的WEB-INF/classes文件夾下創建logging.properties文件。請在屬性文件中的以下兩行: \u003c/p\u003e \n\u003cpre\u003e \r\norg.apache.catalina.core.ContainerBase.[Catalina].level = INFO\r\norg.apache.catalina.core.ContainerBase.[Catalina].handlers = \\\r\n java.util.logging.ConsoleHandler\r\u003c/pre\u003e \n\u003cp\u003e 默認logging.properties指定ConsoleHandler的路由記錄到stdout或FileHandler。一個處理程序的日誌級別閾值可以設置使用ERROR,WARNING,INFO,CONFIG,FINE,FINER,FINEST或全部。\u003cbr\u003e 就是這樣。我們已經準備好來運行我們的Hello World應用程序使用Struts 2框架。 \u003c/p\u003e \n\u003cp\u003e \u0026nbsp; \u003c/p\u003e \n\u003ch2\u003e 執行應用程序 \u003c/h2\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊「導出」\u0026gt; WAR文件創建一個WAR文件。然後,這WAR部署在Tomcat的webapps目錄下。最後,啓動Tomcat服務器,並嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給你以下畫面: \u003c/p\u003e \n\u003cimg alt=\"Struts2快速入門\" src=\"https://asset.1ju.org/cmsstatic/struts2-6.jpg\"\u003e \n\u003cp\u003e 輸入值爲\"Struts2\",並提交頁面。您應該看到下一頁 \u003c/p\u003e \n\u003cimg alt=\"Struts2快速入門\" src=\"https://asset.1ju.org/cmsstatic/struts2-7.jpg\"\u003e \n\u003cp\u003e 請注意,您可以定義索引動作在struts.xml文件,在這種情況下,你可以調用索引頁http://localhost:8080/HelloWorldStruts2/index.action。檢查下面你可以定義索引的行動: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\"?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n\u0026lt;struts\u0026gt;\r\n\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \u0026lt;package name=\"helloworld\" extends=\"struts-default\"\u0026gt;\r\n\r\n \u0026lt;action name=\"index\"\u0026gt;\r\n \u0026lt;result \u0026gt;/index.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\r\n \u0026lt;action name=\"hello\" \r\n class=\"com.yiibai.struts2.HelloWorldAction\" \r\n method=\"execute\"\u0026gt;\r\n \u0026lt;result name=\"success\"\u0026gt;/HelloWorld.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\r\n \u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\r\u003c/pre\u003e \n\u003ch1\u003e Struts 2 配置文件 \u003c/h1\u003e \n\u003cp\u003e 本章將帶你通過一個Struts2應用程序所需的基本配置。在這裏,我們將看到在一些重要的配置文件,將配置文件:web.xml,struts.xml中,struts-config.xml和struts.properties\u003cbr\u003e 老實說你能活下來使用web.xml和struts.xml中的配置文件,並在前面的章節中,你已經看到我們的例子中使用這兩個文件的工作,但讓我解釋一下其他文件,以及你的知識。 \u003c/p\u003e \n\u003cp\u003e \u0026nbsp; \u003c/p\u003e \n\u003ch2\u003e web.xml文件: \u003c/h2\u003e \n\u003cp\u003e 在web.xml配置文件是一個的J2EE配置文件,決定如何處理HTTP請求servlet容器的元素。它不是嚴格意義上的Struts2的配置文件,但它是一個文件,需要配置Struts2的工作。 \u003c/p\u003e \n\u003cp\u003e 正如前面所討論的,此文件提供任何Web應用程序的入口點。Struts2的應用程序的入口點,將是一個部署描述符(web.xml)中定義的過濾器。因此,我們將FilterDispatcher排類在web.xml中定義一個條目。需要創建文件夾的WebContent/ WEB-INF下的web.xml文件。 \u003c/p\u003e \n\u003cp\u003e 這是第一個配置文件,您將需要配置,如果你開始沒有產生它(例如Eclipse或者Maven2的)模板或工具的幫助下。以下是web.xml文件中的內容,我們在我們的最後一個例子。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\"?\u0026gt;\r\n\u0026lt;web-app xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n xmlns=\"http://java.sun.com/xml/ns/javaee\" \r\n xmlns:web=\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\r\n xsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\r\n id=\"WebApp_ID\" version=\"3.0\"\u0026gt;\r\n \r\n \u0026lt;display-name\u0026gt;Struts 2\u0026lt;/display-name\u0026gt;\r\n \u0026lt;welcome-file-list\u0026gt;\r\n \u0026lt;welcome-file\u0026gt;index.jsp\u0026lt;/welcome-file\u0026gt;\r\n \u0026lt;/welcome-file-list\u0026gt;\r\n \r\n \u0026lt;filter\u0026gt;\r\n \u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n \u0026lt;filter-class\u0026gt;\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u0026lt;/filter-class\u0026gt;\r\n \u0026lt;/filter\u0026gt;\r\n\r\n \u0026lt;filter-mapping\u0026gt;\r\n \u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n \u0026lt;url-pattern\u0026gt;/*\u0026lt;/url-pattern\u0026gt;\r\n \u0026lt;/filter-mapping\u0026gt;\r\n\r\n\u0026lt;/web-app\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 需要注意的是,我們的Struts 2的過濾器映射到/*/*。行動,而不是這意味着所有的URL將被解析的支柱過濾器。我們將介紹時,我們會通過的「註解」一章。 \u003c/p\u003e \n\u003ch2\u003e struts.xml文件: \u003c/h2\u003e \n\u003cp\u003e struts.xml文件中包含的配置信息,你將修改所採取的措施的開發。這個文件可以被用來覆蓋默認設置的應用程序,例如struts.devMode=false和其他設置中定義的屬性文件。這個文件可以創建文件夾下的WEB-INF/classes。 \u003c/p\u003e \n\u003cp\u003e 讓我們一起來看看我們在struts.xml文件中創建Hello World的例子在前面的章節中解釋。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\"?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n\u0026lt;struts\u0026gt;\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \u0026lt;package name=\"helloworld\" extends=\"struts-default\"\u0026gt;\r\n \r\n \u0026lt;action name=\"hello\" \r\n class=\"com.yiibai.struts2.HelloWorldAction\" \r\n method=\"execute\"\u0026gt;\r\n \u0026lt;result name=\"success\"\u0026gt;/HelloWorld.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n \u0026lt;-- more actions can be listed here --\u0026gt;\r\n\r\n \u0026lt;/package\u0026gt;\r\n \u0026lt;-- more packages can be listed here --\u0026gt;\r\n\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 首先要注意的是DOCTYPE。所有的Struts配置文件中需要有正確的DOCTYPE,在我們的小例子所示。\u0026lt;struts\u0026gt;是根標記的元素,我們聲明使用不同的包\u0026lt;package\u0026gt;標籤。其中,\u0026lt;\u003cspan\u003epackage\u003c/span\u003e\u0026gt;允許分離和模塊化的配置。這是非常有用的,當你有一個大的項目,項目被劃分成不同的模塊。 \u003c/p\u003e \n\u003cp\u003e 再說了,如果項目有三個域名 - business_applicaiton,customer_application和staff_application,可以創建三個包,在適當的包裝和存儲相關的行動。包裝標籤具有以下屬性: \u003c/p\u003e \n\u003ctable width=\"100%\"\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003cth width=\"25%\"\u003e 屬性 \u003c/th\u003e \n \u003cth\u003e 描述 \u003c/th\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e name (required) \u003c/td\u003e \n \u003ctd\u003e The unique identifier for the package \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e extends \u003c/td\u003e \n \u003ctd\u003e Which package does this package extend from? By default, we use struts-default as the base package. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e abstract \u003c/td\u003e \n \u003ctd\u003e If marked true, the package is not available for end user consumption. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e namesapce \u003c/td\u003e \n \u003ctd\u003e Unique namespace for the actions \u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n\u003c/table\u003e \n\u003cp\u003e 常量標籤name和value屬性將被用來覆蓋default.properties中定義的屬性,就像我們剛剛成立struts.devModeproperty。設置struts.devMode屬性,讓我們看到了更多的調試信息,日誌文件中。 \u003c/p\u003e \n\u003cp\u003e 我們定義動作標記對應的每一個URL,我們想訪問我們定義了一個類的execute()方法,將訪問時,我們將訪問相應的URL。\u003cbr\u003e 結果確定什麼被返回到瀏覽器的一個動作後執行。從操作返回的字符串應該是一個結果的名稱。結果如上配置的每次動作,或作爲一個「全局」的結果,在包中的每一個動作可。結果有可選的名稱和類型的屬性。默認名稱值是「成功」。 \u003c/p\u003e \n\u003cp\u003e \u0026nbsp; \u003c/p\u003e \n\u003cp\u003e 隨着時間的推移,struts.xml文件可以做大,打破它包的模塊化是一種方式,但Struts提供了另一種模塊化的struts.xml文件。你可以將檔案分割成多個XML文件,並將其導入以下方式。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\"?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n\u0026lt;struts\u0026gt;\r\n \u0026lt;include file=\"my-struts1.xml\"/\u0026gt;\r\n \u0026lt;include file=\"my-struts2.xml\"/\u0026gt;\r\n\u0026lt;/struts\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 我們還沒有涉及到的其他配置文件是struts-default.xml中。這個文件包含了Struts標準配置設置,在\u003cspan\u003e你的項目的99.99%\u003c/span\u003e就不會碰這些設置。出於這個原因,我們不打算在這個文件太多的細節。如果有興趣,不妨看看在default.properties文件中struts2的核心-2.2.3.jar文件。 \u003c/p\u003e \n\u003ch2\u003e struts-config.xml 文件: \u003c/h2\u003e \n\u003cp\u003e struts-config.xml配置文件是一個在Web客戶端組件的視圖和模型之間的聯繫,但\u003cspan\u003e你的項目的99.99\u003c/span\u003e就不會碰這些設置%。基本的配置文件包含以下主要內容: \u003c/p\u003e \n\u003ctable width=\"100%\"\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003cth width=\"5\"\u003e SN \u003c/th\u003e \n \u003cth\u003e Interceptor \u0026amp; 描述 \u003c/th\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 1 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003estruts-config\u003c/span\u003e\u003cbr\u003e This is the root node of the configuration file. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 2 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eform-beans\u003c/span\u003e\u003cbr\u003e This is where you map your ActionForm subclass to a name. You use this name as an alias for your ActionForm throughout the rest of the struts-config.xml file, and even on your JSP pages. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 3 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eglobal forwards\u003c/span\u003e\u003cbr\u003e This section maps a page on your webapp to a name. You can use this name to refer to the actual page. This avoids hardcoding URLs on your web pages. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 4 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eaction-mappings\u003c/span\u003e\u003cbr\u003e This is where you declare form handlers and they are also known as\u0026nbsp;\u003cspan\u003eaction mappings\u003c/span\u003e. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 5 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003econtroller\u003c/span\u003e\u003cbr\u003e This section configures Struts internals and rarely used in practical situations. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 6 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eplug-in\u003c/span\u003e\u003cbr\u003e This section tells Struts where to find your properties files, which contain prompts and error messages \u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n\u003c/table\u003e \n\u003cp\u003e 下面是示例struts-config.xml文件: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts-config PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 1.0//EN\"\r\n\"http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd\"\u0026gt;\r\n\r\n\u0026lt;struts-config\u0026gt;\r\n\r\n \u0026lt;!-- ========== Form Bean Definitions ============ --\u0026gt;\r\n \u0026lt;form-beans\u0026gt;\r\n \u0026lt;form-bean name=\"login\" type=\"test.struts.LoginForm\" /\u0026gt;\r\n \u0026lt;/form-beans\u0026gt;\r\n\r\n \u0026lt;!-- ========== Global Forward Definitions ========= --\u0026gt;\r\n \u0026lt;global-forwards\u0026gt;\r\n \u0026lt;/global-forwards\u0026gt;\r\n\r\n \u0026lt;!-- ========== Action Mapping Definitions ======== --\u0026gt;\r\n \u0026lt;action-mappings\u0026gt;\r\n \u0026lt;action\r\n path=\"/login\"\r\n type=\"test.struts.LoginAction\" \u0026gt;\r\n\r\n \u0026lt;forward name=\"valid\" path=\"/jsp/MainMenu.jsp\" /\u0026gt;\r\n \u0026lt;forward name=\"invalid\" path=\"/jsp/LoginView.jsp\" /\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n \u0026lt;/action-mappings\u0026gt;\r\n\r\n \u0026lt;!-- ========== Controller Definitions ======== --\u0026gt;\r\n \u0026lt;controller \r\n contentType=\"text/html;charset=UTF-8\"\r\n debug=\"3\"\r\n maxFileSize=\"1.618M\"\r\n locale=\"true\"\r\n nocache=\"true\"/\u0026gt;\r\n\r\n\u0026lt;/struts-config\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e struts-config.xml文件的更多詳細信息,請檢查你的Struts文檔。 \u003c/p\u003e \n\u003ch2\u003e struts.properties文件 \u003c/h2\u003e \n\u003cp\u003e 此配置文件提供了一種機制來更改默認行爲的框架。其實所有的struts.propertiesconfiguration文件中包含的屬性也可以被配置在web.xml中使用的init-param,以及在struts.xml中的配置文件中使用恆定的標籤。你可以創建此文件下folderWEB-INF/classes。 \u003c/p\u003e \n\u003cp\u003e 在這個文件中配置的值將覆蓋默認值配置在default.properties這是包含在Struts2-core-xyzjar分佈。有幾個可能會考慮改變使用struts.properties文件的屬性: \u003c/p\u003e \n\u003cpre\u003e### When set to true, Struts will act much more friendly for developers\r\nstruts.devMode = true\r\n\r\n### Enables reloading of internationalization files\r\nstruts.i18n.reload = true\r\n\r\n### Enables reloading of XML configuration files\r\nstruts.configuration.xml.reload = true\r\n\r\n### Sets the port that the server is run on\r\nstruts.url.http.port = 8080\r\u003c/pre\u003e \n\u003cp\u003e 任何與井號(#)開頭的行會被假定爲註釋和由Struts2將被忽略。 \u003c/p\u003e \n\u003ch1\u003e Struts 2 動作Actions: \u003c/h1\u003e \n\u003cp\u003e 動作是Struts2框架的核心,因爲它們是任何MVC(模型 - 視圖 - 控制器)框架。每一個URL映射到一個具體的行動,它提供了處理用戶的請求提供服務所需的邏輯。\u003cbr\u003e 但動作也用來在另外兩個重要的能力。首先,動作從請求中的數據的傳輸,通過到視圖中起着重要的作用,無論是其一個JSP的或其它類型的結果。二,行動要協助的框架中確定的結果應該渲染視圖將返回響應的要求。 \u003c/p\u003e \n\u003cp\u003e \u0026nbsp; \u003c/p\u003e \n\u003ch2\u003e 創建動作-Action: \u003c/h2\u003e \n\u003cp\u003e 在Struts2的行動,唯一的要求是,必須有一個無參數的方法,該方法返回一個字符串或結果的對象,必須是一個POJO。如果不帶參數的方法不指定,則默認行爲是使用execute()方法。 \u003c/p\u003e \n\u003cp\u003e 您也可以選擇擴展ActionSupport類實現接口,包括操作界面。操作界面如下: \u003c/p\u003e \n\u003cpre\u003epublic interface Action {\r\n public static final String SUCCESS = \"success\";\r\n public static final String NONE = \"none\";\r\n public static final String ERROR = \"error\";\r\n public static final String INPUT = \"input\";\r\n public static final String LOGIN = \"login\";\r\n public String execute() throws Exception;\r\n}\r\u003c/pre\u003e \n\u003cp\u003e 讓我們一起來看看在動作方法中的Hello World示例: \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.struts2;\r\n\r\npublic class HelloWorldAction{\r\n private String name;\r\n\r\n public String execute() throws Exception {\r\n return \"success\";\r\n }\r\n \r\n public String getName() {\r\n return name;\r\n }\r\n\r\n public void setName(String name) {\r\n this.name = name;\r\n }\r\n}\r\u003c/pre\u003e \n\u003cp\u003e 爲了說明這一點的操作方法控制視圖,讓我們作出以下更改execute()方法和擴展的類ActionSupport如下: \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.struts2;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class HelloWorldAction extends ActionSupport{\r\n private String name;\r\n\r\n public String execute() throws Exception {\r\n if (\"SECRET\".equals(name))\r\n {\r\n return SUCCESS;\r\n }else{\r\n return ERROR; \r\n }\r\n }\r\n \r\n public String getName() {\r\n return name;\r\n }\r\n\r\n public void setName(String name) {\r\n this.name = name;\r\n }\r\n}\r\u003c/pre\u003e \n\u003cp\u003e 在這個例子中,我們在execute方法中有一些邏輯,看的name屬性。如果屬性等於「不能說的祕密」的字符串,返回成功的結果,否則返回錯誤的結果。因爲我們已經擴展了ActionSupport,所以我們可以使用字符串常量的成功和錯誤。現在,讓我們修改我們的struts.xml文件如下: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\"?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \u0026lt;struts\u0026gt;\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \u0026lt;package name=\"helloworld\" extends=\"struts-default\"\u0026gt;\r\n \u0026lt;action name=\"hello\" \r\n class=\"com.yiibai.struts2.HelloWorldAction\"\r\n method=\"execute\"\u0026gt;\r\n \u0026lt;result name=\"success\"\u0026gt;/HelloWorld.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;result name=\"error\"\u0026gt;/AccessDenied.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\r\u003c/pre\u003e \n\u003ch2\u003e 創建一個視圖 \u003c/h2\u003e \n\u003cp\u003e 讓我們創建下面的JSP文件的helloWorld.jsp,在WebContent文件夾在你的eclipse項目。要做到這一點,右鍵單擊WebContent文件夾中的項目資源管理器,然後選擇「新建」\u0026gt;「JSP文件。該文件將被要求的情況下,返回的結果是success,這是一個字符串常量「成功」的定義在Action接口: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ page contentType=\"text/html; charset=UTF-8\" %\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;title\u0026gt;Hello World\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n Hello World, \u0026lt;s:property value=\"name\"/\u0026gt;\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 以下是文件,該文件將被調用的框架的情況下作用的結果是等於字符串常量「ERROR」的錯誤,這是。以下內容的AccessDenied.jsp的 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ page contentType=\"text/html; charset=UTF-8\" %\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;title\u0026gt;Access Denied\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n You are not authorized to view this page.\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 我們還需要在WebContent文件夾中創建的index.jsp。該文件將作爲初始動作URL,用戶可以直接點擊告訴Struts 2框架,以調用execute方法HelloWorldAction類,並呈現HelloWorld.jsp視圖。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ page language=\"java\" contentType=\"text/html; charset=ISO-8859-1\"\r\n pageEncoding=\"ISO-8859-1\"%\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\"%\u0026gt;\r\n \u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;title\u0026gt;Hello World\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n \u0026lt;h1\u0026gt;Hello World From Struts2\u0026lt;/h1\u0026gt;\r\n \u0026lt;form action=\"hello\"\u0026gt;\r\n \u0026lt;label for=\"name\"\u0026gt;Please enter your name\u0026lt;/label\u0026gt;\u0026lt;br/\u0026gt;\r\n \u0026lt;input type=\"text\" name=\"name\"/\u0026gt;\r\n \u0026lt;input type=\"submit\" value=\"Say Hello\"/\u0026gt;\r\n \u0026lt;/form\u0026gt;\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 就是這樣,有沒有需要改變的web.xml文件,讓我們使用同一個web.xml舉例章節,我們已經創建了。現在,我們已經準備好來運行我們的Hello World應用程序使用Struts 2框架。 \u003c/p\u003e \n\u003ch2\u003e 執行應用程序 \u003c/h2\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊「導出」\u0026gt; WAR文件創建一個WAR文件。然後這WAR部署在Tomcat的webapps目錄下。最後啓動Tomcat服務器,並嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給你以下畫面: \u003c/p\u003e \n\u003cimg alt=\"Struts2快速入門\" src=\"https://asset.1ju.org/cmsstatic/struts2-6.jpg\"\u003e \n\u003cp\u003e 讓我們一起進入一個「\u003cspan\u003eSECRET\u003c/span\u003e」的話,你應該看到下面的頁面: \u003c/p\u003e \n\u003cimg alt=\"Struts2快速入門\" src=\"https://asset.1ju.org/cmsstatic/struts2-8.jpg\"\u003e \n\u003cp\u003e 現在輸入任何文字以外的「\u003cspan\u003eSECRET\u003c/span\u003e」,你應該看到下面的頁面: \u003c/p\u003e \n\u003cimg alt=\"Struts2快速入門\" src=\"https://asset.1ju.org/cmsstatic/struts2-9.jpg\"\u003e \n\u003ch2\u003e 創建多個動作: \u003c/h2\u003e \n\u003cp\u003e 我們通常會定義一個以上的行動,以處理不同的請求,向用戶提供不同的URL,因此,你可以定義不同的類定義如下: \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.struts2;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\n class MyAction extends ActionSupport{\r\n public static String GOOD = SUCCESS;\r\n public static String BAD = ERROR;\r\n }\r\n\r\n public class HelloWorld extends ActionSupport{\r\n ...\r\n public String execute()\r\n {\r\n if (\"SECRET\".equals(name)) return MyAction.GOOD;\r\n return MyAction.BAD;\r\n }\r\n ...\r\n }\r\n\r\n public class SomeOtherClass extends ActionSupport{\r\n ...\r\n public String execute()\r\n {\r\n return MyAction.GOOD;\r\n }\r\n ...\r\n }\r\u003c/pre\u003e \n\u003cp\u003e 您將在struts.xml文件中配置這些操作如下: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\"?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\nstruts\u0026gt;\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \u0026lt;package name=\"helloworld\" extends=\"struts-default\"\u0026gt;\r\n \u0026lt;action name=\"hello\" \r\n class=\"com.yiibai.struts2.HelloWorld\" \r\n method=\"execute\"\u0026gt;\r\n \u0026lt;result name=\"success\"\u0026gt;/HelloWorld.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;result name=\"error\"\u0026gt;/AccessDenied.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n \u0026lt;action name=\"something\" \r\n class=\"com.yiibai.struts2.SomeOtherClass\" \r\n method=\"execute\"\u0026gt;\r\n \u0026lt;result name=\"success\"\u0026gt;/Something.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;result name=\"error\"\u0026gt;/AccessDenied.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 在上述假設的例子中,你可以看到操作的結果被複制SUCCESS\u0026nbsp;和ERROR\u0026nbsp;。爲了解決這個問題,我們建議您創建一個類,它包含的結果的結果。 \u003c/p\u003e \n\u003ch1\u003e Struts 2 攔截器: \u003c/h1\u003e \n\u003cp\u003e 攔截器是作爲Servlet過濾器或JDK的Proxy類的概念上是相同的。攔截器允許橫切功能單獨實現動作以及框架。想要使用攔截器,可以實現如下: \u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e Providing preprocessing logic before the action is called. \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e Providing postprocessing logic after the action is called. \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e Catching exceptions so that alternate processing can be performed. \u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e 使用攔截器在Struts2框架提供的功能很多,例如包括異常處理,文件上傳,生命週期回調和驗證等。事實上,Struts2的基地很多其攔截功能上,這不是不可能有7或8每個動作攔截分配。 \u003c/p\u003e \n\u003ch2\u003e Struts2框架攔截器: \u003c/h2\u003e \n\u003cp\u003e Struts 2框架提供了良好的預配置,並準備使用的盒攔截。下面列出了幾個重要的攔截器: \u003c/p\u003e \n\u003ctable width=\"100%\"\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003cth width=\"5\"\u003e SN \u003c/th\u003e \n \u003cth\u003e Interceptor \u0026amp; 描述 \u003c/th\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 1 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003ealias\u003c/span\u003e\u003cbr\u003e Allows parameters to have different name aliases across requests. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 2 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003echeckbox\u003c/span\u003e\u003cbr\u003e Assists in managing check boxes by adding a parameter value of false for check boxes that are not checked. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 3 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003econversionError\u003c/span\u003e\u003cbr\u003e Places error information from converting strings to parameter types into the action's field errors. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 4 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003ecreateSession\u003c/span\u003e\u003cbr\u003e Automatically creates an HTTP session if one does not already exist. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 5 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003edebugging\u003c/span\u003e\u003cbr\u003e Provides several different debugging screens to the developer. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 6 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eexecAndWait\u003c/span\u003e\u003cbr\u003e Sends the user to an intermediary waiting page while the action executes in the background. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 7 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eexception\u003c/span\u003e\u003cbr\u003e Maps exceptions that are thrown from an action to a result, allowing automatic exception handling via redirection. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 8 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003efileUpload\u003c/span\u003e\u003cbr\u003e Facilitates easy file uploading. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 9 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003ei18n\u003c/span\u003e\u003cbr\u003e Keeps track of the selected locale during a user's session. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 10 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003elogger\u003c/span\u003e\u003cbr\u003e Provides simple logging by outputting the name of the action being executed. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 11 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eparams\u003c/span\u003e\u003cbr\u003e Sets the request parameters on the action. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 12 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eprepare\u003c/span\u003e\u003cbr\u003e This is typically used to do pre-processing work, such as setup database connections. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 13 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eprofile\u003c/span\u003e\u003cbr\u003e Allows simple profiling information to be logged for actions. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 14 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003escope\u003c/span\u003e\u003cbr\u003e Stores and retrieves the action's state in the session or application scope. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 15 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eServletConfig\u003c/span\u003e\u003cbr\u003e Provides the action with access to various servlet-based information. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 16 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003etimer\u003c/span\u003e\u003cbr\u003e Provides simple profiling information in the form of how long the action takes to execute. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 17 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003etoken\u003c/span\u003e\u003cbr\u003e Checks the action for a valid token to prevent duplicate formsubmission. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 18 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003evalidation\u003c/span\u003e\u003cbr\u003e Provides validation support for actions \u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n\u003c/table\u003e \n\u003cp\u003e 完整的細節上面提到的攔截,請loook到Struts2文檔。但我會告訴你如何使用攔截器,一般在你的Struts應用程序。 \u003c/p\u003e \n\u003ch2\u003e 如何使用攔截器? \u003c/h2\u003e \n\u003cp\u003e 讓我們來看看如何使用一個已經存在的攔截我們的「Hello World」程序。我們將使用定時器攔截器,其目的是測量過了多長時間,執行相應的操作方法。同時我PARAMS攔截器,其目的是發送的請求參數的行動。您可以嘗試不使用這個攔截器和你的榜樣,你會發現,name屬性沒有被設置的參數是不能夠達到給動作。\u003cbr\u003e 我們將繼續HelloWorldAction.java,web.xml中,HelloWorld.jsp和index.jsp文件,因爲他們已經創建的實例章,但讓我們如下修改struts.xml文件中添加一個攔截器 \u003c/p\u003e \n\u003cp\u003e \u0026nbsp; \u003c/p\u003e \n\u003cpre\u003e \r\n\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\"?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n\u0026lt;struts\u0026gt;\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \u0026lt;package name=\"helloworld\" extends=\"struts-default\"\u0026gt;\r\n \u0026lt;action name=\"hello\" \r\n class=\"com.yiibai.struts2.HelloWorldAction\"\r\n method=\"execute\"\u0026gt;\r\n \u0026lt;interceptor-ref name=\"params\"/\u0026gt;\r\n \u0026lt;interceptor-ref name=\"timer\" /\u0026gt;\r\n \u0026lt;result name=\"success\"\u0026gt;/HelloWorld.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊「導出」\u0026gt; WAR文件創建一個WAR文件。然後,這WAR部署在Tomcat的webapps目錄下。最後,啓動Tomcat服務器,並嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給你以下畫面: \u003c/p\u003e \n\u003cimg alt=\"Struts2快速入門\" src=\"https://asset.1ju.org/cmsstatic/struts2-6.jpg\"\u003e \n\u003cp\u003e 現在,在給定的文本框中輸入任何單詞,然後單擊「Say Hello按鈕執行已定義的動作。現在如果你將檢查生成的日誌,你會發現下面的文字: \u003c/p\u003e \n\u003cpre\u003e \r\nINFO: Server startup in 3539 ms\r\n27/08/2011 8:40:53 PM \r\ncom.opensymphony.xwork2.util.logging.commons.CommonsLogger info\r\nINFO: Executed action [//hello!execute] took 109 ms.\r\u003c/pre\u003e \n\u003cp\u003e \u003cspan\u003e這裏的底線是產生,因爲定時器攔截行動,告訴了要執行的總109ms\u003c/span\u003e \u003c/p\u003e \n\u003ch1\u003e 創建自定義攔截器 \u003c/h1\u003e \n\u003cp\u003e 在應用程序中使用自定義攔截器是一個優雅的方式來提供跨領域的應用功能。創建一個自定義攔截器是容易的,需要擴展的接口,下面Interceptor接口內容: \u003c/p\u003e \n\u003cpre\u003e \r\npublic interface Interceptor extends Serializable{\r\n void destroy();\r\n void init();\r\n String intercept(ActionInvocation invocation)\r\n throws Exception;\r\n}\r\u003c/pre\u003e \n\u003cp\u003e 正如其名稱所表明的,在init()方法提供了一種方法來初始化攔截器destroy()方法提供了一個攔截器淨化設施。不同的行動,攔截器的請求重用和需要是線程安全的,特別是在intercept()方法。\u003cbr\u003e ActionInvocation對象提供的運行時環境。它允許訪問的行動本身和方法調用的行動和決定的行動是否已經調用。\u003cbr\u003e 如果您有沒有必要的初始化或清理代碼,AbstractInterceptor類可以擴展。這提供了一個默認的無操作實現\u003cspan\u003e\u0026nbsp;init()\u0026nbsp;\u003c/span\u003e和\u003cspan\u003edestroy()\u003c/span\u003e方法。 \u003c/p\u003e \n\u003ch2\u003e 創建攔截器類: \u003c/h2\u003e \n\u003cp\u003e 讓我們創建MyInterceptor.java在Java資源\u0026gt; src文件夾: \u003c/p\u003e \n\u003cpre\u003e \r\npackage com.yiibai.struts2;\r\n\r\nimport java.util.*;\r\nimport com.opensymphony.xwork2.ActionInvocation;\r\nimport com.opensymphony.xwork2.interceptor.AbstractInterceptor;\r\n\r\npublic class MyInterceptor extends AbstractInterceptor {\r\n\r\n public String intercept(ActionInvocation invocation)throws Exception{\r\n\r\n /* let us do some pre-processing */\r\n String output = \"Pre-Processing\"; \r\n System.out.println(output);\r\n\r\n /* let us call action or next interceptor */\r\n String result = invocation.invoke();\r\n\r\n /* let us do some post-processing */\r\n output = \"Post-Processing\"; \r\n System.out.println(output);\r\n\r\n return result;\r\n\r\n }\r\n}\r\u003c/pre\u003e \n\u003cp\u003e 就像你看到的,實際的動作將使用攔截器執行的invocation.invoke()調用。所以,你可以做一些前處理和後處理根據您的需要。\u003cbr\u003e 框架本身開始的過程,在第一次調用ActionInvocation對象的invoke()。每次invoke()被調用,ActionInvocation諮詢狀態並執行攔截。當所有配置的攔截器被調用,invoke()方法將導致要執行的動作本身。通過請求流以下數據圖顯示了相同的概念: \u003c/p\u003e \n\u003cp\u003e \u0026nbsp; \u003c/p\u003e \n\u003cimg alt=\"Struts2快速入門\" src=\"https://asset.1ju.org/cmsstatic/struts2-1.gif\"\u003e \n\u003ch2\u003e 創建一個動作-Action類: \u003c/h2\u003e \n\u003cp\u003e 讓我們創建一個Java文件HelloWorldAction.java的Java資源\u0026gt; SRC下一個的包名com.yiibai.struts2與下面的內容。 \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.struts2;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class HelloWorldAction extends ActionSupport{\r\n private String name;\r\n\r\n public String execute() throws Exception {\r\n System.out.println(\"Inside action....\");\r\n return \"success\";\r\n } \r\n\r\n public String getName() {\r\n return name;\r\n }\r\n\r\n public void setName(String name) {\r\n this.name = name;\r\n }\r\n}\r\u003c/pre\u003e \n\u003cp\u003e 在前面的例子中,我們已經看到,這是一個相同的類。我們有標準「name」屬性getter和setter方法,返回字符串「success」執行方法。 \u003c/p\u003e \n\u003ch2\u003e 創建視圖 \u003c/h2\u003e \n\u003cp\u003e Let us create the below jsp file\u0026nbsp;\u003cspan\u003eHelloWorld.jsp\u003c/span\u003e\u0026nbsp;in the WebContent folder in your eclipse project. \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ page contentType=\"text/html; charset=UTF-8\" %\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;title\u0026gt;Hello World\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n Hello World, \u0026lt;s:property value=\"name\"/\u0026gt;\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\r\u003c/pre\u003e \n\u003ch2\u003e 創建視圖: \u003c/h2\u003e \n\u003cp\u003e 我們還需要在WebContent文件夾中創建的index.jsp。該文件將作爲初始動作URL,用戶可以直接點擊告訴Struts 2框架調用HelloWorldAction類定義的方法,使HelloWorld.jsp視圖。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ page language=\"java\" contentType=\"text/html; charset=ISO-8859-1\"\r\n pageEncoding=\"ISO-8859-1\"%\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\"%\u0026gt;\r\n \u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;title\u0026gt;Hello World\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n \u0026lt;h1\u0026gt;Hello World From Struts2\u0026lt;/h1\u0026gt;\r\n \u0026lt;form action=\"hello\"\u0026gt;\r\n \u0026lt;label for=\"name\"\u0026gt;Please enter your name\u0026lt;/label\u0026gt;\u0026lt;br/\u0026gt;\r\n \u0026lt;input type=\"text\" name=\"name\"/\u0026gt;\r\n \u0026lt;input type=\"submit\" value=\"Say Hello\"/\u0026gt;\r\n \u0026lt;/form\u0026gt;\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e hello操作定義在上面的視圖文件將被映射到的HelloWorldAction類和它的執行方法使用struts.xml文件。 \u003c/p\u003e \n\u003ch2\u003e 配置文件 \u003c/h2\u003e \n\u003cp\u003e 現在,我們需要註冊我們的攔截器,然後調用它,因爲我們已經在前面的例子中默認的攔截器。要註冊一個新定義的攔截器\u0026lt;interceptors\u0026gt;...\u0026lt;/\u003cspan\u003einterceptors\u003c/span\u003e\u0026gt;標籤直接放在下的\u0026lt;package\u0026gt;的標記插件struts.xml文件。您可以跳過這一步,因爲我們沒有一個默認的攔截器在前面的例子。但在這裏,讓我們的註冊和使用,如下所示: \u003c/p\u003e \n\u003cpre\u003e \r\n\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\"?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n\r\n\u0026lt;struts\u0026gt;\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \u0026lt;package name=\"helloworld\" extends=\"struts-default\"\u0026gt;\r\n\r\n \u0026lt;interceptors\u0026gt;\r\n \u0026lt;interceptor name=\"myinterceptor\"\r\n class=\"com.yiibai.struts2.MyInterceptor\" /\u0026gt;\r\n \u0026lt;/interceptors\u0026gt;\r\n\r\n \u0026lt;action name=\"hello\" \r\n class=\"com.yiibai.struts2.HelloWorldAction\" \r\n method=\"execute\"\u0026gt;\r\n \u0026lt;interceptor-ref name=\"params\"/\u0026gt;\r\n \u0026lt;interceptor-ref name=\"myinterceptor\" /\u0026gt;\r\n \u0026lt;result name=\"success\"\u0026gt;/HelloWorld.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\r\n \u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 應該注意的是,你可以註冊多個攔截器\u0026lt;package\u0026gt;標籤內,同一時間可以調用多個攔截器內的\u0026lt;action\u0026gt;標籤。可以調用相同的攔截器與不同的動作。\u003cbr\u003e 需要創建\u003cspan\u003eWebContent/\u003c/span\u003eWEB-INF文件夾下web.xml文件下如下: \u003c/p\u003e \n\u003cp\u003e \u0026nbsp; \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\"?\u0026gt;\r\n\u0026lt;web-app xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n xmlns=\"http://java.sun.com/xml/ns/javaee\" \r\n xmlns:web=\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\r\n xsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\r\n id=\"WebApp_ID\" version=\"3.0\"\u0026gt;\r\n \r\n \u0026lt;display-name\u0026gt;Struts 2\u0026lt;/display-name\u0026gt;\r\n \u0026lt;welcome-file-list\u0026gt;\r\n \u0026lt;welcome-file\u0026gt;index.jsp\u0026lt;/welcome-file\u0026gt;\r\n \u0026lt;/welcome-file-list\u0026gt;\r\n \u0026lt;filter\u0026gt;\r\n \u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n \u0026lt;filter-class\u0026gt;\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u0026lt;/filter-class\u0026gt;\r\n \u0026lt;/filter\u0026gt;\r\n\r\n \u0026lt;filter-mapping\u0026gt;\r\n \u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n \u0026lt;url-pattern\u0026gt;/*\u0026lt;/url-pattern\u0026gt;\r\n \u0026lt;/filter-mapping\u0026gt;\r\n\u0026lt;/web-app\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊「導出」\u0026gt; WAR文件創建一個WAR文件。然後,這WAR部署在Tomcat的webapps目錄下。最後,啓動Tomcat服務器,並嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給你以下畫面: \u003c/p\u003e \n\u003cimg alt=\"Struts2快速入門\" src=\"https://asset.1ju.org/cmsstatic/struts2-6.jpg\"\u003e \n\u003cp\u003e 現在,在給定的文本框中輸入任何單詞,然後單擊「Say Hello按鈕執行已定義的動作。現在,如果你將檢查生成的日誌,你會發現下面的文字在底部: \u003c/p\u003e \n\u003cpre\u003e \r\nPre-Processing\r\nInside action....\r\nPost-Processing\r\u003c/pre\u003e \n\u003ch2\u003e 堆疊多個攔截器: \u003c/h2\u003e \n\u003cp\u003e 正如你想像,配置多個攔截器的每個動作很快就會變得非常難以控制。出於這個原因,攔截器的攔截器棧管理。下面是一個例子,直接從在struts-default.xml文件: \u003c/p\u003e \n\u003cpre\u003e \r\n\u0026lt;interceptor-stack name=\"basicStack\"\u0026gt;\r\n \u0026lt;interceptor-ref name=\"exception\"/\u0026gt;\r\n \u0026lt;interceptor-ref name=\"servlet-config\"/\u0026gt;\r\n \u0026lt;interceptor-ref name=\"prepare\"/\u0026gt;\r\n \u0026lt;interceptor-ref name=\"checkbox\"/\u0026gt;\r\n \u0026lt;interceptor-ref name=\"params\"/\u0026gt;\r\n \u0026lt;interceptor-ref name=\"conversionError\"/\u0026gt;\r\n\u0026lt;/interceptor-stack\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 上述權被稱爲basicStack,並且可以用於在您的配置中,如下所示。此配置節點被放置下\u0026lt;package.../\u0026gt;節點。每個\u0026lt;interceptor-ref.../\u0026gt;標籤引用了一個攔截器或攔截器棧已配置在當前的攔截器棧。因此,這是非常重要的,以確保名稱是唯一在所有攔截器和攔截器棧配置時,配置初始攔截器和攔截器棧。\u003cbr\u003e 我們已經看到了如何應用攔截器的作用,應用攔截器棧是沒有什麼不同。事實上,我們都使用完全相同的標籤: \u003c/p\u003e \n\u003cp\u003e \u0026nbsp; \u003c/p\u003e \n\u003cpre\u003e \r\n\u0026lt;action name=\"hello\" class=\"com.yiibai.struts2.MyAction\"\u0026gt;\r\n \u0026lt;interceptor-ref name=\"basicStack\"/\u0026gt;\r\n \u0026lt;result\u0026gt;view.jsp\u0026lt;/result\u0026gt;\r\n\u0026lt;/action\r\u003c/pre\u003e \n\u003cp\u003e 所有的6個攔截器,上述登記註冊完成股權「basicStack」hello操作。\u003cspan\u003e他們在配置\u003c/span\u003e應該指出的是攔截器執行的順序。例如,在上述情況下,異常將被執行第一,servlet配置\u003cspan\u003e第二\u003c/span\u003e等。 \u003c/p\u003e \n\u003ch1\u003e Struts 2 Results and Result Types \u003c/h1\u003e \n\u003cp\u003e 正如前面提到的,\u003cspan\u003e\u0026lt;results\u0026gt;\u003c/span\u003e標籤Struts2的MVC框架的視圖中所扮演的角色。動作是負責執行業務邏輯。執行業務邏輯後,下一步是使用\u003cspan\u003e\u0026lt;results\u0026gt;\u003c/span\u003e標籤顯示視圖。\u003cbr\u003e 經常有一些導航規則附加的結果。例如,如果在動作方法是對用戶進行驗證,有三種可能的結果。 (a)成功登錄失敗的登錄.\u0026nbsp;(b)用戶名或密碼不正確.(c)帳戶鎖定。\u003cbr\u003e 的操作方法在這種情況下,將配置有三種可能的結果字符串和三種不同的視圖呈現結果。在前面的例子\u003cspan\u003e我們已經看到\u003c/span\u003e。\u003cbr\u003e 但是,Struts2不配合使用JSP作爲視圖技術。畢竟了MVC模式的整個目的是保持層分離和高度可配置。例如,對於一個Web2.0客戶端,您可能要返回XML或JSON作爲輸出。在這種情況下,你可以創建一個新的結果類型爲XML或JSON,實現這一目標。\u003cbr\u003e Struts的一些預定義的結果類型,無論我們已經看到了,這是默認的結果類型,這是用來調度派遣到JSP頁面。 Struts允許使用的其他標記語言的技術,目前的結果和流行的選擇,包括\u003cspan\u003eVelocity, Freemaker, XSLT\u003c/span\u003e\u003cspan\u003e\u0026nbsp;和\u003c/span\u003e\u003cspan\u003eTiles\u003c/span\u003e。 \u003c/p\u003e \n\u003ch2\u003e 分發調度結果類型: \u003c/h2\u003e \n\u003cp\u003e 調度的結果類型是默認的類型,是用來指定,如果沒有其他的結果類型。它被用來轉發到一個servlet,JSP,HTML頁面等等,在服務器上它使用RequestDispatcher.forward()方法。\u003cbr\u003e 在我們前面的例子中,我們看到了「shorthand」版本,在這裏我們提供了一個JSP的路徑作爲身體的結果標記。 \u003c/p\u003e \n\u003cp\u003e \u0026nbsp; \u003c/p\u003e \n\u003cpre\u003e\u0026lt;result name=\"success\"\u0026gt;\r\n /HelloWorld.jsp\r\n\u0026lt;/result\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e We can also specify the JSP file using a \u0026lt;param name=\"location\"\u0026gt; tag within the \u0026lt;result...\u0026gt; element as follows: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;result name=\"success\" type=\"dispatcher\"\u0026gt;\r\n \u0026lt;param name=\"location\"\u0026gt;\r\n /HelloWorld.jsp\r\n \u0026lt;/param \u0026gt;\r\n\u0026lt;/result\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 我們還可以提供一個分析參數,默認值是true。解析參數的位置參數確定是否將被解析爲OGNL表達式。 \u003c/p\u003e \n\u003ch2\u003e FreeMaker結果類型: \u003c/h2\u003e \n\u003cp\u003e 在這個例子中,我們將看到我們如何使用FreeMaker作爲視圖技術。 freemaker是一種流行的模板引擎,用於生成輸出,使用預定義的模板。讓我們創建一個Freemaker模板文件hello.fm以下內容: \u003c/p\u003e \n\u003cpre\u003eHello World ${name}\r\u003c/pre\u003e \n\u003cp\u003e 在此以上的文件是一個模板,其中名稱是使用已定義的動作外,將通過放慢參數。在你的CLASSPATH中將保存該文件。接下來讓我們修改struts.xml中指定的結果如下: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\"?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n\r\n\u0026lt;struts\u0026gt;\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \u0026lt;package name=\"helloworld\" extends=\"struts-default\"\u0026gt;\r\n\r\n \u0026lt;action name=\"hello\" \r\n class=\"com.yiibai.struts2.HelloWorldAction\"\r\n method=\"execute\"\u0026gt;\r\n \u0026lt;result name=\"success\" type=\"freemarker\"\u0026gt;\r\n \u0026lt;param name=\"location\"\u0026gt;/hello.fm\u0026lt;/param\u0026gt;\r\n \u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n \r\n \u0026lt;/package\u0026gt;\r\n\r\n\u0026lt;/struts\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 讓我們保持我們的HelloWorldAction.java,HelloWorldAction.jsp和index.jsp文件,爲我們創造了他們的例子章。現在,右鍵單擊該項目上的名稱和clickExport\u0026gt; WAR文件創建一個WAR文件。然後,這WAR部署在Tomcat的webapps目錄下。最後,啓動Tomcat服務器,並嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給你以下畫面: \u003c/p\u003e \n\u003cimg alt=\"Struts2快速入門\" src=\"https://asset.1ju.org/cmsstatic/struts2-6.jpg\"\u003e \n\u003cp\u003e \u003cspan\u003e值\u003c/span\u003e「\u003cspan\u003eStruts2\u003c/span\u003e」,並提交頁面。您應該看到下一頁 \u003c/p\u003e \n\u003cimg alt=\"Struts2快速入門\" src=\"https://asset.1ju.org/cmsstatic/struts2-7.jpg\"\u003e \n\u003cp\u003e 正如你可以看到,這是完全一樣的不同之處在於,我們是不依賴於使用JSP作爲視圖技術的JSP視圖。在這個例子中,我們已經使用Freemaker。 \u003c/p\u003e \n\u003ch2\u003e 重定向結果類型: \u003c/h2\u003e \n\u003cp\u003e 重定向結果的類型調用標準\u003cspan\u003e\u0026nbsp;\u003c/span\u003e\u003ci\u003eresponse.sendRedirect()\u003c/i\u003e\u003cspan\u003e\u0026nbsp;\u003c/span\u003e方法,使瀏覽器來創建一個新的請求給定的位置。\u003cbr\u003e 我們可以提供的位置無論是在體內的\u0026lt;result...\u0026gt;元素或作爲一個\u0026lt;param name=\"location\"\u0026gt;元素。重定向也支持解析的參數。下面是一個例子使用XML配置: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;action name=\"hello\" \r\n class=\"com.yiibai.struts2.HelloWorldAction\"\r\n method=\"execute\"\u0026gt;\r\n \u0026lt;result name=\"success\" type=\"redirect\"\u0026gt;\r\n \u0026lt;param name=\"location\"\u0026gt;\r\n /NewWorld.jsp\r\n \u0026lt;/param \u0026gt;\r\n \u0026lt;/result\u0026gt;\r\n\u0026lt;/action\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 因此,只要修改struts.xml文件中定義重定向上述類型,並創建一個新的的文件NewWorld.jpg在那裏你會被重定向hello操作時,將返回成功。 \u003c/p\u003e \n\u003ch1\u003e Struts2值棧/ OGNL \u003c/h1\u003e \n\u003ch2\u003e 值棧: \u003c/h2\u003e \n\u003cp\u003e 值棧是一組的幾個對象保持中的下列對象提供的順序: \u003c/p\u003e \n\u003ctable width=\"100%\"\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003cth width=\"5\"\u003e SN \u003c/th\u003e \n \u003cth\u003e Objects \u0026amp; 描述 \u003c/th\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 1 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eTemporary Objects\u003c/span\u003e\u003cbr\u003e There are various temporary objects which are created during execution of a page. For example the current iteration value for a collection being looped over in a JSP tag. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 2 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eThe Model Object\u003c/span\u003e\u003cbr\u003e If you are using model objects in your struts application, the current model object is placed before the action on the value stack \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 3 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eThe Action Object\u003c/span\u003e\u003cbr\u003e This will be the current action object which is being executed. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 4 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eNamed Objects\u003c/span\u003e\u003cbr\u003e These objects include #application, #session, #request, #attr and #parameters and refer to the corresponding servlet scopes \u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n\u003c/table\u003e \n\u003cp\u003e 值棧可以通過標籤提供JSP,Velocity或者Freemarker的。在單獨的章節中,我們將研究有不同的標籤,被用來獲取和設置Struts 2.0的值棧。您可以在你的行動值棧對象如下: \u003c/p\u003e \n\u003cpre\u003eActionContext.getContext().getValueStack()\r\u003c/pre\u003e \n\u003cp\u003e 一旦你擁有了值對象,您可以使用以下方法來操作該對象: \u003c/p\u003e \n\u003ctable width=\"100%\"\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003cth width=\"5\"\u003e SN \u003c/th\u003e \n \u003cth\u003e ValueStack Methods \u0026amp; 描述 \u003c/th\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 1 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eObject findValue(String expr)\u003c/span\u003e\u003cbr\u003e Find a value by evaluating the given expression against the stack in the default search order. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 2 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eCompoundRoot getRoot()\u003c/span\u003e\u003cbr\u003e Get the CompoundRoot which holds the objects pushed onto the stack. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 3 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eObject peek()\u003c/span\u003e\u003cbr\u003e Get the object on the top of the stack without changing the stack. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 4 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eObject pop()\u003c/span\u003e\u003cbr\u003e Get the object on the top of the stack and remove it from the stack. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 5 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003evoid push(Object o)\u003c/span\u003e\u003cbr\u003e Put this object onto the top of the stack. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 6 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003evoid set(String key, Object o)\u003c/span\u003e\u003cbr\u003e Sets an object on the stack with the given key so it is retrievable by findValue(key,...) \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 7 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003evoid setDefaultType(Class defaultType)\u003c/span\u003e\u003cbr\u003e Sets the default type to convert to if no type is provided when getting a value. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 8 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003evoid setValue(String expr, Object value)\u003c/span\u003e\u003cbr\u003e Attempts to set a property on a bean in the stack with the given expression using the default search order. \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 9 \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eint size()\u003c/span\u003e\u003cbr\u003e Get the number of objects in the stack. \u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n\u003c/table\u003e \n\u003ch2\u003e OGNL: \u003c/h2\u003e \n\u003cp\u003e 對象圖導航語言(OGNL)是一個功能強大的表達式語言,用於引用和操作數據的值棧。OGNL還可以在數據傳輸和類型轉換。\u003cbr\u003e OGNL是非常相似的JSP表達式語言。 OGNL是基於的思想具有根或缺省對象的範圍內的。默認的根對象的屬性可以參考使用的標記符號,這是英鎊符號。 \u003c/p\u003e \n\u003cp\u003e \u0026nbsp; \u003c/p\u003e \n\u003cp\u003e 正如前面提到的,OGNL根據上下文和Struts建立一個ActionContext中使用OGNL地圖。ActionContext中的地圖由下列組成: \u003c/p\u003e \n\u003col\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003eapplication\u003c/span\u003e\u0026nbsp;- 應用程序範圍內的變量 \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003esession\u003c/span\u003e\u0026nbsp;- 會話範圍的變量 \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003eroot / value stack\u003c/span\u003e\u0026nbsp;-所有操作變量都存儲在這裏 \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003erequest\u003c/span\u003e\u0026nbsp;- 請求範圍的變量 \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003eparameters\u003c/span\u003e\u0026nbsp;- 請求參數 \u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cspan\u003eatributes\u003c/span\u003e\u0026nbsp;- 存儲的屬性頁面,請求,會話和應用範圍 \u003c/p\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e 重要的是要明白,值棧中的操作對象是始終可用。所以,因此,如果你的行動對象的屬性x和y有隨時可供您使用。\u003cbr\u003e 在ActionContext中的對象被稱爲使用英鎊符號,但是,值棧中的對象可以直接引用,例如,如果員工是一個動作類的屬性的話,就可以得到參考如下: \u003c/p\u003e \n\u003cp\u003e \u0026nbsp; \u003c/p\u003e \n\u003cpre\u003e \u0026lt;s:property value=\"name\"/\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 而不是 \u003c/p\u003e \n\u003cpre\u003e \u0026lt;s:property value=\"#name\"/\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 如果你有所謂的「login」會話中的屬性,你可以找回如下: \u003c/p\u003e \n\u003cpre\u003e \u0026lt;s:property value=\"#session.login\"/\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e OGNL還支持處理的集合 - 即地圖,List和Set。例如,以顯示顏色的下拉列表中,你可以這樣做: \u003c/p\u003e \n\u003cpre\u003e \u0026lt;s:select name=\"color\" list=\"{'red','yellow','green'}\" /\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e OGNL表達式是巧妙地解釋了\u003cspan\u003e\u0026nbsp;\"red\",\"yellow\",\"green\"\u003c/span\u003e顏色和此基礎上建立一個列表。\u003cbr\u003e OGNL表達式將被廣泛使用在接下來的章節中,我們將研究不同的標籤。因此,而不是孤立地看着他們,讓我們來看看的表格標籤/控制標籤/數據標籤和Ajax標籤部分在使用中的一些例子。 \u003c/p\u003e \n\u003ch2\u003e 值棧/OGNL例: \u003c/h2\u003e \n\u003ch3\u003e 創建動作: \u003c/h3\u003e \n\u003cp\u003e 讓我們考慮下面的操作類,我們訪問值棧,然後設置幾個鍵,我們將在我們的觀點,即訪問使用OGNL。JSP頁面。 \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.struts2;\r\n\r\nimport java.util.*; \r\n\r\nimport com.opensymphony.xwork2.util.ValueStack;\r\nimport com.opensymphony.xwork2.ActionContext;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class HelloWorldAction extends ActionSupport{\r\n private String name;\r\n\r\n public String execute() throws Exception {\r\n ValueStack stack = ActionContext.getContext().getValueStack();\r\n Map\u0026lt;String, Object\u0026gt; context = new HashMap\u0026lt;String, Object\u0026gt;();\r\n\r\n context.put(\"key1\", new String(\"This is key1\")); \r\n context.put(\"key2\", new String(\"This is key2\"));\r\n stack.push(context);\r\n\r\n System.out.println(\"Size of the valueStack: \" + stack.size());\r\n return \"success\";\r\n } \r\n\r\n public String getName() {\r\n return name;\r\n }\r\n\r\n public void setName(String name) {\r\n this.name = name;\r\n }\r\n}\r\u003c/pre\u003e \n\u003cp\u003e 其實,Struts 2增加值棧的頂部時動作執行。因此,通常的方法把東西值棧是增加值getter/setter方法Action類和然後使用\u0026lt;s:property\u0026gt;的標籤,訪問值。但我展示你究竟是如何的ActionContext中和值棧在struts的工作。 \u003c/p\u003e \n\u003ch3\u003e 創建視圖 \u003c/h3\u003e \n\u003cp\u003e 讓我們創建下面的JSP文件helloWorld.jsp,在WebContent文件夾在eclipse項目。這種觀點的情況下采取行動的成功返回,將顯示: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ page contentType=\"text/html; charset=UTF-8\" %\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;title\u0026gt;Hello World\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n Entered value : \u0026lt;s:property value=\"name\"/\u0026gt;\u0026lt;br/\u0026gt;\r\n Value of key 1 : \u0026lt;s:property value=\"key1\" /\u0026gt;\u0026lt;br/\u0026gt;\r\n Value of key 2 : \u0026lt;s:property value=\"key2\" /\u0026gt; \u0026lt;br/\u0026gt;\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 我們還需要創建index.jsp在WebContent文件夾下,其內容如下: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ page language=\"java\" contentType=\"text/html; charset=ISO-8859-1\"\r\n pageEncoding=\"ISO-8859-1\"%\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\"%\u0026gt;\r\n \u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;title\u0026gt;Hello World\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n \u0026lt;h1\u0026gt;Hello World From Struts2\u0026lt;/h1\u0026gt;\r\n \u0026lt;form action=\"hello\"\u0026gt;\r\n \u0026lt;label for=\"name\"\u0026gt;Please enter your name\u0026lt;/label\u0026gt;\u0026lt;br/\u0026gt;\r\n \u0026lt;input type=\"text\" name=\"name\"/\u0026gt;\r\n \u0026lt;input type=\"submit\" value=\"Say Hello\"/\u0026gt;\r\n \u0026lt;/form\u0026gt;\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\r\u003c/pre\u003e \n\u003ch3\u003e 配置文件 \u003c/h3\u003e \n\u003cp\u003e 以下是struts.xml文件的內容: \u003c/p\u003e \n\u003cpre\u003e \r\n\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\"?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n\r\n\u0026lt;struts\u0026gt;\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \u0026lt;package name=\"helloworld\" extends=\"struts-default\"\u0026gt;\r\n\r\n \u0026lt;action name=\"hello\" \r\n class=\"com.yiibai.struts2.HelloWorldAction\" \r\n method=\"execute\"\u0026gt;\r\n \u0026lt;result name=\"success\"\u0026gt;/HelloWorld.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\r\n \u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 以下是web.xml文件中的內容: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\"?\u0026gt;\r\n\u0026lt;web-app xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n xmlns=\"http://java.sun.com/xml/ns/javaee\" \r\n xmlns:web=\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\r\n xsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\r\n id=\"WebApp_ID\" version=\"3.0\"\u0026gt;\r\n \r\n \u0026lt;display-name\u0026gt;Struts 2\u0026lt;/display-name\u0026gt;\r\n \u0026lt;welcome-file-list\u0026gt;\r\n \u0026lt;welcome-file\u0026gt;index.jsp\u0026lt;/welcome-file\u0026gt;\r\n \u0026lt;/welcome-file-list\u0026gt;\r\n \u0026lt;filter\u0026gt;\r\n \u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n \u0026lt;filter-class\u0026gt;\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u0026lt;/filter-class\u0026gt;\r\n \u0026lt;/filter\u0026gt;\r\n\r\n \u0026lt;filter-mapping\u0026gt;\r\n \u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n \u0026lt;url-pattern\u0026gt;/*\u0026lt;/url-pattern\u0026gt;\r\n \u0026lt;/filter-mapping\u0026gt;\r\n\u0026lt;/web-app\u0026gt;\r\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊「導出」\u0026gt; WAR文件創建一個WAR文件。然後,這WAR部署在Tomcat的webapps目錄下。最後,啓動Tomcat服務器,並嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給你以下畫面: \u003c/p\u003e \n\u003cimg alt=\"Struts2快速入門\" src=\"https://asset.1ju.org/cmsstatic/struts2-6.jpg\"\u003e \n\u003cp\u003e 現在,在給定的文本框中輸入任何單詞,然後點擊「Say Hello」按鈕執行已定義的動作。現在,如果你將檢查生成的日誌,你會發現下面的文字在底部: \u003c/p\u003e \n\u003cpre\u003e \r\nSize of the valueStack: 3\r\u003c/pre\u003e \n\u003cp\u003e 這將顯示下面的屏幕,它會顯示任何價值,你將進入和值key1和key2,我們賦上了值棧。 \u003c/p\u003e \n\u003cimg alt=\"Struts2快速入門\" src=\"https://asset.1ju.org/cmsstatic/struts2-10.jpg\"\u003e \n\u003ch1\u003e 結論: \u003c/h1\u003e \n\u003cp\u003e 希望你有較好的瞭解Struts 2概念。如果願意瞭解更多的細節和進一步的例子,如上傳文件,發送電子郵件,表單驗證等,然後可以去通過完整教程。 \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"90:Td6c,"])</script><script>self.__next_f.push([1,"\u003cp\u003e Struts2是流行和成熟的基於MVC設計模式的Web應用程序框架。 Struts2不只是Struts1下一個版本,它是一個完全重寫的Struts架構。\u003c/p\u003e \n\u003cp\u003e WebWork框架開始以Struts框架爲基礎,其目標是提供一個加強和改進框架Struts來使web開發的開發人員更容易。\u003c/p\u003e \n\u003cp\u003e 一段時間後,WebWork框架和Struts社區聯手打造的著名的Struts2框架。\u003c/p\u003e \n\u003ch2\u003e Struts 2框架的特點:\u003c/h2\u003e \n\u003cp\u003e 這裏有一些強大的功能,可能會迫使你考慮Struts2:\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e \u003cstrong\u003ePOJO表單和POJO動\u003c/strong\u003e作\u0026nbsp;- Struts2的Struts框架已經擺脫了動作表單組成部分,\u0026nbsp;Struts2可以使用任何POJO接收的形式輸入。同樣現在可以看到任何POJO作爲一個Action類。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cstrong\u003e標籤支持 \u003c/strong\u003e- Struts2中,提高了表單標籤和新標籤允許開發人員編寫更少的代碼。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cstrong\u003eAJAX\u0026nbsp;支持\u003c/strong\u003e- Struts2中已確認由Web2.0技術接管,並整合到產品中,通過創建AJAX標籤,功能非常相似的標準Struts2\u0026nbsp;標籤AJAX支持。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cstrong\u003e易於整合\u003c/strong\u003e\u0026nbsp;- Struts2\u0026nbsp;集成各種整合與其他框架如Spring,Tiles\u0026nbsp;和SiteMesh是現在更容易。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cstrong\u003e模板支持\u0026nbsp;\u003c/strong\u003e- 支持生成使用模板。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cstrong\u003e插件支持\u003c/strong\u003e\u0026nbsp;- 可以提高核心Struts2的特性,並增強使用插件。大量的插件可供Struts2。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cstrong\u003e性能分析\u003c/strong\u003e - Struts2的分析,調試和分析應用程序提供了集成。除此之外,Struts還提供了集成的內置調試工具調試。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cstrong\u003e易於修改標籤\u0026nbsp;\u003c/strong\u003e- Struts2的標籤標註,可以調整使用Freemarker的模板。這並不需要JSP或\u003ca href=\"http://www.yiiibai.com/java/\"\u003eJava\u003c/a\u003e知識。基本HTML,XML和CSS知識是足夠修改標籤。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cstrong\u003e提倡少配置\u003c/strong\u003e\u0026nbsp;- Struts2\u0026nbsp;促進較少的配置的幫助下,使用默認的各種設置值。不必配置的東西,除非它不符Struts2的默認設置。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cstrong\u003e視圖技術:\u003c/strong\u003e\u0026nbsp;- Struts2中有一個很大的支持多個視圖選項\u0026nbsp;(JSP, Freemarker, Velocity 和 XSLT)\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e 以上只是Struts2的十大功能,這使得它是企業公司級應用框架。\u003c/p\u003e \n\u003ch2\u003e Struts 2的缺點:\u003c/h2\u003e \n\u003cp\u003e 雖然Struts 2 的配備了一個偉大的功能列表,但我不會忘記提及關於Struts2一些缺點,將需要大量的改進措施:\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e \u003cstrong\u003e更大的學習曲線\u003c/strong\u003e\u0026nbsp;- 要使用MVC與Struts,你必須是習慣使用標準的JSP,Servlet API和大量精心設計的框架。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cstrong\u003e欠佳的文檔\u003c/strong\u003e\u0026nbsp;- Struts有標準的servlet和JSP API的相比,更少的在線資源,許多用戶第一時間發現網上Apache文檔混亂和管理不善的組織。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e \u003cstrong\u003e較少透明度\u003c/strong\u003e\u0026nbsp;- Struts應用程序中,有很多幕後比正常的基於Java的Web應用程序,這使得它很難理解的框架。\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e 最後一點,一個好的框架應該提供通用的特性,許多不同類型的應用程序,可以利用它。 Struts 2是一個最好的網絡架構和高度被用於開發富Internet應用程序(RIA)。\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"91:T24fb,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 我們的首要任務是讓最低限度的Struts2應用程序運行。本章將指導您如何準備開發環境中開始使用Struts2。我假設你已經在機器上安裝JDK(5 +),Tomcat和Eclipse。如果還沒有安裝這些組件(軟件),然後按照以下步驟:\u003c/p\u003e \n\u003ch2\u003e Step 1 - 安裝Java開發工具包(JDK):\u003c/h2\u003e \n\u003cp\u003e 從Oracle的Java網站:\u003ca href=\"http://www.oracle.com/technetwork/java/javase/downloads/index.htmll\"\u003eJava SE Downloads\u003c/a\u003e,可以下載最新版本的SDK。會發現說明安裝JDK中下載的文件,按照給定的說明來安裝和配置設置。最後,設置PATH和JAVA_HOME環境變量來引用該目錄包含javac和java,通常分別爲:java_install_dir/bin 和 java_install_dir\u003c/p\u003e \n\u003cp\u003e 如果使用的是Windows, SDK安裝在C:jdk1.5.0_20,在文件C:AUTOEXEC.BAT文件中把下面這行寫入。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003eset\u003c/span\u003e\u003cspan class=\"pln\"\u003e PATH\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003eC\u003c/span\u003e\u003cspan class=\"pun\"\u003e:\u003c/span\u003e\u003cspan class=\"pln\"\u003ejdk1\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"lit\"\u003e5.0\u003c/span\u003e\u003cspan class=\"pln\"\u003e_20\b\u003c/span\u003e\u003cspan class=\"kwd\"\u003ein\u003c/span\u003e\u003cspan class=\"pun\"\u003e;%\u003c/span\u003e\u003cspan class=\"pln\"\u003ePATH\u003c/span\u003e\u003cspan class=\"pun\"\u003e%\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eset\u003c/span\u003e\u003cspan class=\"pln\"\u003e JAVA_HOME\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003eC\u003c/span\u003e\u003cspan class=\"pun\"\u003e:\u003c/span\u003e\u003cspan class=\"pln\"\u003ejdk1\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"lit\"\u003e5.0\u003c/span\u003e\u003cspan class=\"pln\"\u003e_20\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 另外,在Windows NT/2000/XP上,您還可以右鍵單擊「我的電腦」,選擇「屬性」,再「高級」,找到「環境變量」。然後,更新PATH值(jdk安裝的目錄),然後按下「確定」按鈕。\u003c/p\u003e \n\u003cp\u003e 在Unix(Solaris上,Linux等),如果SDK安裝在/usr/local/jdk1.5.0_20,使用的是C shell,你把下面的到\u0026nbsp;.cshrc文件。\u0026nbsp;\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003esetenv PATH \u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003eusr\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"kwd\"\u003elocal\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003ejdk1\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"lit\"\u003e5.0\u003c/span\u003e\u003cspan class=\"pln\"\u003e_20\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003ebin\u003c/span\u003e\u003cspan class=\"pun\"\u003e:\u003c/span\u003e\u003cspan class=\"pln\"\u003e$PATH\r\nsetenv JAVA_HOME \u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003eusr\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"kwd\"\u003elocal\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003ejdk1\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"lit\"\u003e5.0\u003c/span\u003e\u003cspan class=\"pln\"\u003e_20\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 另外,如果使用如Borland公司的JBuilder,Eclipse,IntelliJ IDEA,或Sun ONE Studio的集成開發環境(IDE),編譯和運行一個簡單的程序,以確認是否安裝Java 。\u003cbr\u003e 注:可使用MyEclipse直接開發。\u003c/p\u003e \n\u003ch2\u003e Step 2 - Apache Tomcat的安裝:\u003c/h2\u003e \n\u003cp\u003e 您可以下載最新版本的Tomcat:\u003ca href=\"http://tomcat.apache.org/\"\u003ehttp://tomcat.apache.org/\u003c/a\u003e。一旦下載安裝,解壓二進制分發到一個方便的位置。例如,在Windows上可以是C:ApacheTomca,或/usr/local/apache-tomcat-6.0.33在Linux/Unix,並創建CATALINA_HOME環境變量指向這些位置。\u003c/p\u003e \n\u003cp\u003e Tomcat既可以啓動Windows機器上執行以下命令,或者可以簡單雙擊startup.bat\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e%\u003c/span\u003e\u003cspan class=\"pln\"\u003eCATALINA_HOME\u003c/span\u003e\u003cspan class=\"pun\"\u003e%\u003c/span\u003e\u003cspan class=\"pln\"\u003e\b\u003c/span\u003e\u003cspan class=\"kwd\"\u003ein\u003c/span\u003e\u003cspan class=\"pln\"\u003estartup\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ebat\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eor\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n C\u003c/span\u003e\u003cspan class=\"pun\"\u003e:\u003c/span\u003e\u003cspan class=\"pln\"\u003eapache\u003c/span\u003e\u003cspan class=\"pun\"\u003e-\u003c/span\u003e\u003cspan class=\"pln\"\u003etomcat\u003c/span\u003e\u003cspan class=\"pun\"\u003e-\u003c/span\u003e\u003cspan class=\"lit\"\u003e6.0\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"lit\"\u003e33\u003c/span\u003e\u003cspan class=\"pln\"\u003e\b\u003c/span\u003e\u003cspan class=\"kwd\"\u003ein\u003c/span\u003e\u003cspan class=\"pln\"\u003estartup\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ebat\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e Tomcat既可以在UNIX(Solaris,Linux等)的機器上啓動執行以下命令:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e$CATALINA_HOME\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003ebin\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003estartup\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esh\r\n \r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eor\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003eusr\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"kwd\"\u003elocal\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003eapache\u003c/span\u003e\u003cspan class=\"pun\"\u003e-\u003c/span\u003e\u003cspan class=\"pln\"\u003etomcat\u003c/span\u003e\u003cspan class=\"pun\"\u003e-\u003c/span\u003e\u003cspan class=\"lit\"\u003e6.0\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"lit\"\u003e33\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003ebin\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003estartup\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esh\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 成功啓動後,默認包含在Tomcat 的Web應用程序將通過訪問 http://localhost:8080/。如果一切順利,那麼它應該顯示以下結果:\u003c/p\u003e \n\u003cimg alt=\"Tomcat Home page\" src=\"https://asset.1ju.org/cmsstatic/struts2-1.JPG\"\u003e \n\u003cp\u003e 進一步Tomcat 配置和運行信息的文檔中可以找到這裏,以及在Tomcat網站:http://tomcat.apache.org\u003c/p\u003e \n\u003cp\u003e 停止Tomcat既可以通過Windows機器上執行以下命令:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e%\u003c/span\u003e\u003cspan class=\"pln\"\u003eCATALINA_HOME\u003c/span\u003e\u003cspan class=\"pun\"\u003e%\u003c/span\u003e\u003cspan class=\"pln\"\u003e\b\u003c/span\u003e\u003cspan class=\"kwd\"\u003ein\u003c/span\u003e\u003cspan class=\"pln\"\u003eshutdown\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eor\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\nC\u003c/span\u003e\u003cspan class=\"pun\"\u003e:\u003c/span\u003e\u003cspan class=\"pln\"\u003eapache\u003c/span\u003e\u003cspan class=\"pun\"\u003e-\u003c/span\u003e\u003cspan class=\"pln\"\u003etomcat\u003c/span\u003e\u003cspan class=\"pun\"\u003e-\u003c/span\u003e\u003cspan class=\"lit\"\u003e5.5\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"lit\"\u003e29\u003c/span\u003e\u003cspan class=\"pln\"\u003e\b\u003c/span\u003e\u003cspan class=\"kwd\"\u003ein\u003c/span\u003e\u003cspan class=\"pln\"\u003eshutdown\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 停止Tomcat既可以在Unix上執行以下命令(的Solaris,Linux等)的機器:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e$CATALINA_HOME\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003ebin\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003eshutdown\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esh\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eor\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003eusr\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"kwd\"\u003elocal\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003eapache\u003c/span\u003e\u003cspan class=\"pun\"\u003e-\u003c/span\u003e\u003cspan class=\"pln\"\u003etomcat\u003c/span\u003e\u003cspan class=\"pun\"\u003e-\u003c/span\u003e\u003cspan class=\"lit\"\u003e5.5\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"lit\"\u003e29\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003ebin\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003eshutdown\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esh\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e Step 3 - 安裝Eclipse(IDE)\u003c/h2\u003e \n\u003cp\u003e 在本教程中的所有例子已經寫入使用Eclipse IDE。所以我建議機器上安裝最新版本的Eclipse。\u003c/p\u003e \n\u003cp\u003e 安裝Eclipse 下載\u0026nbsp;\u003ca href=\"http://www.eclipse.org/downloads/\"\u003ehttp://www.eclipse.org/downloads\u003c/a\u003e最新的Eclipse二進制文件。一旦下載安裝,解壓二進制分發到一個方便的位置。例如,在windows中爲C:eclipse ,或/usr/local/eclipse 在\u0026nbsp;Linux/Unix 上,最後設置PATH變量。\u003c/p\u003e \n\u003cp\u003e Eclipse可以啓動Windows機器上執行以下命令,或者可以簡單地雙擊eclipse.exe\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e%\u003c/span\u003e\u003cspan class=\"pln\"\u003eC\u003c/span\u003e\u003cspan class=\"pun\"\u003e:\u003c/span\u003e\u003cspan class=\"pln\"\u003eeclipseeclipse\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eexe\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在Eclipse中可以在UNIX(的Solaris,Linux等)的機器上啓動執行以下命令:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e$\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003eusr\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"kwd\"\u003elocal\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003eeclipse\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"pln\"\u003eeclipse\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 成功啓動後,如果一切正常,那麼它應顯示以下結果:\u003c/p\u003e \n\u003cimg alt=\"Eclipse Home page\" src=\"https://asset.1ju.org/cmsstatic/struts2-2.JPG\"\u003e \n\u003ch2\u003e Step 4 - 設置Struts2的庫\u003c/h2\u003e \n\u003cp\u003e 現在,如果一切正常,那麼可以進行設置Struts2 框架。下面是簡單的步驟,下載並安裝在機器上的Struts2。\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e 作出一個選擇是否要在Windows或Unix安裝Struts2,然後進行下一個步驟.zip文件下載在Windows,.tz 爲UNIX文件。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 下載Struts2 的二進制文件的最新版本\u0026nbsp;\u003ca href=\"http://struts.apache.org/download.cgi\"\u003ehttp://struts.apache.org/download.cgi\u003c/a\u003e.\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 在寫這篇教程的時候,我下載的是struts-2.0.14-all.zip解壓下載的文件時,C:struts-2.2.3 有如下的目錄結構。\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cimg alt=\"Sturts Directories\" src=\"https://asset.1ju.org/cmsstatic/struts2-11.jpg\"\u003e \n\u003cp\u003e 第二步是解壓zip文件中的任何位置,我下載和解壓struts-2.2.3-all.zip\u0026nbsp;在c:文件夾中,Windows 7機器上的所有jar文件放到到C:struts-2.2.3lib目錄下。確保正確設置CLASSPATH變量,否則將出現的問題,在運行應用程序同時。\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"92:T5cb2,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 前面我們已經學習了Struts2 的架構,當點擊一個超鏈接或提交一個HTML表單在Struts2 的 Web應用程序,輸入所收集被髮送到一個Java類稱爲操作控制器。當動作執行後,結果選擇了一個資源來呈現響應。資源通常是一個JSP,但它也可以是一個PDF文件,Excel電子表格,或一個Java applet 窗口。\u003c/p\u003e \n\u003cp\u003e 假設已經建立開發環境。現在讓我們繼續爲第一個 「Hello World」 的 struts2 項目構建。這個項目的目的是建立一個Web應用程序,它收集用戶的姓名,並顯示「Hello World」 用戶名。我們將創建任何Struts2項目的四個組成部分:\u003c/p\u003e \n\u003ctable\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003cth\u003e SN\u003c/th\u003e \n \u003cth\u003e 組件和說明\u003c/th\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 1\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eAction\u003c/b\u003e\u003cbr\u003e Create an action class which will contain complete business logic and conrol the interaction between the user, the model, and the view.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 2\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eInterceptors\u003c/b\u003e\u003cbr\u003e Create interceptors if required, or use existing interceptors. This is part of Controller.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 3\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eView\u003c/b\u003e\u003cbr\u003e Create a JSPs to interact with the user to take input and to present the final messages.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 4\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eConfiguration Files\u003c/b\u003e\u003cbr\u003e Create configuration files to couple the Action, View and Controllers. These files are struts.xml, web.xml, struts.properties.\u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n\u003c/table\u003e \n\u003cp\u003e 我打算使用Eclipse IDE,所以所有必需的組件將創建一個動態Web項目下。所以,讓我們開始創建動態Web項目。\u003c/p\u003e \n\u003ch2\u003e 創建動態Web項目:\u003c/h2\u003e \n\u003cp\u003e 啓動Eclipse,然後再\u0026nbsp;File \u0026gt; New \u0026gt; Dynamic Web Project\u0026nbsp;輸入工程名稱爲\u0026nbsp;HelloWorldStruts2\u0026nbsp;並設置屏幕中給出其餘的選項:\u003c/p\u003e \n\u003cimg alt=\"Hello World Sturts2\" src=\"https://asset.1ju.org/cmsstatic/struts2-hello-world-1.jpg\"\u003e \n\u003cp\u003e 選擇在接下來的畫面中的所有默認選項和最後檢查\u0026nbsp;Generate Web.xml deployment descriptor\u0026nbsp;選項. 這將創建一個動態Web項目在Eclipse。現在去\u0026nbsp;Windows \u0026gt; Show View \u0026gt; Project Explorer, 會看到項目窗口的東西如下:\u003c/p\u003e \n\u003cimg alt=\"Hello World Sturts2\" src=\"https://asset.1ju.org/cmsstatic/struts2-hello-world-2.jpg\"\u003e \n\u003cp\u003e 現在複製下列文件從struts 2 lib 文件夾\u0026nbsp;C:struts-2.2.3lib 到工程\u0026nbsp;WEB-INFlib\u0026nbsp;文件夾,要做到這一點,你可以簡單地將以下的所有文件拖放複製到WEB-INF lib文件夾。\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e commons-fileupload-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e commons-io-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e commons-lang-x.y.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e commons-logging-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e commons-logging-api-x.y.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e freemarker-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e javassist-.xy.z.GA\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e ognl-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e struts2-core-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e xwork-core.x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003ch2\u003e 創建動作類:\u003c/h2\u003e \n\u003cp\u003e Action類是 Struts2 應用程序的關鍵,我們實現的大部分動作類中的業務邏輯。因此,讓我們創建一個Java文件HelloWorldAction.java\u0026nbsp;Java Resources \u0026gt; src\u0026nbsp;在下面給出的內容包名\u0026nbsp;com.yiibai.struts2\u0026nbsp;。\u003c/p\u003e \n\u003cp\u003e Action類響應用戶操作,當用戶點擊一個URL。 Action類中的方法中的一個或多個被執行並返回一個字符串結果。基於結果的值,一個特定的JSP頁面的呈現方式。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHelloWorldAction\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 這是一個非常簡單的類,一個名爲「name」屬性。我們有標準的「name」屬性的getter和setter方法​​,並返回字符串「success」的執行方法。\u0026nbsp;\u003c/p\u003e \n\u003cp\u003e Struts2框架將創建一個對象HelloWorldAction類並調用執行方法在響應用戶的動作。把業務邏輯裏面的execute方法,最後返回的字符串常量。簡單地說爲每個網址,必須執行一個動作類,要麼就可以直接使用這個類的名稱作爲操作名,也可以使用struts.xml文件如下所示映射到一些其他的名字。\u003c/p\u003e \n\u003ch2\u003e 創建視圖\u003c/h2\u003e \n\u003cp\u003e 我們需要一個JSP提交最後的消息,這個頁面會被稱爲Struts2框架一個預定義的動作時,會發生這種映射將被定義在struts.xml文件。因此,讓我們一起創造在Eclipse項目在WebContent文件夾下面的jsp文件helloWorld.jsp。要做到這一點,右鍵單擊WebContent文件夾在項目資源管理器,選擇New \u0026gt;JSP File。\u0026nbsp;.\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Hello World, \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e taglib指令告訴Servlet容器,這個頁面將使用Struts 2的標籤,這些標籤將之前由s。\u0026nbsp;s:property標籤顯示動作類屬性\"name\u0026gt;\u0026nbsp;HelloWorldAction類的getName()方法返回的值。\u0026nbsp;\u003c/p\u003e \n\u003ch2\u003e 創建主頁:\u003c/h2\u003e \n\u003cp\u003e 我們還需要在WebContent文件夾中創建的index.jsp。該文件將作爲初始動作URL,用戶可以在其中點擊告訴Struts 2框架調用 HelloWorldAction類定義的方法呈現 helloWorld.jsp 視圖。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n pageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n \u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;h1\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World From Struts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/h1\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;form\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;label\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003efor\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003ePlease enter your name\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/label\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"text\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"submit\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Say Hello\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e Hello 動作定義在上面的視圖文件將被映射到HelloWorldAction類和其執行方法使用struts.xml文件。當用戶點擊「提交」按鈕,將導致Struts2框架運行的執行方法定義的在其中,HelloWorldAction類根據返回值的方法,將相應的視圖選擇和渲染作爲響應。\u003c/p\u003e \n\u003ch2\u003e 配置文件\u003c/h2\u003e \n\u003cp\u003e 我們需要一個映射,以配合網址,HelloWorldAction類(模型),和的helloWorld.jsp的(視圖)。映射講述了Struts 2框架類將響應用戶的操作(URL),這個類的方法將被執行,查看渲染基於字符串結果,該方法返回。\u003c/p\u003e \n\u003cp\u003e 因此,讓我們創建一個名爲struts.xml中。由於Struts2 要求struts.xml中存在類「文件夾中。因此,創建struts.xml文件的WebContent/ WEB-INF/classes文件夾下。 Eclipse不創建「classes」文件夾,所以需要自己做。要做到這一點,在項目資源管理器的WEB-INF文件夾上點擊右鍵並選擇New \u0026gt; Folder。struts.xml中應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 上面的配置文件的幾句話。在這裏,我們設置爲 true常量struts.devMode,因爲我們正在程序開發環境,我們需要看到一些有用的日誌消息。然後,我們定義了一個名爲HelloWorld 包。創建一個包是有用的,當想一起進行分組動作。在我們的例子中,我們將我們的行動命名爲「hello」,這是相應的URL /hello.action 和備份HelloWorldAction.class。執行HelloWorldAction.class方法是運行時URL /hello.action 調用的方法。如果執行方法的結果返回「success」,然後我們把用戶到 helloWorld.jsp。\u003c/p\u003e \n\u003cp\u003e 下一步是創建一個web.xml文件,這是一個Struts2的任何請求的入口點。Struts2應用程序的入口點,將是一個部署描述符(web.xml)中定義的過濾器。因此,我們將定義在web.xml中條目oforg.apache.struts2.dispatcher.FilterDispatcher類。 web.xml文件中需要創建的WEB-INF文件夾下的WebContent下。已經建立的Eclipse的web.xml文件時爲創建項目。所以,讓我們只需要修改如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 我們已經指定index.jsp的歡迎文件。然後,我們已經配置Struts2的過濾器上運行的所有URL(即任何URL匹配模式/ *)\u003c/p\u003e \n\u003ch2\u003e 啓用詳細日誌:\u003c/h2\u003e \n\u003cp\u003e 可以啓用完整的日誌記錄功能,而Struts 2的WEB-INF/classes下文件夾創建logging.properties文件。保持在屬性文件中的以下兩行:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \r\norg\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eapache\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ecatalina\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ecore\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eContainerBase\u003c/span\u003e\u003cspan class=\"pun\"\u003e.[\u003c/span\u003e\u003cspan class=\"typ\"\u003eCatalina\u003c/span\u003e\u003cspan class=\"pun\"\u003e].\u003c/span\u003e\u003cspan class=\"pln\"\u003elevel \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e INFO\r\norg\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eapache\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ecatalina\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ecore\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eContainerBase\u003c/span\u003e\u003cspan class=\"pun\"\u003e.[\u003c/span\u003e\u003cspan class=\"typ\"\u003eCatalina\u003c/span\u003e\u003cspan class=\"pun\"\u003e].\u003c/span\u003e\u003cspan class=\"pln\"\u003ehandlers \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003elogging\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eConsoleHandler\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 默認logging.properties指定ConsoleHandler的路由記錄到stdout,也是一個文件處理器。處理程序的日誌級別閾值可以設置使用 SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST 或 ALL.\u003c/p\u003e \n\u003cp\u003e 就是這樣。我們已經準備好使用Struts 2框架來運行我們的Hello World應用程序。\u003c/p\u003e \n\u003ch2\u003e 執行應用程序\u003c/h2\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊\u0026nbsp;Export \u0026gt; WAR File文件創建一個WAR文件。然後部署在Tomcat 的 webapps目錄下這個WAR。最後,啓動Tomcat 服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Hello World Input\" src=\"https://asset.1ju.org/cmsstatic/struts2-hello-world-3.jpg\"\u003e \n\u003cp\u003e 輸入一個值「Struts2」,並提交頁面。應該看到頁面如下:\u003c/p\u003e \n\u003cimg alt=\"Hello World Result\" src=\"https://asset.1ju.org/cmsstatic/struts2-hello-world-4.jpg\"\u003e \n\u003cp\u003e 注意,可以定義索引struts.xml文件中的動作,在這種情況下,可以調用索引頁http://localhost:8080/HelloWorldStruts2/index.action。下面檢查如何定義指數作爲一個動作:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"index\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/index.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"93:T46e6,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 本章將帶你通過一個Struts2應用程序所需的基本配置。在這裏,我們將看到在一些重要的配置文件,將配置文件:web.xml ,struts.xml,struts-config.xml和struts.properties\u003c/p\u003e \n\u003cp\u003e 使用web.xml和struts.xml的配置文件,並在前面的章節中,已經看到我們的例子中曾使用這兩個文件,讓我解釋以及其他文件。\u003c/p\u003e \n\u003ch2\u003e web.xml 文件:\u003c/h2\u003e \n\u003cp\u003e web.xml配置文件是一個J2EE的配置文件,決定如何處理元素的HTTP請求由servlet容器。嚴格來說它不是一個Struts2的配置文件,但它是Struts2的工作需要進行配置的文件。\u003c/p\u003e \n\u003cp\u003e 如前所述,這個文件爲任何Web應用程序提供了一個切入點。 Struts2 應用程序的入口點,將是一個部署描述符(web.xml)中定義的過濾器。因此,我們將定義在web.xml中的FilterDispatcher是類的項。需要創建的文件夾的WebContent/ WEB-INF下web.xml文件。\u003c/p\u003e \n\u003cp\u003e 這是第一個配置文件,將需要配置,如果沒有一個模板或工具,可生成(如Eclipse或Maven2的)的幫助下開始。以下是web.xml文件中的內容,我們用我們的最後一個例子。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 請注意,我們Struts 2的過濾器映射爲/*,\u0026nbsp;/*.action這意味着所有的URL將被解析struts的過濾器。我們將覆蓋時,我們將通過「註釋」一章。\u003c/p\u003e \n\u003ch2\u003e struts.xml 文件:\u003c/h2\u003e \n\u003cp\u003e struts.xml文件中包含的配置信息,將爲動作開發被修改。這個文件可以被用來覆蓋默認設置的應用程序,例如struts.devMode=false 和其他設置中定義的屬性文件。這個文件可以被文件夾WEB-INF/classes下創建\u0026nbsp;\u003c/p\u003e \n\u003cp\u003e 讓我們來看看在我們struts.xml文件中創建的Hello World的例子在前面的章節中解釋。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u0026lt;-- more actions can be listed here --\u0026gt;\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u0026lt;-- more packages can be listed here --\u0026gt;\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 首先要注意的是DOCTYPE。所有的Struts配置文件需要有正確的doctype所示,我們的小例子。 \u0026lt;struts\u0026gt;根標籤的元素,我們聲明不同的包使用\u0026lt;package\u0026gt;標籤。\u0026nbsp;\u0026lt;package\u0026gt;允許分離和模塊化的配置。這是非常有用的,當有一個大項目,項目被劃分成不同的模塊。\u003c/p\u003e \n\u003cp\u003e 也就是說,如果項目有三個域 - business_applicaiton ,customer_application 和 staff_application,可以創建三個包和存儲相關的動作,在適當的包。包裝標籤具有以下屬性:\u003c/p\u003e \n\u003ctable\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003cth\u003e 屬性\u003c/th\u003e \n \u003cth\u003e 描述\u003c/th\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e name (required)\u003c/td\u003e \n \u003ctd\u003e The unique identifier for the package\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e extends\u003c/td\u003e \n \u003ctd\u003e Which package does this package extend from? By default, we use struts-default as the base package.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e abstract\u003c/td\u003e \n \u003ctd\u003e If marked true, the package is not available for end user consumption.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e namesapce\u003c/td\u003e \n \u003ctd\u003e Unique namespace for the actions\u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n\u003c/table\u003e \n\u003cp\u003e 隨着name和value屬性恆定的標籤將被用於覆蓋default.properties中定義以下屬性,就像我們剛剛設置struts.devMode屬性。 Settingstruts.devMode屬性可以讓我們看到更多的調試消息,在日誌文件中。\u003c/p\u003e \n\u003cp\u003e 我們定義動作標記對應的每一個URL,我們要訪問,我們定義了一個類的execute()方法,將訪問時,我們將訪問相應的URL。\u003c/p\u003e \n\u003cp\u003e 結果決定得到執行動作後返回給瀏覽器。從操作返回的字符串應該是一個結果的名稱。以上,或者作爲一個「global」的結果,可包中的每一個動作,結果被配置每次動作。結果有可選的名稱和類型屬性。默認名稱的值是「success」。\u003c/p\u003e \n\u003cp\u003e 隨着時間的推移,struts.xml文件可以逐步擴展,打破它包是模塊化的方式之一,但Struts提供了另一種模塊化struts.xml文件。可以將文件分割爲多個XML文件,並以下列方式將它們導入。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;include\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003efile\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"my-struts1.xml\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;include\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003efile\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"my-struts2.xml\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 其他的配置文件,我們還沒有涉及到在struts-default.xml中。這個文件包含了Struts的標準配置設置,就不必去觸摸項目的這些99.99%設置。出於這個原因,我們不打算對這個文件介紹太多。如果有興趣,不妨看看到struts2的核心2.2.3.jar文件default.properties文件。\u003c/p\u003e \n\u003ch2\u003e struts-config.xml 文件:\u003c/h2\u003e \n\u003cp\u003e 在struts-config.xml 配置文件是在Web客戶端組件的視圖和模型之間的鏈接,但99.99%不會有觸碰這些設置在項目中。基本配置文件包含以下主要內容:\u003c/p\u003e \n\u003ctable\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003cth\u003e SN\u003c/th\u003e \n \u003cth\u003e 攔截\u0026nbsp;\u0026amp; 描述\u003c/th\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 1\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003estruts-config\u003c/b\u003e\u003cbr\u003e This is the root node of the configuration file.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 2\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eform-beans\u003c/b\u003e\u003cbr\u003e This is where you map your ActionForm subclass to a name. You use this name as an alias for your ActionForm throughout the rest of the struts-config.xml file, and even on your JSP pages.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 3\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eglobal forwards\u003c/b\u003e\u003cbr\u003e This section maps a page on your webapp to a name. You can use this name to refer to the actual page. This avoids hardcoding URLs on your web pages.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 4\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eaction-mappings\u003c/b\u003e\u003cbr\u003e This is where you declare form handlers and they are also known as\u0026nbsp;\u003cb\u003eaction mappings\u003c/b\u003e.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 5\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003econtroller\u003c/b\u003e\u003cbr\u003e This section configures Struts internals and rarely used in practical situations.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 6\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eplug-in\u003c/b\u003e\u003cbr\u003e This section tells Struts where to find your properties files, which contain prompts and error messages\u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n\u003c/table\u003e \n\u003cp\u003e 下面是示例struts-config.xml文件:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts-config PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 1.0//EN\"\r\n\"http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts-config\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"com\"\u003e\u0026lt;!-- ========== Form Bean Definitions ============ --\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;form-beans\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;form-bean\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"login\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"test.struts.LoginForm\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/form-beans\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"com\"\u003e\u0026lt;!-- ========== Global Forward Definitions ========= --\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;global-forwards\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/global-forwards\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"com\"\u003e\u0026lt;!-- ========== Action Mapping Definitions ======== --\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action-mappings\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003epath\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"/login\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"test.struts.LoginAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;forward\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"valid\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003epath\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"/jsp/MainMenu.jsp\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;forward\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"invalid\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003epath\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"/jsp/LoginView.jsp\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action-mappings\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"com\"\u003e\u0026lt;!-- ========== Controller Definitions ======== --\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;controller\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003econtentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"text/html;charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003edebug\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emaxFileSize\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"1.618M\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003elocale\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003enocache\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts-config\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e struts-config.xml文件的更多詳細信息,請查看 Struts 文檔。\u003c/p\u003e \n\u003ch2\u003e struts.properties 文件\u003c/h2\u003e \n\u003cp\u003e 此配置文件提供了一種機制來改變框架的默認行爲。 struts.properties配置文件內包含的屬性其實也可以被配置在web.xml中使用init-param中,以及在struts.xml的配置文件中使用恆定的標籤。但如果喜歡保持獨立和特定Struts,那麼可以創建這個文件的文件夾下的WEB-INF/classes。\u003c/p\u003e \n\u003cp\u003e 在這個文件中配置的值將覆蓋默認值配置default.properties這是包含在struts2-core-x.y.z.jar\u0026nbsp;分佈。有幾個的屬性,可能會考慮改變使用struts.properties文件:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"com\"\u003e### When set to true, Struts will act much more friendly for developers\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\nstruts\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003edevMode \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003etrue\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"com\"\u003e### Enables reloading of internationalization files\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\nstruts\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ei18n\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ereload \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003etrue\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"com\"\u003e### Enables reloading of XML configuration files\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\nstruts\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003econfiguration\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exml\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ereload \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003etrue\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"com\"\u003e### Sets the port that the server is run on\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\nstruts\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eurl\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ehttp\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eport \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"lit\"\u003e8080\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 這裏井號(#)開頭的行會被假定作爲註釋,它將被Struts 2忽略。\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"94:T6849,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 動作是Struts2框架的核心,因爲他們的任何MVC(模型 - 視圖 - 控制器)框架。每個URL將被映射到一個特定的動作,它提供了來自用戶的請求提供服務所需的處理邏輯。\u003c/p\u003e \n\u003cp\u003e 但動作也提供其他兩個重要的能力。首先,操作從請求數據的傳輸中起着重要的作用,通過向視圖,無論是一個JSP或其它類型的結果。二,動作必須協助的框架,在確定結果應該渲染視圖,在響應該請求將被退回。\u003c/p\u003e \n\u003ch2\u003e 創建動作:\u003c/h2\u003e \n\u003cp\u003e 在Struts2的動作,唯一的要求是必須有一個無參數的方法返回String或結果的對象,必須是一個POJO。如果不帶參數的方法是不指定,則默認動作是使用execute()方法。\u003c/p\u003e \n\u003cp\u003e 也可以選擇擴展ActionSupport類實現了6個接口,包括動作界面。動作界面如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003einterface\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eAction\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003estatic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003efinal\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003estatic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003efinal\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e NONE \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"none\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003estatic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003efinal\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e ERROR \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"error\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003estatic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003efinal\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e INPUT \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"input\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003estatic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003efinal\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e LOGIN \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"login\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 讓我們來看看Hello World示例的操作方法:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHelloWorldAction\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 爲了說明這一點,操作方法控制視圖,讓我們做出以下更改執行方法和擴展類ActionSupport 如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHelloWorldAction\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eif\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"SECRET\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eequals\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e))\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"kwd\"\u003eelse\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e ERROR\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在這個例子中,我們有一些在execute方法的邏輯來看待的name屬性。如果屬性等於字符串「SECRET」,我們返回SUCCESS\u0026nbsp;的結果,否則我們返回ERROR\u0026nbsp;的結果。因爲我們已經擴展ActionSupport,所以我們可以使用字符串常量的成功和錯誤。現在,讓我們修改我們的struts.xml文件如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"error\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/AccessDenied.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建視圖\u003c/h2\u003e \n\u003cp\u003e 讓我們創建以下JSP文件 helloWorld.jsp 的WebContent文件夾在eclipse項目。要做到這一點,右鍵單擊WebContent文件夾在項目資源管理器,選擇New \u0026gt;JSP File。該文件將要求返回的結果是SUCCESS,這是一個字符串常量「success」的定義在動作界面:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Hello World, \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 以下是由框架的動作的結果將被調用的文件,該文件是等於字符串常量「錯誤」的ERROR\u0026nbsp;。以下是AccessDenied.jsp 的內容\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eAccess Denied\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n You are not authorized to view this page.\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 我們還需要在WebContent文件夾中創建index.jsp。該文件將作爲初始動作URL,用戶可以直接點擊告訴Struts 2框架調用HelloWorldAction類的 execute方法,並呈現 helloWorld.jsp視圖。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n pageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n \u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;h1\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World From Struts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/h1\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;form\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;label\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003efor\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003ePlease enter your name\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/label\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"text\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"submit\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Say Hello\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 就是這樣,不需要改變的web.xml文件,所以讓我們用同一個web.xml,是之前我們已經創建了範例章。現在,我們已經準備好運行使用Struts 2框架的 Hello World應用程序。\u003c/p\u003e \n\u003ch2\u003e 執行應用程序\u003c/h2\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊\u0026nbsp;Export \u0026gt; WAR File\u0026nbsp;創建一個WAR文件。然後在Tomcat 的webapps目錄下部署這個WAR。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Hello World Input\" src=\"https://asset.1ju.org/cmsstatic/struts2-hello-world-3.jpg\"\u003e \n\u003cp\u003e 讓我們爲「SECRET」,並輸入一個字,應該看到以下頁面:\u003c/p\u003e \n\u003cimg alt=\"Success Result\" src=\"https://asset.1ju.org/cmsstatic/-1.jpg\"\u003e \n\u003cp\u003e 現在輸入任何單詞而非「SECRET」,應該看到以下頁面:\u0026nbsp;\u003c/p\u003e \n\u003cimg alt=\"Access Denied Result\" src=\"https://asset.1ju.org/cmsstatic/-2.jpg\"\u003e \n\u003ch2\u003e 建立多個動作:\u003c/h2\u003e \n\u003cp\u003e 經常會定義一個以上的動作,以處理不同的請求,並提供不同的用戶的URL,因此可以定義不同的類定義如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eMyAction\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003estatic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e GOOD \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003estatic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e BAD \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e ERROR\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHelloWorld\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e...\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eif\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"SECRET\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eequals\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e))\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eMyAction\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eGOOD\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eMyAction\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eBAD\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e...\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eSomeOtherClass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e...\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eMyAction\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eGOOD\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e...\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在struts.xml文件中配置這些操作如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\nstruts\u0026gt;\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"error\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/AccessDenied.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"something\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.SomeOtherClass\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/Something.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"error\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/AccessDenied.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 正如看到在上述假設的例子,動作的結果是重複的SUCCESS和ERROR。要解決這個問題,建議創建一個類包含結果的結果。\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"95:T84e9,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 攔截器的概念是Servlet過濾器或JDK代理類一樣的。攔截器允許橫切功能分開實現的動作,以及框架。使用攔截器,可以實現如下:\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e 提供預處理行動之前被稱爲邏輯。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 提供後處理邏輯動作後被調用\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 捕獲異常,這樣可以進行替代處理。\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e Struts2框架提供的許多功能都使用攔截實現的例子包括異常處理,文件上傳,生命週期回調和驗證等事實上作爲Struts2的基礎,其功能攔截,這可能有7或8攔截器分配給每個動作。\u003c/p\u003e \n\u003ch2\u003e Struts2框架的攔截器:\u003c/h2\u003e \n\u003cp\u003e Struts 2框架提供了良好的箱攔截列表來預先設定的,並準備使用。下面列出了幾個重要的攔截:\u003c/p\u003e \n\u003ctable\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003cth\u003e SN\u003c/th\u003e \n \u003cth\u003e 攔截器\u0026nbsp;\u0026amp; 描述\u003c/th\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 1\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003ealias\u003c/b\u003e\u003cbr\u003e Allows parameters to have different name aliases across requests.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 2\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003echeckbox\u003c/b\u003e\u003cbr\u003e Assists in managing check boxes by adding a parameter value of false for check boxes that are not checked.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 3\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003econversionError\u003c/b\u003e\u003cbr\u003e Places error information from converting strings to parameter types into the action's field errors.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 4\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003ecreateSession\u003c/b\u003e\u003cbr\u003e Automatically creates an HTTP session if one does not already exist.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 5\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003edebugging\u003c/b\u003e\u003cbr\u003e Provides several different debugging screens to the developer.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 6\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eexecAndWait\u003c/b\u003e\u003cbr\u003e Sends the user to an intermediary waiting page while the action executes in the background.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 7\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eexception\u003c/b\u003e\u003cbr\u003e Maps exceptions that are thrown from an action to a result, allowing automatic exception handling via redirection.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 8\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003efileUpload\u003c/b\u003e\u003cbr\u003e Facilitates easy file uploading.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 9\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003ei18n\u003c/b\u003e\u003cbr\u003e Keeps track of the selected locale during a user's session.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 10\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003elogger\u003c/b\u003e\u003cbr\u003e Provides simple logging by outputting the name of the action being executed.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 11\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eparams\u003c/b\u003e\u003cbr\u003e Sets the request parameters on the action.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 12\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eprepare\u003c/b\u003e\u003cbr\u003e This is typically used to do pre-processing work, such as setup database connections.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 13\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eprofile\u003c/b\u003e\u003cbr\u003e Allows simple profiling information to be logged for actions.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 14\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003escope\u003c/b\u003e\u003cbr\u003e Stores and retrieves the action's state in the session or application scope.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 15\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eServletConfig\u003c/b\u003e\u003cbr\u003e Provides the action with access to various servlet-based information.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 16\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003etimer\u003c/b\u003e\u003cbr\u003e Provides simple profiling information in the form of how long the action takes to execute.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 17\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003etoken\u003c/b\u003e\u003cbr\u003e Checks the action for a valid token to prevent duplicate formsubmission.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 18\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003evalidation\u003c/b\u003e\u003cbr\u003e Provides validation support for actions\u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n\u003c/table\u003e \n\u003cp\u003e 請看Struts 2文檔的完整細節上面提到的攔截。會告訴如何使用Struts應用程序在一個攔截器。\u003c/p\u003e \n\u003ch2\u003e 如何使用攔截器?\u003c/h2\u003e \n\u003cp\u003e 讓我們來看看如何使用已有的攔截,我們的「Hello World」程序。我們將使用計時器來測量過了多長時間執行操作方法,其目的是攔截。同時使用params攔截器,其目的是發送請求參數的動作。您可以嘗試不使用這個攔截您的示例中會發現,沒有被設置name屬性,因爲參數是無法達到動作。\u003c/p\u003e \n\u003cp\u003e 我們將繼續HelloWorldAction.java,web.xml 的helloWorld.jsp 和 index.jsp 文件,因爲他們已經建立了範例章節,但讓我們如下修改struts.xml文件,添加一個攔截器\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;interceptor-ref\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"params\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;interceptor-ref\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"timer\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊\u0026nbsp;Export \u0026gt; WAR File\u0026nbsp;創建一個WAR文件。然後部署在Tomcat 的webapps目錄下這個WAR。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給你以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Hello World Input\" src=\"https://asset.1ju.org/cmsstatic/struts2-hello-world-3.jpg\"\u003e \n\u003cp\u003e 現在,在給定的文本框中輸入單詞,並單擊「Say Hello按鈕執行已定義的動作。現在,如果將檢查生成的日誌,會發現下面的文字:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \r\nINFO\u003c/span\u003e\u003cspan class=\"pun\"\u003e:\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eServer\u003c/span\u003e\u003cspan class=\"pln\"\u003e startup \u003c/span\u003e\u003cspan class=\"kwd\"\u003ein\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"lit\"\u003e3539\u003c/span\u003e\u003cspan class=\"pln\"\u003e ms\r\n\u003c/span\u003e\u003cspan class=\"lit\"\u003e27\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"lit\"\u003e08\u003c/span\u003e\u003cspan class=\"pun\"\u003e/\u003c/span\u003e\u003cspan class=\"lit\"\u003e2011\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"lit\"\u003e8\u003c/span\u003e\u003cspan class=\"pun\"\u003e:\u003c/span\u003e\u003cspan class=\"lit\"\u003e40\u003c/span\u003e\u003cspan class=\"pun\"\u003e:\u003c/span\u003e\u003cspan class=\"lit\"\u003e53\u003c/span\u003e\u003cspan class=\"pln\"\u003e PM \r\ncom\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003elogging\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ecommons\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eCommonsLogger\u003c/span\u003e\u003cspan class=\"pln\"\u003e info\r\nINFO\u003c/span\u003e\u003cspan class=\"pun\"\u003e:\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eExecuted\u003c/span\u003e\u003cspan class=\"pln\"\u003e action \u003c/span\u003e\u003cspan class=\"pun\"\u003e[\u003c/span\u003e\u003cspan class=\"com\"\u003e//hello!execute] took 109 ms.\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 這裏底行,正在生成因爲這告訴動作發生要執行的總共爲 109ms定時器的攔截器。\u003c/p\u003e \n\u003ch2\u003e 創建自定義的攔截器\u003c/h2\u003e \n\u003cp\u003e 在應用程序中使用自定義的攔截器是一種優雅的方式提供橫切的應用功能。創建一個自定義攔截器是很容易的,需要擴展的接口,下面的Interceptor接口:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003einterface\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eInterceptor\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eSerializable\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e destroy\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e init\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e intercept\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionInvocation\u003c/span\u003e\u003cspan class=\"pln\"\u003e invocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 正如其名稱所表明的,init()方法提供了一種方法來初始化攔截器,並destroy()\u0026nbsp;方法提供了一種工具攔截清理。不同的行動,攔截被重用跨請求和需要是線程安全的,尤其是intercept()\u0026nbsp;方法。\u0026nbsp;\u003c/p\u003e \n\u003cp\u003e ActionInvocation對象可以訪問運行時環境。它允許訪問的動作本身和方法調用的動作,並確定動作是否已被調用。\u003c/p\u003e \n\u003cp\u003e 如果不需要初始化或清除代碼,可以擴展AbstractInterceptor類。這提供了一個默認的無操作實現的init()和 destroy()方法。\u003c/p\u003e \n\u003ch2\u003e 創建攔截器類:\u003c/h2\u003e \n\u003cp\u003e 讓我們創建Java資源 MyInterceptor.java\u0026gt; src 文件夾:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.*;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionInvocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003einterceptor\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eAbstractInterceptor\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eMyInterceptor\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eAbstractInterceptor\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e intercept\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionInvocation\u003c/span\u003e\u003cspan class=\"pln\"\u003e invocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"com\"\u003e/* let us do some pre-processing */\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e output \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"Pre-Processing\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"kwd\"\u003eout\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eprintln\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003eoutput\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"com\"\u003e/* let us call action or next interceptor */\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e result \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e invocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003einvoke\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"com\"\u003e/* let us do some post-processing */\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n output \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"Post-Processing\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"kwd\"\u003eout\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eprintln\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003eoutput\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e result\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 就像看到的,實際行動將使用攔截器執行invocation.invoke()調用。所以,可以做一些前處理和一些處理後,根據需要。\u003c/p\u003e \n\u003cp\u003e 該框架本身啓動的過程中,在第一次調用ActionInvocation對象的invoke()。每次\u0026nbsp;invoke()被調用,ActionInvocation的諮詢的狀態和執行爲準攔截接下來。通過請求流以下數據圖顯示了相同的概念:\u003c/p\u003e \n\u003cimg alt=\"ActionInvocation\" src=\"https://asset.1ju.org/cmsstatic/struts2-12.jpg\"\u003e \n\u003ch2\u003e 創建動作類:\u003c/h2\u003e \n\u003cp\u003e 讓我們創建一個Java文件HelloWorldAction.java的Java下Java Resources \u0026gt; src下面給出的內容包名爲 com.yiibai.struts2。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHelloWorldAction\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"kwd\"\u003eout\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eprintln\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Inside action....\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在前面的例子中,我們已經看到,這是一個相同的類。我們有標準的「名稱」屬性的getter和setter方法​​,並返回字符串「success」的執行方法。\u003c/p\u003e \n\u003ch2\u003e 創建視圖\u003c/h2\u003e \n\u003cp\u003e 讓我們創建以下JSP文件helloWorld.jsp,在eclipse項目在WebContent文件夾。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Hello World, \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建頁面:\u003c/h2\u003e \n\u003cp\u003e 我們還需要在WebContent文件夾中創建 index.jsp。該文件將作爲初始動作URL,用戶可以在其中點擊告訴Struts 2框架調用 HelloWorldAction類定義的方法呈現 helloWorld.jsp視圖。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n pageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n \u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;h1\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World From Struts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/h1\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;form\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;label\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003efor\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003ePlease enter your name\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/label\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"text\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"submit\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Say Hello\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e Hello 動作定義在上面的視圖文件將被映射到HelloWorldAction類和其執行方法使用struts.xml文件。\u003c/p\u003e \n\u003ch2\u003e 配置文件\u003c/h2\u003e \n\u003cp\u003e 現在,我們需要註冊我們的攔截器,然後調用它默認的攔截器在前面的例子中調用。要註冊一個新定義的攔截,直接放在的\u0026lt;interceptors\u0026gt;...\u0026lt;/interceptors\u0026gt;標籤下\u0026lt;package\u0026gt;的標籤插件struts.xml文件。您可以跳過這一步爲默認的攔截器,就像我們在我們前面的例子。但在這裏,讓我們註冊和使用它,如下所示:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;interceptors\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;interceptor\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myinterceptor\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.MyInterceptor\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/interceptors\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;interceptor-ref\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"params\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;interceptor-ref\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myinterceptor\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 應該指出的是,可以註冊多個攔截器\u0026lt;package\u0026gt;標籤內,同一時間,可以調用多個攔截裏面的\u0026lt;action\u0026gt;標籤。可以調用相同的攔截器與不同的動作。\u0026nbsp;\u003c/p\u003e \n\u003cp\u003e web.xml文件需要在 WEB-INF文件夾下創建 WebContent 如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊\u0026nbsp;\u0026nbsp;Export \u0026gt; WAR File\u0026nbsp;文件創建一個WAR文件。然後部署在Tomcat 的webapps目錄下這個WAR。最後,啓動Tomcat 服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給你以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Hello World Input\" src=\"https://asset.1ju.org/cmsstatic/struts2-hello-world-3.jpg\"\u003e \n\u003cp\u003e 現在,在給定的文本框中輸入任何單詞,並單擊「Say Hello「 按鈕執行已定義的動作。現在,如果檢查生成的日誌,會發現下面的文本下方:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \r\n\u003c/span\u003e\u003cspan class=\"typ\"\u003ePre\u003c/span\u003e\u003cspan class=\"pun\"\u003e-\u003c/span\u003e\u003cspan class=\"typ\"\u003eProcessing\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"typ\"\u003eInside\u003c/span\u003e\u003cspan class=\"pln\"\u003e action\u003c/span\u003e\u003cspan class=\"pun\"\u003e....\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"typ\"\u003ePost\u003c/span\u003e\u003cspan class=\"pun\"\u003e-\u003c/span\u003e\u003cspan class=\"typ\"\u003eProcessing\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 堆疊多個攔截器:\u003c/h2\u003e \n\u003cp\u003e 可以想像,配置多個攔截器每個動作很快就會變得非常難以控制。出於這個原因,攔截器與攔截器棧管理。下面是一個例子,直接從在struts-default.xml文件:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;interceptor-stack\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"basicStack\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;interceptor-ref\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"exception\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;interceptor-ref\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"servlet-config\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;interceptor-ref\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"prepare\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;interceptor-ref\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"checkbox\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;interceptor-ref\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"params\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;interceptor-ref\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"conversionError\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/interceptor-stack\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 上面的棧被調用basicStack,可用於在配置中,如下所示。此配置節點放置在\u0026lt;package.../\u0026gt;節點下。每個\u0026lt;interceptor-ref.../\u0026gt;標記引用一個攔截器或攔截器棧已配置在當前的攔截器棧。因此,這是非常重要的,以確保該名稱是唯一的所有攔截器和攔截器棧配置配置初始的攔截器和攔截器棧時。\u0026nbsp;\u003c/p\u003e \n\u003cp\u003e 我們已經看到了如何應用攔截的動作,將攔截器棧是沒有什麼不同。事實上,我們完全使用相同的標籤:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.MyAction\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;interceptor-ref\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"basicStack\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eview.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u0026lt;/action\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 上述註冊的「basicStack」所有6個攔截器完成註冊的棧\u0026nbsp;Hello 動作。應該指出的是,攔截器執行的順序在配置中。例如,在上述情況下,異常將被執行,servlet 配置等。\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"96:T2462,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 正如前面提到的,\u0026lt;results\u0026gt;標籤在Struts2的MVC框架的視圖中所扮演的角色。動作是負責執行業務邏輯。執行業務邏輯後,接下來的步驟是使用\u0026lt;results\u0026gt;標籤顯示的視圖。\u0026nbsp;\u003c/p\u003e \n\u003cp\u003e 經常有一些附帶導航規則的結果。例如,如果在操作方法是對用戶進行驗證,有三種可能的結果。 (一)成功登錄;(二)不成功的登錄,用戶名或密碼錯誤;(三)帳戶鎖定。\u003c/p\u003e \n\u003cp\u003e 在這種情況下的動作方法將被配置呈現的結果有三種可能的結果字符串和三個不同的看法。我們已經看到在前面的例子。\u003c/p\u003e \n\u003cp\u003e 但是,Struts2 不配合使用JSP作爲視圖技術。畢竟MVC範例的整個目的是保持獨立的層,高度可配置的。例如,對於一個Web2.0的客戶端,可能希望返回XML或JSON作爲輸出。在這種情況下,可以創建一個新的結果類型爲XML或JSON和實現這一目標。\u003c/p\u003e \n\u003cp\u003e Struts的一些預定義的結果類型,無論我們已經看到了,這是默認的結果類型,它是用來調度調度到\u003ca href=\"http://www,yiibai.com/jsp/\"\u003eJSP\u003c/a\u003e頁面。 Struts 允許使用其它標記語言的技術呈現的結果和流行的選擇,包括\u0026nbsp;Velocity, Freemaker, XSLT\u0026nbsp;和Tiles.\u003c/p\u003e \n\u003ch2\u003e 分發結果類型:\u003c/h2\u003e \n\u003cp\u003e 調度程序的結果類型是缺省類型,並使用,如果沒有其他的結果類型被指定。它被用來轉發到一個servlet,JSP,\u003ca href=\"http://www,yiibai.com/html/\"\u003eHTML\u003c/a\u003e頁面,等等,在服務器上。它使用RequestDispatcher.forward()方法。\u003c/p\u003e \n\u003cp\u003e 在我們前面的例子中,我們看到了「shorthand」的版本,在那裏我們提供了身體的結果標籤 JSP路徑。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n /HelloWorld.jsp\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 我們也可以指定JSP文件中使用一個\u0026lt;param name=\"location\"\u0026gt;的標籤內\u0026lt;result...\u0026gt;的元素如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"dispatcher\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"location\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n /HelloWorld.jsp\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 我們還可以提供一個分析參數,默認爲true。解析參數位置參數決定是否將被解析爲OGNL表達式。\u003c/p\u003e \n\u003ch2\u003e FreeMaker結果類型:\u003c/h2\u003e \n\u003cp\u003e 在這個例子中,我們將看到我們如何使用FreeMaker作爲視圖技術。 freemaker是一種流行的模板引擎,用於使用預定義的模板來生成輸出。讓我們Freemaker模板創建一個文件稱爲hello.fm以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"typ\"\u003eHello\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eWorld\u003c/span\u003e\u003cspan class=\"pln\"\u003e $\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在這裏,上述文件是一個模板的名字是從外面使用已定義的動作,將傳遞一個參數置。會保持這個文件在CLASSPATH中。接下來,讓我們修改struts.xml中指定結果如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"freemarker\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"location\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/hello.fm\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 讓我們使用前面的 HelloWorldAction.java,HelloWorldAction.jsp和index.jsp文件。現在右鍵點擊項目名稱,並單擊Export \u0026gt; WAR File創建一個WAR文件。然後部署這個WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給出以下畫面:\u0026nbsp;\u003c/p\u003e \n\u003cimg alt=\"Hello World Input\" src=\"https://asset.1ju.org/cmsstatic/struts2-hello-world-3.jpg\"\u003e \n\u003cp\u003e 輸入一個值「Struts2」,並提交頁面。應該看到翻頁\u003c/p\u003e \n\u003cimg alt=\"Hello World Result\" src=\"https://asset.1ju.org/cmsstatic/struts2-hello-world-4.jpg\"\u003e \n\u003cp\u003e 正如看到,這是完全一樣的JSP視圖,但我們是不依賴於使用JSP作爲視圖技術。在這個例子中,我們已經使用Freemaker。\u003c/p\u003e \n\u003ch2\u003e 重定向結果類型:\u003c/h2\u003e \n\u003cp\u003e 重定向的結果類型,調用的是標準response.sendRedirect() 方法,使瀏覽器建立一個新的請求發送到給定的位置。\u003c/p\u003e \n\u003cp\u003e 我們可以提供無論是在體內的\u0026lt;result...\u0026gt;元素或作爲一個\u0026lt;param name=\"location\"\u0026gt;的元素的位置。還支持重定向解析參數。下面是一個例子使用XML配置:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"redirect\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"location\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n /NewWorld.jsp\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 因此,只要修改struts.xml文件,定義如上所述重定向類型,並創建一個新的文件,在那裏會被重定向 Hello時動作將返回成功到NewWorld.jpg。也可以checkStruts2 重定向操作的例子,爲了更好的理解。\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"97:T5b1d,"])</script><script>self.__next_f.push([1,"\u003ch2\u003e 值棧:\u003c/h2\u003e \n\u003cp\u003e 值棧是一個集合中的幾個對象保持下列對象提供的順序:\u003c/p\u003e \n\u003ctable\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003cth\u003e SN\u003c/th\u003e \n \u003cth\u003e 對象\u0026amp; 描述\u003c/th\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 1\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eTemporary Objects\u003c/b\u003e\u003cbr\u003e There are various temporary objects which are created during execution of a page. For example the current iteration value for a collection being looped over in a JSP tag.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 2\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eThe Model Object\u003c/b\u003e\u003cbr\u003e If you are using model objects in your struts application, the current model object is placed before the action on the value stack\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 3\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eThe Action Object\u003c/b\u003e\u003cbr\u003e This will be the current action object which is being executed.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 4\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eNamed Objects\u003c/b\u003e\u003cbr\u003e These objects include #application, #session, #request, #attr and #parameters and refer to the corresponding servlet scopes\u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n\u003c/table\u003e \n\u003cp\u003e 值棧可以通過JSP,Velocity或者Freemarker的標籤。有各種不同的標籤在單獨的章節中,我們將學習,用於獲取和設置Struts 2.0 的值棧。 ValueStack的對象裏面可以得到動作如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"typ\"\u003eActionContext\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egetContext\u003c/span\u003e\u003cspan class=\"pun\"\u003e().\u003c/span\u003e\u003cspan class=\"pln\"\u003egetValueStack\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 一旦擁有了值對象,就可以用下面的方法來操縱該對象:\u003c/p\u003e \n\u003ctable\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003cth\u003e SN\u003c/th\u003e \n \u003cth\u003e ValueStack的方法及說明\u003c/th\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 1\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eObject findValue(String expr)\u003c/b\u003e\u003cbr\u003e Find a value by evaluating the given expression against the stack in the default search order.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 2\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eCompoundRoot getRoot()\u003c/b\u003e\u003cbr\u003e Get the CompoundRoot which holds the objects pushed onto the stack.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 3\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eObject peek()\u003c/b\u003e\u003cbr\u003e Get the object on the top of the stack without changing the stack.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 4\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eObject pop()\u003c/b\u003e\u003cbr\u003e Get the object on the top of the stack and remove it from the stack.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 5\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003evoid push(Object o)\u003c/b\u003e\u003cbr\u003e Put this object onto the top of the stack.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 6\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003evoid set(String key, Object o)\u003c/b\u003e\u003cbr\u003e Sets an object on the stack with the given key so it is retrievable by findValue(key,...)\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 7\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003evoid setDefaultType(Class defaultType)\u003c/b\u003e\u003cbr\u003e Sets the default type to convert to if no type is provided when getting a value.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 8\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003evoid setValue(String expr, Object value)\u003c/b\u003e\u003cbr\u003e Attempts to set a property on a bean in the stack with the given expression using the default search order.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 9\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003eint size()\u003c/b\u003e\u003cbr\u003e Get the number of objects in the stack.\u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n\u003c/table\u003e \n\u003ch2\u003e OGNL:\u003c/h2\u003e \n\u003cp\u003e 對象圖形導航語言(OGNL)是一個功能強大的表達式語言是用來參考值棧上的數據和操縱。 OGNL也有助於在數據傳輸和類型轉換。\u003c/p\u003e \n\u003cp\u003e OGNL和JSP表達式語言很相似。 OGNL 基礎的理念是在 root或默認的對象範圍內。默認或根對象的屬性,可以參考使用的標記符號(井號)。\u003c/p\u003e \n\u003cp\u003e 如前所述,OGNL是基於上下文和Struts的構建ActionContext 使用OGNL映射。ActionContext中映射包括以下:\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e application\u0026nbsp;- 應用範圍的變量\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e session\u0026nbsp;- 會話範圍的變量\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e root / value stack\u0026nbsp;- 所有操作變量都保存在這裏\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e request\u0026nbsp;- 請求範圍的變量\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e parameters\u0026nbsp;- 請求參數\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e atributes\u0026nbsp;-\u0026nbsp;存儲的屬性頁面,請求,會話和應用範圍\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e 重要的是要明白,操作對象是始終可用值棧中的。所以,因此,如果動作對象的屬性x和y有隨時供使用。\u003c/p\u003e \n\u003cp\u003e 在ActionContext中的對象被稱爲使用井號的符號,但是,值棧中的對象可以被直接引用,例如,如果員工是一個動作類的屬性,那麼就可以得到如下參考:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 來代替\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"#name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 如果會話中有一個屬性叫做「login」,可以找回如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"#session.login\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e OGNL還支持處理的集合 - 即映射,List和Set。例如,以顯示顏色的下拉列表,可以這樣做:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:select\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"color\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elist\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"{'red','yellow','green'}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 本OGNL表達式是巧妙地的解釋\u0026nbsp;\"red\",\"yellow\",\"green\"爲顏色,並此基礎上建立一個列表。\u0026nbsp;\u003c/p\u003e \n\u003cp\u003e OGNL表達式將被廣泛使用時,在接下來的章節中,我們將研究不同的標籤。因此,讓我們來看看它使用的一些例子在Form標籤/標籤/數據標籤控制和Ajax標籤。\u003c/p\u003e \n\u003ch2\u003e ValueStack/OGNL 例子:\u003c/h2\u003e \n\u003ch3\u003e 創建動作:\u003c/h3\u003e \n\u003cp\u003e 讓我們考慮以下動作類,當我們訪問值棧,然後設置幾個鍵,我們將在視圖,即訪問使用OGNL,JSP頁面。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.*;\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eValueStack\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionContext\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHelloWorldAction\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eValueStack\u003c/span\u003e\u003cspan class=\"pln\"\u003e stack \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionContext\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egetContext\u003c/span\u003e\u003cspan class=\"pun\"\u003e().\u003c/span\u003e\u003cspan class=\"pln\"\u003egetValueStack\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eMap\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eObject\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e context \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHashMap\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eObject\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026gt;();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n context\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eput\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"key1\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"This is key1\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n context\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eput\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"key2\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"This is key2\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n stack\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003epush\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003econtext\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"kwd\"\u003eout\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eprintln\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Size of the valueStack: \"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e+\u003c/span\u003e\u003cspan class=\"pln\"\u003e stack\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esize\u003c/span\u003e\u003cspan class=\"pun\"\u003e());\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 其實,Struts 2的值棧的頂部增加了動作時執行。所以,通常的方法是把東西值棧添加 getter/setter方法以使這些值在Action類,然後使用\u0026lt;s:property\u0026gt;標籤來訪問值。以下是展示如何在struts ActionContext 中 ValueStack \u0026nbsp;工作。\u003c/p\u003e \n\u003ch3\u003e 創建視圖\u003c/h3\u003e \n\u003cp\u003e 讓我們創建以下JSP文件 helloWorld.jsp 的要 WebContent 文件夾。這個視圖將被顯示動作返回「success」:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Entered value : \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Value of key 1 : \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"key1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Value of key 2 : \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"key2\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 我們還需要創建的index.jsp在WebContent文件夾,其內容如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n pageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n \u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;h1\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World From Struts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/h1\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;form\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;label\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003efor\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003ePlease enter your name\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/label\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"text\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"submit\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Say Hello\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch3\u003e 配置文件\u003c/h3\u003e \n\u003cp\u003e 以下是struts.xml文件的內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 以下是web.xml文件中的內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊Export \u0026gt; WAR File創建一個WAR文件。然後將此WAR 部署在Tomcat 的 webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。如以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Hello World Input\" src=\"https://asset.1ju.org/cmsstatic/struts2-hello-world-3.jpg\"\u003e \n\u003cp\u003e 現在在給定的文本框中輸入任何單詞,然後點擊\"Say Hello\"按鈕執行已定義的動作。現在,如果檢查生成的日誌,會發現下面的文本底部:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \r\n\u003c/span\u003e\u003cspan class=\"typ\"\u003eSize\u003c/span\u003e\u003cspan class=\"pln\"\u003e of the valueStack\u003c/span\u003e\u003cspan class=\"pun\"\u003e:\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"lit\"\u003e3\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 這將顯示以下畫面,這將顯示任何的值,將進入值爲key1和key2,我們已經把它們放入 ValueStack。\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"98:T675e,"])</script><script>self.__next_f.push([1,"\u003cp\u003e Struts 2框架提供了內置支持處理文件上傳使用基於HTML表單的文件上傳。上傳一個文件時,它通常會被存儲在一個臨時目錄中,他們應該由Action類進行處理或移動到一個永久的目錄,以確保數據不丟失。\u003c/p\u003e \n\u003cp\u003e \u003cb\u003e請注意,服務器\u003c/b\u003e\u003cb\u003e有一個安全策略\u003c/b\u003e\u003cb\u003e可能會禁止寫到目錄以外的臨時目錄和屬於web應用的目錄。\u003c/b\u003e\u003c/p\u003e \n\u003cp\u003e 在Struts中的文件上傳是通過預先定義的攔截文件上傳攔截器這是可通過org.apache.struts2.interceptor.FileUploadInterceptor類的defaultStack中的一部分。仍然可以使用在struts.xml中設置各種參數,我們將在下面看到。\u003c/p\u003e \n\u003ch2\u003e 創建視圖文件:\u003c/h2\u003e \n\u003cp\u003e 讓我們開始創建我們認爲這將需要瀏覽和上傳選定的文件。因此,讓我們創建一個純HTML上傳表單,允許用戶上傳文件 index.jsp:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\npageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eFile Upload\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;form\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"upload\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"post\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eenctype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"multipart/form-data\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;label\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003efor\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myFile\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eUpload your file\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/label\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"file\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myFile\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"submit\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Upload\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在上面的例子中值得注意幾點說明。首先,表單的enctype屬性設置爲multipart/ form-data。這應該是設置爲使得處理文件上傳文件上傳。下一個點值得注意的是表單的 action方法上傳和文件上傳字段的名稱 - myFile。我們需要這些信息創建操作方法和struts配置。\u003c/p\u003e \n\u003cp\u003e 接下來讓我們創建一個簡單的 jsp 文件的success.jsp 結果顯示我們的文件上傳的情況下成功。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eFile Upload Success\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\nYou have successfully uploaded \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myFileFileName\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 下面將結果文件error.jsp 可能會有一些錯誤,在上傳文件:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eFile Upload Error\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\nThere has been an error in uploading the file.\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建action類:\u003c/h2\u003e \n\u003cp\u003e 接下來讓我們創建一個Java類稱爲 uploadFile.java 這會處理上傳文件,該文件存儲在一個安全的位置:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eio\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eFile\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e org\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eapache\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ecommons\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eio\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eFileUtils\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eio\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eIOException\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e uploadFile \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eFile\u003c/span\u003e\u003cspan class=\"pln\"\u003e myFile\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e myFileContentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e myFileFileName\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e destPath\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"com\"\u003e/* Copy file to a safe location */\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n destPath \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"C:/apache-tomcat-6.0.33/work/\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003etry\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \t \u003c/span\u003e\u003cspan class=\"typ\"\u003eSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"kwd\"\u003eout\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eprintln\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Src File name: \"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e+\u003c/span\u003e\u003cspan class=\"pln\"\u003e myFile\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \t \u003c/span\u003e\u003cspan class=\"typ\"\u003eSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"kwd\"\u003eout\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eprintln\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Dst File name: \"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e+\u003c/span\u003e\u003cspan class=\"pln\"\u003e myFileFileName\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \t \t \r\n \t \u003c/span\u003e\u003cspan class=\"typ\"\u003eFile\u003c/span\u003e\u003cspan class=\"pln\"\u003e destFile \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eFile\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003edestPath\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e myFileFileName\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \t \u003c/span\u003e\u003cspan class=\"typ\"\u003eFileUtils\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ecopyFile\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003emyFile\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e destFile\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"kwd\"\u003ecatch\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eIOException\u003c/span\u003e\u003cspan class=\"pln\"\u003e e\u003c/span\u003e\u003cspan class=\"pun\"\u003e){\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n e\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eprintStackTrace\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e ERROR\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eFile\u003c/span\u003e\u003cspan class=\"pln\"\u003e getMyFile\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e myFile\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setMyFile\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eFile\u003c/span\u003e\u003cspan class=\"pln\"\u003e myFile\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003emyFile \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e myFile\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getMyFileContentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e myFileContentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setMyFileContentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e myFileContentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003emyFileContentType \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e myFileContentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getMyFileFileName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e myFileFileName\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setMyFileFileName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e myFileFileName\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003emyFileFileName \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e myFileFileName\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e uploadFile.java是一個非常簡單的類。重要的是要注意的是使用FileUpload攔截器隨着參數Intercetpor 確實爲我們解決所有繁重工作。文件上傳攔截器,使三個參數,默認情況下提供。它們被命名爲以下模式:\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e [your file name parameter]\u0026nbsp;- 這是實際的文件的上載。在這個例子中是 \"myFile\"\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e [your file name parameter]ContentType\u0026nbsp;- 這是被上傳的文件,該文件的內容類型。在這個例子中是 \"myFileContentType\"\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e [your file name parameter]FileName\u0026nbsp;- 這是被上傳的文件的名稱。在這個例子中是 \"myFileFileName\"\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e 這三個參數是爲我們提供的,這要歸功於Struts的攔截器。所有我們需要做的是在我們的Action類,這些變量是自動連線我們以正確的名稱創建三個參數。所以,在上面的例子中,我們有三個參數的操作方法簡單地返回「success」,如果一切順利,否則返回「error」。\u003c/p\u003e \n\u003ch2\u003e 配置文件:\u003c/h2\u003e \n\u003cp\u003e 以下是Struts2的配置屬性可以控制文件上傳過程:\u003c/p\u003e \n\u003ctable\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003cth\u003e SN\u003c/th\u003e \n \u003cth\u003e 屬性\u0026amp; 描述\u003c/th\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 1\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003estruts.multipart.maxSize\u003c/b\u003e\u003cbr\u003e The maximum size (in bytes) of a file to be accepted as a file upload. Default is 250M.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 2\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003estruts.multipart.parser\u003c/b\u003e\u003cbr\u003e The library used to upload the multipart form. By default is\u0026nbsp;\u003cb\u003ejakarta\u003c/b\u003e\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 3\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003estruts.multipart.saveDir\u003c/b\u003e\u003cbr\u003e The location to store the temporary file. By default is javax.servlet.context.tempdir.\u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n\u003c/table\u003e \n\u003cp\u003e 爲了改變這些設置,可以使用恆定的標籤在應用程序 struts.xml文件,像我一樣改變要上傳的文件的最大大小。讓我們有我們的在struts.xml如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.multipart.maxSize\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"1000000\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"upload\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.uploadFile\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/success.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"error\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/error.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 由於FileUpload攔截器是攔截器defaultStack的一部分,我們並不需要明確地配置。但可以添加\u0026lt;interceptor-ref\u0026gt;標籤到\u0026lt;action\u0026gt;裏面。文件上傳攔截器需要兩個參數:(a)maximumSize及(b)allowedTypes。maximumSize參數設置允許的最大文件大小(默認爲約2MB)。allowedTypes參數接受的內容是一個逗號分隔的列表(MIME)類型,如下所示:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"upload\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.uploadFile\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;interceptor-ref\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"basicStack\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;interceptor-ref\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"fileUpload\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"allowedTypes\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eimage/jpeg,image/gif\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/interceptor-ref\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/success.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"error\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/error.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 以下是web.xml文件中的內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 現在右鍵點擊項目名稱,並單擊\u0026nbsp;Export \u0026gt; WAR File\u0026nbsp;創建一個WAR文件。然後部署此WAR在Tomcat 的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/upload.jsp。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"File Upload\" src=\"https://asset.1ju.org/cmsstatic/struts2-13.jpg\"\u003e \n\u003cp\u003e 現在選擇一個文件的「Contacts.txt」使用「瀏覽」按鈕,然後點擊上傳按鈕,將文件上傳,應該看到頁面。可以檢查上傳的文件保存在\u0026nbsp;C:apache-tomcat-6.0.33work.\u003c/p\u003e \n\u003cimg alt=\"File Upload Result\" src=\"https://asset.1ju.org/cmsstatic/struts2-14.jpg\"\u003e \n\u003cp\u003e 請注意,使用FileUpload攔截刪除上傳的文件自動所以需要編程在一些位置上保存上傳的文件被刪除之前。\u003c/p\u003e \n\u003ch2\u003e 錯誤消息:\u003c/h2\u003e \n\u003cp\u003e fileUplaod攔截器使用幾個默認的錯誤消息鍵:\u003c/p\u003e \n\u003ctable\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003cth\u003e SN\u003c/th\u003e \n \u003cth\u003e 錯誤消息鍵 \u0026amp; 描述\u003c/th\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 1\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003estruts.messages.error.uploading\u003c/b\u003e\u003cbr\u003e A general error that occurs when the file could not be uploaded.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 2\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003estruts.messages.error.file.too.large\u003c/b\u003e\u003cbr\u003e Occurs when the uploaded file is too large as specified by maximumSize.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e 3\u003c/td\u003e \n \u003ctd\u003e \u003cb\u003estruts.messages.error.content.type.not.allowed\u003c/b\u003e\u003cbr\u003e Occurs when the uploaded file does not match the expected content types specified.\u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n\u003c/table\u003e \n\u003cp\u003e You can override the text of these messages in\u0026nbsp;\u003cb\u003eWebContent/WEB-INF/classes/messages.properties\u003c/b\u003eresource files.\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"99:T66cc,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 本章將教如何使用Struts 2的簡單的步驟來訪問數據庫。 Struts是一個MVC框架,而不是一個數據庫框架,但它提供了極好的支持JPA/ Hibernate集成。我們將看看在的Hibernate集成在後面的章節,但在這一章中,我們將使用純JDBC來訪問數據庫。\u003c/p\u003e \n\u003cp\u003e 在這一章中的第一個步驟是設置我們的數據庫。我作爲我的數據庫在這個例子中使用MySQL。在機器上安裝MySQL,我創建了一個新的數據庫稱爲「struts_tutorial」。創建了一個表稱爲 login,填充了一些值。下面是使用的腳本來創建和填充表。\u003c/p\u003e \n\u003cp\u003e MYSQL數據庫默認的用戶名「root」和密碼爲:「root123」\u0026nbsp;\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003eCREATE TABLE \u003c/span\u003e\u003cspan class=\"str\"\u003e`struts_tutorial`\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"str\"\u003e`login`\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"str\"\u003e`user`\u003c/span\u003e\u003cspan class=\"pln\"\u003e VARCHAR\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"lit\"\u003e10\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e NOT NULL \u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"str\"\u003e`password`\u003c/span\u003e\u003cspan class=\"pln\"\u003e VARCHAR\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"lit\"\u003e10\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e NOT NULL \u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"str\"\u003e`name`\u003c/span\u003e\u003cspan class=\"pln\"\u003e VARCHAR\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"lit\"\u003e20\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e NOT NULL \u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n PRIMARY KEY \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e`user`\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e ENGINE \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eInnoDB\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\nINSERT INTO \u003c/span\u003e\u003cspan class=\"str\"\u003e`struts_tutorial`\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"str\"\u003e`login`\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e`user`\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e`password`\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e`name`\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n VALUES \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e'scott'\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e'navy'\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e'Scott Burgemott'\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 下一步是下載\u0026nbsp;\u003ca href=\"http://dev.mysql.com/downloads/connector/j/5.1.htmll\"\u003eMySQL Connector\u003c/a\u003e\u0026nbsp;jar文件,並把這個文件的WEB-INF lib文件夾下。之後,已經做到了這一點,我們現在準備創建的動作類。\u0026nbsp;\u003c/p\u003e \n\u003ch2\u003e 創建動作:\u003c/h2\u003e \n\u003cp\u003e 動作類對應的數據庫表中的列的屬性。我們有字符串屬性的用戶名,密碼和名稱。在操作方法,我們使用用戶和密碼參數,以檢查用戶是否存在,如果存在,我們在下一個畫面中顯示的用戶名。如果用戶輸入了錯誤的信息,我們把他們再次到登錄屏幕。以下是LoginAction.java文件的內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esql\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eConnection\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esql\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eDriverManager\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esql\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003ePreparedStatement\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esql\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eResultSet\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eLoginAction\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e user\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e password\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e ret \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e ERROR\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eConnection\u003c/span\u003e\u003cspan class=\"pln\"\u003e conn \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enull\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003etry\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e URL \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"jdbc:mysql://localhost/struts_tutorial\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eClass\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eforName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"com.mysql.jdbc.Driver\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n conn \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eDriverManager\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egetConnection\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003eURL\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"root\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"root123\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e sql \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"SELECT name FROM login WHERE\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n sql\u003c/span\u003e\u003cspan class=\"pun\"\u003e+=\u003c/span\u003e\u003cspan class=\"str\"\u003e\" user = ? AND password = ?\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003ePreparedStatement\u003c/span\u003e\u003cspan class=\"pln\"\u003e ps \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e conn\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eprepareStatement\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003esql\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n ps\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esetString\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"lit\"\u003e1\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e user\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n ps\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esetString\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"lit\"\u003e2\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e password\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eResultSet\u003c/span\u003e\u003cspan class=\"pln\"\u003e rs \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e ps\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eexecuteQuery\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ewhile\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003ers\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"kwd\"\u003enext\u003c/span\u003e\u003cspan class=\"pun\"\u003e())\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n name \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e rs\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egetString\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"lit\"\u003e1\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n ret \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ecatch\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e e\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n ret \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e ERROR\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003efinally\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eif\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003econn \u003c/span\u003e\u003cspan class=\"pun\"\u003e!=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enull\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003etry\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n conn\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eclose\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ecatch\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e e\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e ret\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getUser\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e user\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setUser\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e user\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003euser \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e user\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getPassword\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e password\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setPassword\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e password\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003epassword \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e password\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建頁面:\u003c/h2\u003e \n\u003cp\u003e 現在,讓我們創建一個JSP文件index.jsp的收集用戶名和密碼。此用戶名和密碼對數據庫進行檢查。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\npageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eLogin\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;form\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"loginaction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"post\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n User:\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;br/\u0026gt;\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"text\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"user\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Password:\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;br/\u0026gt;\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"password\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"password\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"submit\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Login\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\t\t\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建視圖:\u003c/h2\u003e \n\u003cp\u003e 現在,讓我們一起創造的success.jsp文件將被調用的情況下動作返回SUCCESS,但在發生錯誤ERROR\u0026nbsp;的情況下,我們將有另一種觀點認爲文件是從操作返回。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eSuccessful Login\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Hello World, \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 下面將是在一個錯誤的情況下,從動作返回視圖文件error.jsp。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eInvalid User Name or Password\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Wrong user name or password provided.\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 配置文件:\u003c/h2\u003e \n\u003cp\u003e 最後,讓我們一起使用struts.xml 配置文件如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"loginaction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.LoginAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/success.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"error\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/error.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 以下是web.xml文件中的內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 現在,右鍵點擊項目名稱,並單擊Export \u0026gt; WAR File創建一個WAR文件。然後部署此WAR在Tomcat 的 webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Database User ID and Password\" src=\"https://asset.1ju.org/cmsstatic/struts2-mysql-1.jpg\"\u003e \n\u003cp\u003e 輸入了錯誤的用戶名和密碼。應該看到頁面如下:\u003c/p\u003e \n\u003cimg alt=\"Database Error Result\" src=\"https://asset.1ju.org/cmsstatic/struts2-mysql-2.jpg\"\u003e \n\u003cp\u003e 現在進入\u003cb\u003escott\u003c/b\u003e\u0026nbsp;用戶名和密碼爲\u0026nbsp;\u003cb\u003enavy\u003c/b\u003e\u0026nbsp;。應該看到頁面如下:\u003c/p\u003e \n\u003cimg alt=\"Database Success Result\" src=\"https://asset.1ju.org/cmsstatic/struts2-mysql-3.jpg\"\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"9a:T7f30,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 本章將教你如何使用Struts2 的應用程序發送電子郵件。對於此練習中,需要下載並安裝將mail.jar 從 JavaMail API1.4.4,並將 mail.jar文件放置在WEB-INFlib文件夾,然後繼續遵循的標準步驟創建動作,視圖和配置文件。\u003c/p\u003e \n\u003ch2\u003e 創建動作:\u003c/h2\u003e \n\u003cp\u003e 下一步是創建一個Action方法,發送電子郵件。讓我們創建一個新類稱爲 Emailer.java 以下內容。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eProperties\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e javax\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003email\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eMessage\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e javax\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003email\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003ePasswordAuthentication\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e javax\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003email\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eSession\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e javax\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003email\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eTransport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e javax\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003email\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003einternet\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eInternetAddress\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e javax\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003email\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003einternet\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eMimeMessage\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmailer\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003efrom\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e password\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e to\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e subject\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e body\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003estatic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eProperties\u003c/span\u003e\u003cspan class=\"pln\"\u003e properties \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eProperties\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003estatic\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n properties\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eput\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"mail.smtp.host\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"smtp.gmail.com\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n properties\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eput\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"mail.smtp.socketFactory.port\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"465\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n properties\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eput\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"mail.smtp.socketFactory.class\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"str\"\u003e\"javax.net.ssl.SSLSocketFactory\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n properties\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eput\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"mail.smtp.auth\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n properties\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eput\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"mail.smtp.port\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"465\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e ret \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003etry\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eSession\u003c/span\u003e\u003cspan class=\"pln\"\u003e session \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eSession\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egetDefaultInstance\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003eproperties\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e javax\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003email\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eAuthenticator\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprotected\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003ePasswordAuthentication\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n getPasswordAuthentication\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003ePasswordAuthentication\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003efrom\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e password\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}});\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eMessage\u003c/span\u003e\u003cspan class=\"pln\"\u003e message \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eMimeMessage\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003esession\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n message\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esetFrom\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eInternetAddress\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003efrom\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n message\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esetRecipients\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eMessage\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eRecipientType\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eTO\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eInternetAddress\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eparse\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003eto\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n message\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esetSubject\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003esubject\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n message\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esetText\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003ebody\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eTransport\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esend\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003emessage\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ecatch\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e e\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n ret \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e ERROR\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n e\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eprintStackTrace\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e ret\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getFrom\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003efrom\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setFrom\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003efrom\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"kwd\"\u003efrom\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003efrom\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getPassword\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e password\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setPassword\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e password\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003epassword \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e password\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getTo\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e to\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setTo\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e to\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eto \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e to\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getSubject\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e subject\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setSubject\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e subject\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esubject \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e subject\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getBody\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e body\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setBody\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e body\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ebody \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e body\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003estatic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eProperties\u003c/span\u003e\u003cspan class=\"pln\"\u003e getProperties\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e properties\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003estatic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setProperties\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eProperties\u003c/span\u003e\u003cspan class=\"pln\"\u003e properties\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmailer\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eproperties \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e properties\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 可以看到在上面的源代碼中,Emailer.java有對應的形式在下面給出的email.jsp頁的屬性的屬性。這些屬性\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e from\u0026nbsp;- 發件人的電子郵件地址。由於我們使用的是谷歌的SMTP,我們需要一個有效的gtalk ID\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e password\u0026nbsp;- 上述帳戶的密碼\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e to\u0026nbsp;- 給誰發送電子郵件?\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e Subject\u0026nbsp;- 電子郵件主題\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e body\u0026nbsp;- 實際的電子郵件消息\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e 我們有沒有考慮過上述各個屬性的任何驗證,驗證將被添加在下一章。現在讓我們看看在execute()方法。 execute()方法使用使用javax郵件庫發送一封電子郵件,使用提供的參數。如果郵件被髮送,動作返回 SUCCESS,否則它返回ERROR。\u003c/p\u003e \n\u003ch2\u003e 創建主頁頁:\u003c/h2\u003e \n\u003cp\u003e 讓我們編寫主頁index.jsp的JSP文件,這將被用來收集電子郵件的相關信息,上面提到的:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n pageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmail Form\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;em\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eThe form below uses Google's SMTP server. \r\n So you need to enter a gmail username and password\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/em\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;form\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"emailer\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"post\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;label\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003efor\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"from\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eFrom\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/label\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"text\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"from\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;label\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003efor\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"password\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003ePassword\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/label\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"password\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"password\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;label\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003efor\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"to\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eTo\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/label\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"text\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"to\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;label\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003efor\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"subject\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eSubject\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/label\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"text\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"subject\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;label\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003efor\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"body\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eBody\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/label\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"text\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"body\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"submit\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Send Email\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建視圖:\u003c/h2\u003e \n\u003cp\u003e 我們將使用JSP文件的success.jsp將被調用的情況下行動返回SUCCESS,但在發生ERROR\u0026nbsp;的情況下,我們將有另一種視圖認爲文件是從操作返回。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\tpageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmail Success\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Your email to \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"to\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e was sent successfully.\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 下面將是在一個錯誤的情況下,從動作返回視圖文件error.jsp。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\tpageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmail Error\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n There is a problem sending your email to \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"to\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e.\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 配置文件:\u003c/h2\u003e \n\u003cp\u003e 現在,讓我們將這一切組合起來使用struts.xml的配置文件如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"emailer\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.Emailer\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/success.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"error\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/error.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 以下是web.xml文件中的內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 現在,右鍵點擊項目名稱,並單擊\u0026nbsp;Export \u0026gt; WAR File創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給出以下畫面:\u0026nbsp;\u003c/p\u003e \n\u003cimg alt=\"Email User Input\" src=\"https://asset.1ju.org/cmsstatic/struts2-email-1.jpg\"\u003e \n\u003cp\u003e 輸入所需信息,並單擊「Send Email\u0026nbsp;」按鈕。如果一切順利,那麼應該看到以下頁面:\u003c/p\u003e \n\u003cimg alt=\"Email Successful\" src=\"https://asset.1ju.org/cmsstatic/struts2-email-2.jpg\"\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"9b:T69b3,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 現在,我們將看看如何的Struts驗證框架。在Struts的核心有驗證框架,協助應用程序的運行規則來執行驗證執行之前的操作方法。\u003c/p\u003e \n\u003cp\u003e 通常是使用Javascript來實現客戶端驗證。但不應單獨依賴於客戶端驗證。最佳實踐表明,驗證應引入各級應用程序框架。現在,讓我們來看看兩種方式添加驗證我們的Struts項目。\u003c/p\u003e \n\u003cp\u003e 在這裏,我們將採取一個例子,Employee\u0026nbsp;將被捕獲的姓名和年齡使用一個簡單的頁面,我們將會把兩個驗證,以確保使用總是進入一個名字和年齡應該是在28和65之間。所以,讓我們先從主JSP頁面的例子。\u003c/p\u003e \n\u003ch2\u003e 創建主頁面:\u003c/h2\u003e \n\u003cp\u003e 讓我們寫主JSP頁面文件的index.jsp,這將被用來收集上述員工的相關信息。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n pageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmployee Form\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:form\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"empinfo\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"post\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:textfield\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Name\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003esize\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"20\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:textfield\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"age\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Age\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003esize\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"20\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:submit\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"submit\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Submit\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ealign\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"center\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在index.jsp使用Struts的標籤,我們還沒有涉及,但我們將研究這些標籤相關的章節。但現在,假設\u0026nbsp;s:textfield\u0026nbsp;標籤打印一個輸入字段s:submit打印一個提交按鈕。我們已經使用label屬性標籤,每個標籤每個標籤創建。\u0026nbsp;\u003c/p\u003e \n\u003ch2\u003e 創建視圖:\u003c/h2\u003e \n\u003cp\u003e 我們將使用JSP文件的success.jsp將調用的情況下定義的動作返回SUCCESS。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\tpageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eSuccess\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Employee Information is captured successfully.\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建動作:\u003c/h2\u003e \n\u003cp\u003e 因此,讓我們定義一個小小的動作類Employee,然後添加一個方法稱爲validate(),如下所示在Employee.java文件。請確保操作類擴展ActionSupport類,否則validate方法將不會被執行。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e getAge\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setAge\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eage \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e validate\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eif\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e==\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enull\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e||\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003etrim\u003c/span\u003e\u003cspan class=\"pun\"\u003e().\u003c/span\u003e\u003cspan class=\"pln\"\u003eequals\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e))\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n addFieldError\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"The name is required\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eif\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003eage \u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"lit\"\u003e28\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e||\u003c/span\u003e\u003cspan class=\"pln\"\u003e age \u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"lit\"\u003e65\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n addFieldError\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"age\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Age must be in between 28 and 65\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 如在上面的例子所示,「Name」字段的驗證方法檢查是否有一個值,或不。如果沒有值已經提供,我們添加一個帶有自定義錯誤消息「Age」字段的字段錯誤。其次,我們檢查,如果輸入的值是在28和65之間或不爲「Age」字段,如果這個條件不符合我們以上驗證字段添加一個錯誤。\u003c/p\u003e \n\u003ch2\u003e 配置文件:\u003c/h2\u003e \n\u003cp\u003e 最後,讓我們把所有東西一起使用struts.xml的配置文件如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"empinfo\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.Employee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"input\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/index.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/success.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 以下是web.xml文件中的內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 現在,右鍵點擊項目名稱,並單擊Export \u0026gt; WAR File創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Email User Input\" src=\"https://asset.1ju.org/cmsstatic/struts2-email-1.jpg\"\u003e \n\u003cp\u003e 現在不輸入任何所需信息,只需點擊「Submit\u0026nbsp;」按鈕。將看到以下結果:\u003c/p\u003e \n\u003cimg alt=\"Error\" src=\"https://asset.1ju.org/cmsstatic/struts2-15.jpg\"\u003e \n\u003cp\u003e 輸入所需的信息,但輸入了錯誤的From字段,讓我們說「test」和年齡爲30,最後點擊「Submit\u0026nbsp;」按鈕。將看到以下結果:\u003c/p\u003e \n\u003cimg alt=\"Success\" src=\"https://asset.1ju.org/cmsstatic/struts2-16.jpg\"\u003e \n\u003ch2\u003e 此驗證是如何工作的?\u003c/h2\u003e \n\u003cp\u003e 當用戶按下提交按鈕時,Struts2會自動執行的驗證方法,如果任何一個if語句裏面的方法列出,Struts 2調用addFieldError方法。如果有任何錯誤已加入Struts 2將不會進行調用execute方法。而Struts 2框架將返回輸入作爲調用該行動的結果。\u003c/p\u003e \n\u003cp\u003e 因此,驗證失敗時Struts2返回輸入,Struts 2框架將重新顯示index.jsp文件。因爲我們使用了Struts 2的表單標籤,Struts2中會自動添加錯誤消息,只是上面的形式提交。\u003c/p\u003e \n\u003cp\u003e 這些錯誤消息是我們addFieldError方法調用中指定的。addFieldError方法有兩個參數。首先是表單字段名錯誤,第二個是錯誤信息,上面顯示該表單字段。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003eaddFieldError\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"The name is required\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 要處理的返回值輸入,我們需要添加以下的結果,以我們的動作節點在struts.xml。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"input\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/index.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 基於XML的驗證:\u003c/h2\u003e \n\u003cp\u003e 在進行驗證的第二個方法是通過將一個xml文件的動作類。Struts2的基於XML驗證的驗證提供了更多的選擇,如電子郵件驗證,整數範圍驗證,表單驗證字段,表達式驗證,正則表達式驗證,需要驗證,驗證所需的字符串,字符串長度的驗證等。\u003c/p\u003e \n\u003cp\u003e XML文件需要被命名爲'[action-class]'-validation.xml。所以,在我們的例子中,我們創建一個文件,名爲\u0026nbsp;Employee-validation.xml包含以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE validators PUBLIC \r\n\"-//OpenSymphony Group//XWork Validator 1.0.2//EN\"\r\n\"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;validators\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;field\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;field-validator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"required\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n The name is required.\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field-validator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;field\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"age\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;field-validator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"int\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"min\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e29\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"max\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e64\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Age must be in between 28 and 65\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field-validator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/validators\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 上面的XML文件會被保存在CLASSPATH 沿着類文件。讓我們有我們的僱員動作類沒有validate()方法如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e getAge\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setAge\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eage \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 其餘的設置將保持,因爲它是我前面的例子,現在,如果運行應用程序,它會產生相同的結果是什麼,我們在前面的例子:\u003c/p\u003e \n\u003cp\u003e xml文件來存儲配置的優點是允許的驗證從應用程序代碼的分離。可以讓開發人員編寫的代碼和業務分析師建立驗證xml文件。要注意的是另一件事是默認提供的驗證類型。有大量的驗證,默認情況下,使用Struts。常見的驗證包括驗證日期,正則表達式驗證字符串長度的驗證。檢查以下鏈接更多細節\u0026nbsp;Struts - 基於XML的校驗.\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"9c:T2c7c,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 以下是的各類字段級和非字段級驗證在Struts2列表:\u003c/p\u003e \n\u003ch2\u003e date validator:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;field\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"birthday\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;field-validator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"date\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"min\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e01/01/1990\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"max\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e01/01/2000\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Birthday must be within ${min} and ${max}\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field-validator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e double validator:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;field\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"percentage\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;field-validator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"double\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"minExclusive\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e0.123\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"maxExclusive\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e99.98\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Percentage needs to be between ${minExclusive}\r\n ${maxExclusive} (exclusive)\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field-validator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e email validator:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;field\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myEmail\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;field-validator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"email\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Must provide a valid email\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field-validator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e expression validator:\u003c/h2\u003e \n\u003cp\u003e 非現場級驗證,驗證基於正則表達式提供。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;field-validator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"expression\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"expression\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e....\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Failed to meet Ognl Expression .... \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field-validator\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e int validator:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;field\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"age\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;field-validator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"int\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"min\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e5\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"max\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e50\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Age needs to be between ${min} and ${max}\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field-validator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e regex validator:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;field\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myStrangePostcode\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;field-validator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"regex\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"fieldName\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003emyStrangePostcode\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"expression\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u0026lt;![CDATA[([aAbBcCdD][123][eEfFgG][456])]]\u0026gt;\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field-validator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e required validator:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;field\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"username\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;field-validator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"required\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n username must not be null\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field-validator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e requiredstring validator:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;field\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"username\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;field-validator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"requiredstring\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"trim\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003etrue\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n username must not be null\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field-validator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e stringlength validator:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;field\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"username\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;field-validator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"stringlength\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"minLength\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e10\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"maxLength\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e10\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"trim\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003etrue\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Your username needs to be 10 characters long\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field-validator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e url validator:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;field-validator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"url\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"fieldName\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003emyHomePageURL\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Invalid homepage url\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/message\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/field-validator\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"9d:T750a,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 國際化(i18n)是規劃和實施的產品和服務,使他們能很容易地適應特定的本地語言和文化的過程中,這個過程被稱爲本地化。國際化的過程有時也被稱爲翻譯或本地化啓用。國際化是縮寫i18n,因爲我和兩端用n字打頭,並有18個字符之間的第i個和最後n。\u003c/p\u003e \n\u003cp\u003e Struts2提供本地化,即,國際化(i18n)支持,通過資源包,攔截器和標籤庫在以下地方:\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e UI 標籤\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 消息和錯誤\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 動作類\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003ch2\u003e 資源包:\u003c/h2\u003e \n\u003cp\u003e Struts2 使用資源包來提供Web應用程序的用戶多語言和區域選項。不必擔心在不同的語言編寫的網頁。所有必須做的是創造一個資源包爲每個想要的語言。資源包將包含標題,消息和其他文本的語言用戶。資源包的文件,該文件包含鍵/值對您的應用程序的默認語言。\u003c/p\u003e \n\u003cp\u003e 簡單的命名格式的資源文件是:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003ebundlename_language_country\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eproperties\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 這裏,軟件包可以ActionClass,接口,超類,型號,封裝,全球資源屬性。接下來的部分\u0026nbsp;language_country\u0026nbsp;,En_US的等在這裏,可以跳過這是可選的全國部分區域表示es_ES和英語(美國),西班牙語(西班牙)表示語言環境的語言環境,例如代表國家。\u0026nbsp;\u003c/p\u003e \n\u003cp\u003e 當引用消息元素,其關鍵,按照下列順序進行相應的消息包的Struts框架搜索:\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e ActionClass.properties\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e Interface.properties\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e SuperClass.properties\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e model.properties\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e package.properties\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e struts.properties\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e global.properties\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e 多語言開發應用程序,就必須保持相應的到那些語言/區域設置多個屬性文件定義的鍵/值對中的所有內容。例如,如果要開發應用程序(默認)爲美國英語,西班牙語,和法語就必須創建三個屬性文件。在這裏,我將使用只global.properties文件,你可以利用不同的屬性文件來隔離不同類型的消息。\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e global.properties:\u0026nbsp;默認情況下,英語(美國)將被應用\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e global_fr.properties:\u0026nbsp;這將是法語環境中使用。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e global_es.properties:\u0026nbsp;這將被用於西班牙語言環境。\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003ch2\u003e 訪問消息:\u003c/h2\u003e \n\u003cp\u003e 有幾種方法可以訪問的信息資源,包括gettext的,文本標籤,UI標籤的關鍵屬性,國際化標籤。讓我們來看看他們簡單:\u003c/p\u003e \n\u003cp\u003e 要顯示i18n的文本,使用的調用屬性標記gettext,或其他任何標記,例如UI標籤如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"getText('some.key')\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 文本標記檢索從默認的資源包,即一個消息 struts.properties\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;s:text\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"some.key\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e i18n標籤推值棧上的任意資源束。 i18n標籤範圍內的其他標籤可以顯示該資源包的消息:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;s:i18n\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"some.package.bundle\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:text\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"some.key\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:i18n\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 大多數UI標籤的鍵屬性,可以用來檢索的消息,從一個資源包:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;s:textfield\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ekey\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"some.key\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"textfieldName\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e Localization 例子:\u003c/h2\u003e \n\u003cp\u003e 創建的index.jsp從前一章到多種語言。相同的文件將被寫入,如下所示:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n pageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmployee Form with Multilingual Support\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;h1\u0026gt;\u0026lt;s:text\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"global.heading\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;/h1\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:url\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"indexEN\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003enamespace\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"/\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"locale\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"request_locale\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003een\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:url\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:url\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"indexES\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003enamespace\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"/\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"locale\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"request_locale\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003ees\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:url\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:url\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"indexFR\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003enamespace\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"/\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"locale\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"request_locale\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003efr\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:url\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:a\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ehref\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{indexEN}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEnglish\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:a\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:a\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ehref\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{indexES}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eSpanish\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:a\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:a\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ehref\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{indexFR}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eFrance\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:a\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:form\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"empinfo\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"post\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003enamespace\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"/\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:textfield\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ekey\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"global.name\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003esize\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"20\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:textfield\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"age\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ekey\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"global.age\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003esize\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"20\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:submit\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"submit\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ekey\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"global.submit\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 我們將創建的success.jsp文件,該文件將被調用的情況下定義的動作返回SUCCESS。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\tpageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eSuccess\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"getText('global.success')\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在這裏,我們需要創建兩個動作。 (一)第一個動作一個Locale和照顧,用不同的語言顯示相同的index.jsp文件(二)另一項行動是爲了照顧提交表單本身。的動作都將返回SUCCESS,但我們會採取不同的動作,返回值的基礎上,因爲我們的目的是不同的兩個動作:\u003c/p\u003e \n\u003ch3\u003e 動作處理locale:\u003c/h3\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eLocale\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch3\u003e 提交表單處理動作:\u003c/h3\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e getAge\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setAge\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eage \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 現在。讓我們創建以下三個global.properties文件放在CLASSPATH中:\u003c/p\u003e \n\u003ch3\u003e GLOBAL.PROPERTIES:\u003c/h3\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003eglobal\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eName\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eglobal\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eage \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eAge\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eglobal\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esubmit \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eSubmit\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eglobal\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eheading \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eSelect\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eLocale\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eglobal\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esuccess \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eSuccessfully\u003c/span\u003e\u003cspan class=\"pln\"\u003e authenticated\u003c/span\u003e\u003c/pre\u003e \n\u003ch3\u003e GLOBAL_FR.PROPERTIES:\u003c/h3\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003eglobal\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eNom\u003c/span\u003e\u003cspan class=\"pln\"\u003e d\u003c/span\u003e\u003cspan class=\"str\"\u003e'utilisateur \r\nglobal.age = l'\u003c/span\u003e\u003cspan class=\"pun\"\u003eâ\u003c/span\u003e\u003cspan class=\"pln\"\u003ege\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eglobal\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esubmit \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eSoumettre\u003c/span\u003e\u003cspan class=\"pln\"\u003e des\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eglobal\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eheading \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e S\u003c/span\u003e\u003cspan class=\"pun\"\u003eé\u003c/span\u003e\u003cspan class=\"pln\"\u003e lectionnez \u003c/span\u003e\u003cspan class=\"typ\"\u003eLocal\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eglobal\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esuccess \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eAuthentifi\u003c/span\u003e\u003cspan class=\"pln\"\u003e\t\u003c/span\u003e\u003cspan class=\"pun\"\u003eé\u003c/span\u003e\u003cspan class=\"pln\"\u003e avec succ\u003c/span\u003e\u003cspan class=\"pun\"\u003eè\u003c/span\u003e\u003cspan class=\"pln\"\u003es\u003c/span\u003e\u003c/pre\u003e \n\u003ch3\u003e GLOBAL_ES.PROPERTIES:\u003c/h3\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003eglobal\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eNombre\u003c/span\u003e\u003cspan class=\"pln\"\u003e de usuario\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eglobal\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eage \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEdad\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eglobal\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esubmit \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003ePresentar\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eglobal\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eheading \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e seleccionar la configuracion regional\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eglobal\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esuccess \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eAutenticado\u003c/span\u003e\u003cspan class=\"pln\"\u003e correctamente\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 我們將創建struts.xml中兩個動作如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.custom.i18n.resources\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"global\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003enamespace\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"/\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"empinfo\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.Employee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"input\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/index.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/success.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"locale\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.Locale\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/index.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 以下是web.xml文件中的內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 現在,右鍵點擊項目名稱,並單擊\u0026nbsp;Export \u0026gt; WAR File創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"English Output\" src=\"https://asset.1ju.org/cmsstatic/i18n-1.gif\"\u003e \n\u003cp\u003e 現在選擇的任何一種語言,讓我們說,我們選擇西班牙語,這將顯示以下結果:\u003c/p\u003e \n\u003cimg alt=\"Spanish Output\" src=\"https://asset.1ju.org/cmsstatic/i18n-2.gif\"\u003e \n\u003cp\u003e 您可以嘗試用法語。最後,讓我們嘗試點擊「\u003cb\u003eSubmit\u003c/b\u003e\u0026nbsp;」按鈕,當我們在西班牙語言,它會顯示以下畫面:\u0026nbsp;\u003c/p\u003e \n\u003cimg alt=\"Spanish Success\" src=\"https://asset.1ju.org/cmsstatic/i18n-3.gif\"\u003e \n\u003cp\u003e 恭喜你,現在有一個多語種的網頁,可以在全球範圍內啓動您的網站。\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"9e:T4a99,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 在HTTP請求中的一切都被視爲一個String由協議。這包括數字,布爾值,整數,日期,小數和一切。每一件事情是一個字符串,將根據HTTP。然而,Struts類可以有任何數據類型的屬性。Struts的自動裝配屬性?\u003c/p\u003e \n\u003cp\u003e Struts使用了多種類型轉換器在幕後做繁重。例如,如果Action類的屬性有一個整數,Struts的自動轉換請求參數的整數屬性沒有做任何事情。默認情況下,Struts的一些類型轉換器。下面列出了他們中的一些,如果您正在使用其中任何一個,那麼你有什麼可擔心的:\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e Integer, Float, Double, Decimal\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e Date and Datetime\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e Arrays and Collections\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e Enumerations\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e Boolean\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e BigDecimal\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e 有些時候,當使用自己的數據類型,它是需要添加自己的轉換,使Struts知道如何將這些值,然後顯示。考慮以下POJO類Environment.java。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 這是一個非常簡單的類,它有一個名爲name的屬性,所以沒有什麼特別的關於這個類。我們創建包含有關係統 - SystemDetails.java信息另一個類。目的是練習,我有硬編碼環境,以「開發」在操作系統「Windows XP SP3」。在實際項目中,會從系統配置得到信息。因此,讓我們有以下動作類:\u0026nbsp;\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eSystemDetails\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pln\"\u003e environment \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Development\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e operatingSystem \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"Windows XP SP3\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pln\"\u003e getEnvironment\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e environment\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setEnvironment\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pln\"\u003e environment\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eenvironment \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e environment\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getOperatingSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e operatingSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setOperatingSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e operatingSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eoperatingSystem \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e operatingSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 接下來讓我們創建一個簡單的JSP文件System.jsp顯示環境和操作系統信息。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\npageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eSystem Details\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Environment: \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"environment\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Operating System:\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"operatingSystem\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 讓我們編寫 system.jsp,SystemDetails.java類在struts.xml一起使用。 SystemDetails類有一個簡單的execute()方法返回字符串「SUCCESS」。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"system\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.SystemDetails\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/System.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊\u0026nbsp;Export \u0026gt; WAR File\u0026nbsp;創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/system.action。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"System Info\" src=\"https://asset.1ju.org/cmsstatic/struts2-3.gif\"\u003e \n\u003cp\u003e 上面的輸出有什麼錯? Struts 知道如何顯示字符串「Windows XP SP3」等內置數據類型轉換,但它不知道用Environmenttype屬性做什麼。所以,它只是被稱爲類的toString()方法。爲了解決這個問題,現在讓我們創建並註冊一個簡單的TypeConverter環境類。創建一個類名爲EnvironmentConverter.java以下。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eMap\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e org\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eapache\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eStrutsTypeConverter\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironmentConverter\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eStrutsTypeConverter\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@Override\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eObject\u003c/span\u003e\u003cspan class=\"pln\"\u003e convertFromString\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eMap\u003c/span\u003e\u003cspan class=\"pln\"\u003e context\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pun\"\u003e[]\u003c/span\u003e\u003cspan class=\"pln\"\u003e values\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eClass\u003c/span\u003e\u003cspan class=\"pln\"\u003e clazz\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pln\"\u003e env \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003evalues\u003c/span\u003e\u003cspan class=\"pun\"\u003e[\u003c/span\u003e\u003cspan class=\"lit\"\u003e0\u003c/span\u003e\u003cspan class=\"pun\"\u003e]);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e env\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@Override\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e convertToString\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eMap\u003c/span\u003e\u003cspan class=\"pln\"\u003e context\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eObject\u003c/span\u003e\u003cspan class=\"pln\"\u003e value\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pln\"\u003e env \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e value\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e env \u003c/span\u003e\u003cspan class=\"pun\"\u003e==\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enull\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enull\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e:\u003c/span\u003e\u003cspan class=\"pln\"\u003e env\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egetName\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\t\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e EnvironmentConverter 擴展了 StrutsTypeConverter 類,如何將環境爲一個 String,反之亦然通過重寫兩個的方法 convertFromString()和 convertToString()並通知了Struts。現在,讓我們註冊這個轉換器之前,我們我們在我們的應用程序。有兩種方法來註冊一個轉換器。如果轉換器將只用於在一個特定的動作,那麼將需要創建一個屬性文件需要被命名爲\u0026nbsp;'[action-class]'-converstion.properties,所以,在我們的例子中,我們創建一個名爲SystemDetails下面的註冊 converstion.properties 輸入:\u0026nbsp;\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003ecom\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironmentConverter\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在上面的例子中,「environment」的名字是在SystemDetails.java 類的一個屬性,告訴要使用Struts EnvironmentConverter從這個屬性的轉換。但是,我們不打算這樣做,相反,我們要在全局範圍內註冊這個轉換器,因此,它可以在整個應用程序。要做到這一點,創建一個屬性文件名爲\u0026nbsp;xwork-conversion.properties 在\u0026nbsp;WEB-INF/classes文件夾下面一行:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003ecom\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironmentConverter\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 這簡單的註冊全局轉換器,這樣的Struts可以自動做轉換每次遇到一個對象類型的環境。現在,如果重新編譯並重新運行該程序,會得到更好的輸出如下:\u003c/p\u003e \n\u003cimg alt=\"System Info\" src=\"https://asset.1ju.org/cmsstatic/struts2-4.gif\"\u003e \n\u003cp\u003e 很顯然,現在的結果是更好的,這意味着我們的Struts的轉換工作正常。這是可以創建多個轉換器和按要求註冊後才能使用。\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"9f:T2e4a,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 實際本章教程開始之前,讓我們看看由http://struts.apache.org給出的幾個定義:\u003c/p\u003e \n\u003ctable\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003cth\u003e Term\u003c/th\u003e \n \u003cth\u003e 描述\u003c/th\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cb\u003etag\u003c/b\u003e\u003c/td\u003e \n \u003ctd\u003e A small piece of code executed from within JSP, FreeMarker, or Velocity.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cb\u003etemplate\u003c/b\u003e\u003c/td\u003e \n \u003ctd\u003e A bit of code, usually written in FreeMarker, that can be rendered by certain tags (HTML tags).\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cb\u003etheme\u003c/b\u003e\u003c/td\u003e \n \u003ctd\u003e A collection of templates packaged together to provide common functionality.\u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n\u003c/table\u003e \n\u003cp\u003e 我也建議去通過Struts2本土化章節,因爲我們將採取同樣的例子,再次執行我們的練習。\u0026nbsp;\u003c/p\u003e \n\u003cp\u003e 當使用Struts 2 標籤如\u0026lt;s:submit...\u0026gt;,\u0026lt;s:textfield...\u0026gt;等在網頁中,Struts 2框架生成HTML代碼與預先設定的樣式和佈局。 Struts 2自帶內置的主題有三個:\u003c/p\u003e \n\u003ctable\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003cth\u003e Theme\u003c/th\u003e \n \u003cth\u003e 描述\u003c/th\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cb\u003esimple theme\u003c/b\u003e\u003c/td\u003e \n \u003ctd\u003e A minimal theme with no \"bells and whistles\". For example, the textfield tag renders the HTML \u0026lt;input/\u0026gt; tag without a label, validation, error reporting, or any other formatting or functionality.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cb\u003exhtml theme\u003c/b\u003e\u003c/td\u003e \n \u003ctd\u003e This is the default theme used by Struts 2 and provides all the basics that the simple theme provides and adds several features like standard two-column table layout for the HTML, Labels for each of the HTML, Validation and error reporting etc.\u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cb\u003ecss_xhtml theme\u003c/b\u003e\u003c/td\u003e \n \u003ctd\u003e This theme provides all the basics that the simple theme provides and adds several features like standard two-column CSS-based layout, using \u0026lt;div\u0026gt; for the HTML Struts Tags, Labels for each of the HTML Struts Tags, placed according to the CSS stylesheet.\u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n\u003c/table\u003e \n\u003cp\u003e 正如上面所提到的,如果不指定一個主題,然後Struts2中會使用默認的XHTML主題。例如Struts 2中選擇標籤:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;s:textfield\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Name\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 生成HTML標記:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;tr\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;td\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"tdLabel\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;label\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003efor\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"empinfo_name\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"label\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eName:\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/label\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/td\u0026gt;\u0026lt;td\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"text\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"empinfo_name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/td\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/tr\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 這裏empinfo struts.xml文件中定義動作名稱。\u003c/p\u003e \n\u003ch2\u003e 選擇主題:\u003c/h2\u003e \n\u003cp\u003e 可以指定主題Struts 2每一個標籤的基礎上或指定的主題Struts 2使用,可以使用下列方法之一:\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e 主題屬性的具體標籤\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 主題屬性標籤的周邊表單標籤\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 頁面範圍的屬性,名爲「主題」\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 請求範圍屬性名爲「主題」\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 會話作用域屬性命名爲「主題」\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 應用程序作用域的屬性命名爲「主題」\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 在struts.properties struts.ui.theme屬性(默認爲XHTML)\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e 以下語法指定他們在標籤級別,如果願意爲不同的標籤使用不同的主題:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;s:textfield\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Name\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etheme\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"xhtml\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 因爲它不是非常實用,每個標籤的基礎上使用主題,所以乾脆我們可以指定規則struts.properties文件中使用以下標籤:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"com\"\u003e# Standard UI theme\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\nstruts\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eui\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003etheme\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003exhtml\r\n\u003c/span\u003e\u003cspan class=\"com\"\u003e# Directory where theme template resides\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\nstruts\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eui\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003etemplateDir\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"kwd\"\u003etemplate\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"com\"\u003e# Sets the default template type. Either ftl, vm, or jsp\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\nstruts\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eui\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003etemplateSuffix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003eftl\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 以下的結果是,我們拿起從本地化章節裏我們使用默認設置struts.ui.theme= XHTML的struts-default.properties文件中,默認情況下,在\u0026nbsp;struts2-core.xy.z.jar文件,這是由主題。\u003c/p\u003e \n\u003cimg alt=\"English Output\" src=\"https://asset.1ju.org/cmsstatic/i18n-1.gif\"\u003e \n\u003ch2\u003e 主題如何工作的?\u003c/h2\u003e \n\u003cp\u003e 對於一個給定的主題,每一個struts標籤有關聯的模板,如:s:textfield -\u0026gt; text.ftl\u0026nbsp;和\u0026nbsp;s:password -\u0026gt; password.ftl等,這些模板文件來壓縮struts2-core.xy.z.jar文件。這些模板文件保持一個預先定義的HTML佈局爲每個標籤。所以Struts2 框架生成最終的HTML標記代碼使用Sturts標籤和相關的模板。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"typ\"\u003eStruts\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"lit\"\u003e2\u003c/span\u003e\u003cspan class=\"pln\"\u003e tags \u003c/span\u003e\u003cspan class=\"pun\"\u003e+\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eAssociated\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003etemplate\u003c/span\u003e\u003cspan class=\"pln\"\u003e file \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eFinal\u003c/span\u003e\u003cspan class=\"pln\"\u003e HTML markup code\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 默認模板已經寫在FreeMarker和他們有擴展名\u0026nbsp;.ftl。可以設計使用速度或JSP模板,並據此設置配置在使用struts.ui.templateSuffix 和 struts.ui.templateDir struts.properties。\u003c/p\u003e \n\u003ch2\u003e 創建新的主題:\u003c/h2\u003e \n\u003cp\u003e 最簡單的方法來創建一個新的主題是複製現有的任何主題/模板文件,並做必要的修改。所以,讓我們開始創建一個文件夾\u0026nbsp;WebContent/WEB-INF/classes\u0026nbsp;名爲模板和子文件夾與我們新的主題的名稱,例如WebContent/WEB-INF/classes/template/mytheme。從這裏,可以從頭開始構建模板,或者可以複製​​模板從Struts2分佈和根據需要進行修改。\u003c/p\u003e \n\u003cp\u003e 我們要修改現有的默認模板XHTML學習目的。所以,現在讓,我們複製內容從\u0026nbsp;struts2-core-x.y.z.jar/template/xhtml\u0026nbsp;到我們的主題目錄,並只修改WebContent/WEB-INF/classes/template/mytheme/control.ftl文件。當我們打開control.ftl 它將有下面幾行:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e\u0026lt;table class=\"${parameters.cssClass?default('wwFormTable')?html}\"\u0026lt;#rt/\u0026gt;\r\n\u0026lt;#if parameters.cssStyle?\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e style=\"${parameters.cssStyle?html}\"\u0026lt;#rt/\u0026gt;\r\n\u0026lt;/#if\u0026gt;\r\n\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 讓我們上述文件control.ftl改變有以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;table\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003estyle\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"\u003c/span\u003e\u003cspan class=\"pln\"\u003eborder\u003c/span\u003e\u003cspan class=\"pun\"\u003e:\u003c/span\u003e\u003cspan class=\"lit\"\u003e1px\u003c/span\u003e\u003cspan class=\"pln\"\u003e solid black\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 如果檢查看 form.ftl 會發現,control.ftl 這個文件中,form.ftl這個文件是指從XHTML主題。因此,讓我們改變如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e\u0026lt;#include \"/${parameters.templateDir}/xhtml/form-validate.ftl\" /\u0026gt;\r\n\u0026lt;#include \"/${parameters.templateDir}/simple/form-common.ftl\" /\u0026gt;\r\n\u0026lt;#if (parameters.validate?default(false))\u0026gt;\r\n onreset=\"${parameters.onreset?default('clearErrorMessages(this);\r\n clearErrorLabels(this);')}\"\r\n\u0026lt;#else\u0026gt;\r\n \u0026lt;#if parameters.onreset?\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n onreset=\"${parameters.onreset?html}\"\r\n \u0026lt;/#if\u0026gt;\r\n\u0026lt;/#if\u0026gt;\r\n\u0026gt;\r\n\u003c/span\u003e\u003cspan\u003e\u003cspan class=\"pln\"\u003e\u0026lt;#include \"/${parameters.templateDir}/mytheme/control.ftl\" /\u0026gt;\u0026nbsp;\u0026nbsp;\u003c/span\u003e\u003c/span\u003e\r\n\u003c/pre\u003e \n\u003cp\u003e 我假設不會有太多瞭解FreeMarker模板語言,仍然尋找FTL文件需要做什麼,可以得到一個不錯的主意。然而,讓我們除上述變動外,並回到我們的本地化的例子,創建\u0026nbsp;WebContent/WEB-INF/classes/struts.properties\u0026nbsp;檔案的以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"com\"\u003e# Customized them\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\nstruts\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eui\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003etheme\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003emytheme\r\n\u003c/span\u003e\u003cspan class=\"com\"\u003e# Directory where theme template resides\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\nstruts\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eui\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003etemplateDir\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"kwd\"\u003etemplate\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"com\"\u003e# Sets the template type to ftl.\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\nstruts\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eui\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003etemplateSuffix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003eftl\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 現在這種變化後,右鍵點擊項目名稱,並單擊Export \u0026gt; WAR File創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2。這會給出以下畫面:\u0026nbsp;\u003c/p\u003e \n\u003cimg alt=\"Theme and Template\" src=\"https://asset.1ju.org/cmsstatic/struts2-5.gif\"\u003e \n\u003cp\u003e XHTML主題複製後的變化,我們做了主題這是一個結果,可以看到一個表單組件周圍的邊框。 FreeMarker學習,如果你努力,那麼將能夠創建或修改主題很容易。至少現在,你必須有一個基本的瞭解Sturts2主題和模板。\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"a0:T4a74,"])</script><script>self.__next_f.push([1,"\u003cp\u003e Struts提供了一個更簡單的方式來處理未捕獲的異常,並將用戶重定向到一個專門的錯誤頁面。您可以輕鬆地Struts配置到不同的異常有不同的錯誤頁面。\u003c/p\u003e \n\u003cp\u003e Struts的異常處理所使用的「exception」攔截容易。「exception」攔截器作爲默認的棧的一部分,所以不必做任何額外的配置。它可爲準備使用的盒。讓我們看到了一個簡單的Hello World示例進行一些修改在HelloWorldAction.java文件。在這裏,我們特意推出了一個空指針異常在我們HelloWorldAction動作代碼。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHelloWorldAction\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e(){\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e x \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enull\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n x \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e x\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esubstring\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"lit\"\u003e0\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 讓我們 helloWorld.jsp保持內容如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Hello World, \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 以下是內容index.jsp:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n pageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n \u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;h1\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World From Struts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/h1\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;form\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;label\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003efor\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003ePlease enter your name\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/label\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"text\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"submit\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Say Hello\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e struts.xml 應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e \r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 現在右擊項目名稱,並單擊Export \u0026gt; WAR File創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat 服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Hello World Input\" src=\"https://asset.1ju.org/cmsstatic/struts2-hello-world-3.jpg\"\u003e \n\u003cp\u003e 輸入一個值「Struts2」,並提交頁面。應該看到以下頁面:\u003c/p\u003e \n\u003cimg alt=\"Exception Output\" src=\"https://asset.1ju.org/cmsstatic/struts2-17.jpg\"\u003e \n\u003cp\u003e 在上面的例子所示,默認的異常攔截器做了非常出色的處理異常。現在,讓我們創建一個專用的錯誤頁面,我們的例外。創建一個文件名爲error.jsp 如以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\tpageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n This is my custom error page\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e Let us now configure Struts to use this this error page in case of an exception. Let us modify the\u003cb\u003estruts.xml\u003c/b\u003e\u0026nbsp;as follows:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;exception-mapping\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eexception\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"java.lang.NullPointerException\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eresult\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"error\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"error\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/Error.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在上面的例子所示,現在我們已經配置 Struts使用專用error.jsp的NullPointerException異常。如果現在重新運行該程序,現在看到下面的輸出:\u003c/p\u003e \n\u003cimg alt=\"Hello World Output\" src=\"https://asset.1ju.org/cmsstatic/struts2-18.jpg\"\u003e \n\u003cp\u003e 此外,Struts2 框架自帶的「日誌」攔截記錄異常。使記錄器記錄的未捕獲異常,我們可以很容易地看堆棧跟蹤和工作出了什麼錯誤。\u003c/p\u003e \n\u003ch2\u003e 全局異常映射:\u003c/h2\u003e \n\u003cp\u003e 我們已經看到了我們可以處理特定的異常行動。我們可以設置一個例外,全局將適用於所有的行動。例如,要捕獲 NullPointerException異常,我們可以添加\u0026lt;global-exception-mappings...\u0026gt;標籤裏面\u0026lt;package...\u0026gt;標籤和其\u0026lt;result...\u0026gt;標籤應加在\u0026lt;行動.. \u0026gt;標記在struts.xml文件如下:\u0026nbsp;\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;global-exception-mappings\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;exception-mapping\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eexception\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"java.lang.NullPointerException\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eresult\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"error\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/global-exception-mappings\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"error\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/Error.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"a1:T4b0d,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 正如前面提到的,Struts提供了兩種形式的配置。傳統的方式是使用對所有配置struts.xml文件。到目前爲止,我們已經看到了這樣的例子很多。 Struts配置的另一種方法是使用Java5註釋功能。使用Struts 註解,我們可以實現零配置。\u003c/p\u003e \n\u003cp\u003e 要開始在你的項目中使用註釋,確保WebContent/WEB-INF/lib文件夾中的jar文件包括以下:\u0026nbsp;\u0026nbsp;\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e struts2-convention-plugin-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e asm-x.y.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e antlr-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e commons-fileupload-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e commons-io-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e commons-lang-x.y.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e commons-logging-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e commons-logging-api-x.y.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e freemarker-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e javassist-.xy.z.GA\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e ognl-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e struts2-core-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e xwork-core.x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e 現在,讓我們看看你如何能做到配置在struts.xml文件,取而代之的是註解。\u003c/p\u003e \n\u003cp\u003e Struts2註釋的概念的解釋,我們需要重新考慮我們的驗證爲例說明在\u0026nbsp;Struts2的驗證\u0026nbsp;一章中。\u003c/p\u003e \n\u003cp\u003e 在這裏,我們將採取一個例子,僱員Employee\u0026nbsp;將被捕獲的姓名和年齡使用一個簡單的頁面,我們將會把兩個驗證,以確保使用總是進入一個名字和年齡應該是在28和65之間。所以,讓我們先從主JSP頁面的例子。\u003c/p\u003e \n\u003ch2\u003e 創建主頁:\u003c/h2\u003e \n\u003cp\u003e 讓我們寫主JSP頁面文件index.jsp,這將被用來收集上述員工的相關信息。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n pageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmployee Form\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:form\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"empinfo\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"post\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:textfield\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Name\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003esize\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"20\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:textfield\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"age\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Age\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003esize\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"20\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:submit\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"submit\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Submit\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ealign\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"center\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在index.jsp使用Struts的標籤,我們還沒有覆蓋,但我們將研究這些標籤相關的章節。但現在,假設s:textfield\u0026nbsp;標籤打印一個輸入字段\u0026nbsp;s:submit\u0026nbsp;打印一個提交按鈕。我們已經使用label屬性標籤,每個標籤每個標籤創建。\u003c/p\u003e \n\u003ch2\u003e 創建視圖:\u003c/h2\u003e \n\u003cp\u003e 我們將使用JSP文件的success.jsp將調用的情況下定義的動作返回SUCCESS。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\tpageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eSuccess\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Employee Information is captured successfully.\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建動作:\u003c/h2\u003e \n\u003cp\u003e 這是將用於註釋的地方。讓我們重新定義行動Employee類的註釋,然後添加一個方法稱爲validate()\u0026nbsp;,如下所示在Employee.java文件。請確保操作類擴展ActionSupport類,否則validate方法將不會被執行。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e org\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eapache\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003econvention\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eannotation\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eAction\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e org\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eapache\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003econvention\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eannotation\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eResult\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e org\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eapache\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003econvention\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eannotation\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eResults\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003evalidator\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eannotations\u003c/span\u003e\u003cspan class=\"pun\"\u003e.*;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"lit\"\u003e@Results\u003c/span\u003e\u003cspan class=\"pun\"\u003e({\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@Result\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e location\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/success.jsp\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e),\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@Result\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"input\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e location\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/index.jsp\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e})\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@Action\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/empinfo\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@RequiredFieldValidator\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003e message \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"The name is required\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@IntRangeFieldValidator\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003emessage \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"Age must be in between 28 and 65\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n min \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"29\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e max \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"65\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e getAge\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setAge\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eage \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在這個例子中,我們已經使用了一些註解。讓我逐個說明:\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e 首先,我們已經Result註解。結果註解的結果是一個集合。結果註解下,我們有兩個結果註釋。結果註釋的名稱對應的執行方法的結果。它們還含有一個視圖應擔任相應的execute()\u0026nbsp;返回值的位置。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 下一個註解是行動註解。這是用來修飾\u0026nbsp;execute()方法。操作方法也需要一個值,該URL上調用操作。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 最後,使用兩個驗證的註解。已經配置了所需的字段驗證的年齡字段\"name「字段和整數範圍驗證。也指定了自定義驗證消息。\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003ch2\u003e 配置文件:\u003c/h2\u003e \n\u003cp\u003e 我們不需要struts.xml 配置文件,讓我們刪除該文件,並讓我們檢查web.xml文件中的內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;init-param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts.devMode\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param-value\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003etrue\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param-value\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/init-param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 現在,右鍵點擊項目名稱,並單擊\u0026nbsp;Export \u0026gt; WAR File創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Email User Input\" src=\"https://asset.1ju.org/cmsstatic/struts2-email-1.jpg\"\u003e \n\u003cp\u003e 現在不輸入任何所需信息,只需點擊「\u003cb\u003eSubmit\u003c/b\u003e\u0026nbsp;」按鈕。將看到以下結果:\u0026nbsp;\u003c/p\u003e \n\u003cimg alt=\"Error\" src=\"https://asset.1ju.org/cmsstatic/struts2-15.jpg\"\u003e \n\u003cp\u003e 輸入所需的信息,但輸入了錯誤的「From\u0026nbsp;」字段,讓我們說「test」和年齡爲30名,最後點擊「Submit\u0026nbsp;」按鈕。將看到以下結果:\u003c/p\u003e \n\u003cimg alt=\"Success\" src=\"https://asset.1ju.org/cmsstatic/struts2-16.jpg\"\u003e \n\u003ch2\u003e Struts 2的註釋類型:\u003c/h2\u003e \n\u003cp\u003e Struts 2 應用程序可以使用Java5註釋作爲替代XML和Java屬性配置。可以檢查最重要的註解涉及不同類別的列表:\u003c/p\u003e \n\u003cp\u003e Struts 2的註釋類型.\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"a2:T815b,"])</script><script>self.__next_f.push([1,"\u003cp\u003e Struts 2 應用程序可以使用Java5註釋作爲替代XML和Java屬性配置。這裏是清單的不同的類別有關的最重要的註解:\u003c/p\u003e \n\u003ch2\u003e 命名空間註釋(動作註釋):\u003c/h2\u003e \n\u003cp\u003e @ Namespace註釋允許在Action類中,而不是基於零配置的約定動作的命名空間的定義。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"lit\"\u003e@Namespace\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/content\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e...\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 結果註釋 - (動作譯註):\u003c/h2\u003e \n\u003cp\u003e @ Result註解允許在Action類中,而不是一個XML文件中定義的動作結果。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"lit\"\u003e@Result\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e value\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/success.jsp\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e...\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 結果註釋 - (動作譯註):\u003c/h2\u003e \n\u003cp\u003e @ Results註解定義了一套動作的結果。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"lit\"\u003e@Results\u003c/span\u003e\u003cspan class=\"pun\"\u003e({\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@Result\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e value\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/success.jsp\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e),\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@Result\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"error\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e value\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/error.jsp\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e})\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e...\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 註釋後(攔截註釋):\u003c/h2\u003e \n\u003cp\u003e @After註解標誌着一個需要調用後的主要操作方法和執行結果的操作方法。返回值將被忽略。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@After\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e isValid\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eValidationException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"com\"\u003e// validate model object, throw exception if failed\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"com\"\u003e// perform secure action\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 註釋之前(攔截註釋):\u003c/h2\u003e \n\u003cp\u003e @ Before註釋標記需要一個操作方法的主要操作方法之前被調用執行結果。返回值將被忽略。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@Before\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e isAuthorized\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eAuthenticationException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"com\"\u003e// authorize request, throw exception if failed\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"com\"\u003e// perform secure action\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e BeforeResult註釋 - (攔截註釋):\u003c/h2\u003e \n\u003cp\u003e @ BeforeResult註解標誌着一個結果之前需要執行的操作方法。返回值將被忽略。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@BeforeResult\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e isValid\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eValidationException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"com\"\u003e// validate model object, throw exception if failed\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"com\"\u003e// perform action\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e ConversionErrorFieldValidator註釋 - (驗證譯註):\u003c/h2\u003e \n\u003cp\u003e 此驗證註解如果有任何轉換錯誤進行了實地檢查,並適用於他們,如果他們存在。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@ConversionErrorFieldValidator\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003emessage \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"Default message\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n key \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"i18n.key\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e shortCircuit \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003etrue\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e DateRangeFieldValidator註釋 - (驗證譯註):\u003c/h2\u003e \n\u003cp\u003e 這驗證註解檢查日期字段的值在指定範圍內。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@DateRangeFieldValidator\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003emessage \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"Default message\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n key \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"i18n.key\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e shortCircuit \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003etrue\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n min \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"2005/01/01\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e max \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"2005/12/31\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getDOB\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e dob\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e DoubleRangeFieldValidator註釋 - (驗證譯註):\u003c/h2\u003e \n\u003cp\u003e 此驗證註解檢查雙字段有一個值,該值在指定範圍內。如果既不最小或最大,什麼都不會做的。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@DoubleRangeFieldValidator\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003emessage \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"Default message\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n key \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"i18n.key\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e shortCircuit \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003etrue\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n minInclusive \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"0.123\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e maxInclusive \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"99.987\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getIncome\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e income\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e EmailValidator註釋 - (驗證譯註):\u003c/h2\u003e \n\u003cp\u003e 這驗證註解檢查一個字段是一個有效的E-mail地址,如果它包含一個非空的字符串。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@EmailValidator\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003emessage \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"Default message\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n key \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"i18n.key\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e shortCircuit \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003etrue\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getEmail\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e email\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e ExpressionValidator註釋 - (驗證譯註):\u003c/h2\u003e \n\u003cp\u003e 這種非字段級驗證驗證所提供的正則表達式。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"lit\"\u003e@ExpressionValidator\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003emessage \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"Default message\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e key \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"i18n.key\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\nshortCircuit \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003etrue\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e expression \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"an OGNL expression\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e IntRangeFieldValidator註釋 - (驗證譯註):\u003c/h2\u003e \n\u003cp\u003e 這驗證註解檢查一個數字字段的值在指定的範圍內。如果既不最小或最大,什麼都不會做的。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@IntRangeFieldValidator\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003emessage \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"Default message\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n key \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"i18n.key\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e shortCircuit \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003etrue\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n min \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"0\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e max \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"42\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getAge\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e RegexFieldValidator 註釋 - (驗證譯註):\u003c/h2\u003e \n\u003cp\u003e 這個註解驗證一個字符串字段,使用正則表達式。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"lit\"\u003e@RegexFieldValidator\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003e key \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"regex.field\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e expression \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"yourregexp\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e RequiredFieldValidator 註釋 - (驗證譯註):\u003c/h2\u003e \n\u003cp\u003e 這驗證註解檢查一個字段不爲空。標註必須被應用在方法層面。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@RequiredFieldValidator\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003emessage \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"Default message\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n key \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"i18n.key\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e shortCircuit \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003etrue\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getAge\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e age\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e RequiredStringValidator註釋 - (驗證譯註):\u003c/h2\u003e \n\u003cp\u003e 這驗證註解檢查一個字符串字段不爲空(即非空,長度\u0026gt; 0)。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@RequiredStringValidator\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003emessage \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"Default message\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n key \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"i18n.key\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e shortCircuit \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003etrue\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e trim \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003etrue\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e StringLengthFieldValidator註釋 - (驗證譯註):\u003c/h2\u003e \n\u003cp\u003e 這個驗證檢查字符串字段是合適的長度。假定該字段是一個字符串。如果設置既不是minLength\u0026nbsp;也不是最大長度,什麼都不會做。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@StringLengthFieldValidator\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003emessage \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"Default message\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n key \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"i18n.key\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e shortCircuit \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003etrue\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n trim \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003etrue\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e minLength \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"5\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e maxLength \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"12\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e UrlValidator註釋 - (驗證譯註):\u003c/h2\u003e \n\u003cp\u003e 這個驗證檢查一個字段是一個有效的URL。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@UrlValidator\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003emessage \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"Default message\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n key \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"i18n.key\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e shortCircuit \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003etrue\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getURL\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e url\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 驗證註釋 - (驗證譯註):\u003c/h2\u003e \n\u003cp\u003e 如果想使用多個相同類型的註釋,這些註釋必須嵌套在@Validations()\u0026nbsp;註釋。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@Validations\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n requiredFields \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"lit\"\u003e@RequiredFieldValidator\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003etype \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eValidatorType\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eSIMPLE\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n fieldName \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"customfield\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n message \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"You must enter a value for field.\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)},\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n requiredStrings \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"lit\"\u003e@RequiredStringValidator\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003etype \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eValidatorType\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eSIMPLE\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n fieldName \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"stringisrequired\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n message \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"You must enter a value for string.\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e CustomValidator註釋 - (驗證譯註):\u003c/h2\u003e \n\u003cp\u003e 這個註解可以用於自定義驗證。使用ValidationParameter的註釋,以提供額外的\u0026nbsp;params.\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"lit\"\u003e@CustomValidator\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003etype \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"customValidatorName\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e fieldName \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"myField\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 轉換註釋 - (類型轉換註釋):\u003c/h2\u003e \n\u003cp\u003e 這是一個標記註釋類型轉換類型級別。轉換註釋必須應用在類型級別。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"lit\"\u003e@Conversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eConversionAction\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eimplements\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eAction\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e CreateIfNull註釋 - (類型轉換註釋):\u003c/h2\u003e \n\u003cp\u003e 這個註解設置類型轉換CreateIfNull。必須應用在域或方法級CreateIfNull註解。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"lit\"\u003e@CreateIfNull\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003e value \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003etrue\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"typ\"\u003eUser\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e users\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 元素註釋 - (類型轉換註釋):\u003c/h2\u003e \n\u003cp\u003e 這個註解設置元素進行類型轉換。必須應用在字段域或方法級元素的註解。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"lit\"\u003e@Element\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003e value \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eacme\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eUser\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"typ\"\u003eUser\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e userList\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 關鍵註釋 - (類型轉換註釋):\u003c/h2\u003e \n\u003cp\u003e 這個註解設置進行類型轉換的關鍵。必須應用在域或方法級的關鍵註解。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"lit\"\u003e@Key\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003e value \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003elang\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eLong\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eMap\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"typ\"\u003eLong\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eUser\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e userMap\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e KeyProperty註釋 - (類型轉換註釋):\u003c/h2\u003e \n\u003cp\u003e 這個註解設置類型轉換KeyProperty。必須應用在域或方法級KeyProperty註解。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"lit\"\u003e@KeyProperty\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003e value \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"userName\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eprotected\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"typ\"\u003eUser\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e users \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enull\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e TypeConversion註釋 - (類型轉換註釋):\u003c/h2\u003e \n\u003cp\u003e 這個註解的註解是用於類和應用程序的轉換規則。註解可以應用於TypeConversion在屬性和方法的級別。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"lit\"\u003e@TypeConversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003erule \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eConversionRule\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eCOLLECTION\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\nconverter \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"java.util.String\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setUsers\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e users \u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eusers \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e users\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"a3:T1988,"])</script><script>self.__next_f.push([1,"\u003cp\u003e Struts 2 的標籤有一組標籤,更容易控制流程頁面執行。以下是重要的Struts2控制標籤列表:\u003c/p\u003e \n\u003ch2\u003e if /else 標籤:\u003c/h2\u003e \n\u003cp\u003e 這些標籤執行可在每一種語言找到的一種基本條件流程。 'If'標籤可用於本身或與「Else If''標籤和/或單/多'Else'標籤,如下圖所示:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;s:if\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etest\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{false}\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;div\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eWill Not Be Executed\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/div\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:if\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:elseif\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etest\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{true}\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;div\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eWill Be Executed\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/div\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:elseif\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:else\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;div\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eWill Not Be Executed\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/div\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:else\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e if else 實例\u003c/p\u003e \n\u003ch2\u003e iterator標籤:\u003c/h2\u003e \n\u003cp\u003e 這些迭代器將遍歷一個值。一個可迭代的值可以是任何的java.util.Collection 和 java.util.Iterator。雖然超過一個迭代器遍歷排序,可以使用標籤對結果進行排序或子集標籤的列表或者數組得到一個子集。\u003c/p\u003e \n\u003cp\u003e 下面的示例檢索當前對象的值棧getDays()方法的值,並用它來遍歷。\u0026lt;s:property/\u0026gt;標籤打印出迭代器的當前值。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;s:iterator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"days\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;p\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eday is: \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property/\u0026gt;\u0026lt;/p\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:iterator\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e iterator 實例\u003c/p\u003e \n\u003ch2\u003e merge標籤:\u003c/h2\u003e \n\u003cp\u003e 這些合併標記需要兩個或兩個以上的列表作爲參數,並把它們合併在一起,如下所示:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;s:merge\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evar\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myMergedIterator\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{myList1}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{myList2}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{myList3}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:merge\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:iterator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{#myMergedIterator}\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:iterator\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e merge標籤實例\u003c/p\u003e \n\u003ch2\u003e append 標籤:\u003c/h2\u003e \n\u003cp\u003e 這些append標籤需要兩個或兩個以上的列表作爲參數,並追加它們放在一起,如下圖所示:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;s:append\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evar\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myAppendIterator\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{myList1}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{myList2}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{myList3}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:append\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:iterator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{#myAppendIterator}\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:iterator\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e append標籤實例\u003c/p\u003e \n\u003ch2\u003e generator 標籤:\u003c/h2\u003e \n\u003cp\u003e generator標籤生成一個迭代器的基礎上提供val屬性。以下generator標籤生成一個迭代器,並使用迭代器標籤打印出來。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;s:generator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eval\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{'aaa,bbb,ccc,ddd,eee'}\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:generator\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e generator標籤實例\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"a4:T6d31,"])</script><script>self.__next_f.push([1,"\u003ch2\u003e 創建動作類:\u003c/h2\u003e \n\u003cp\u003e 首先,讓我們創建一個簡單的類叫做Employee.java,它看起來像:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eArrayList\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e org\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eapache\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eSubsetIteratorFilter\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eDecider\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(){}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003edepartment \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n employees \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eArrayList\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"George\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Recruitment\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Danielle\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Accounts\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Melissa\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Recruitment\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Rose\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Accounts\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n contractors \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eArrayList\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Mindy\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Database\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Vanessa\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Network\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eDecider\u003c/span\u003e\u003cspan class=\"pln\"\u003e getRecruitmentDecider\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eDecider\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eboolean\u003c/span\u003e\u003cspan class=\"pln\"\u003e decide\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eObject\u003c/span\u003e\u003cspan class=\"pln\"\u003e element\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e employee \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003eelement\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e employee\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egetDepartment\u003c/span\u003e\u003cspan class=\"pun\"\u003e().\u003c/span\u003e\u003cspan class=\"pln\"\u003eequals\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Recruitment\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e};\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getDepartment\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setDepartment\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003edepartment \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e getEmployees\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setEmployees\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eemployees \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e getContractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setContractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003econtractors \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e Employee類有兩個屬性 -\u0026nbsp;name\u0026nbsp;和\u0026nbsp;department,我們也有兩個員工名單 -\u0026nbsp;employees\u0026nbsp;和contractors。我們有一個方法叫做getRecruitmentDecider,返回Decider\u0026nbsp;對象。Decider\u0026nbsp;實現返回true,如果僱員招聘部門工作,否則返回false。\u003c/p\u003e \n\u003cp\u003e 接下來,讓我們創建一個DepartmentComparator比較Employee對象:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eComparator\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eDepartmentComparator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eimplements\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eComparator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e compare\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e e1\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e e2\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e e1\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egetDepartment\u003c/span\u003e\u003cspan class=\"pun\"\u003e().\u003c/span\u003e\u003cspan class=\"pln\"\u003ecompareTo\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003ee2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egetDepartment\u003c/span\u003e\u003cspan class=\"pun\"\u003e());\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@Override\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e compare\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eObject\u003c/span\u003e\u003cspan class=\"pln\"\u003e arg0\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eObject\u003c/span\u003e\u003cspan class=\"pln\"\u003e arg1\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\t\u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"lit\"\u003e0\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在上面的例子所示,部門比較的基礎上按字母順序排列的部門員工進行比較。\u003c/p\u003e \n\u003ch2\u003e 創建視圖\u003c/h2\u003e \n\u003cp\u003e 創建一個文件叫做employee.jsp 有以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmployees\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;b\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eExample of Iterator Tag\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/b\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:iterator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"employees\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e , \r\n\t\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"department\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;br/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;b\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmployees sorted by Department\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/b\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:bean\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.DepartmentComparator\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003evar\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"deptComparator\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:sort\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ecomparator\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"deptComparator\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003esource\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"employees\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e , \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"department\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:sort\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;br/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;b\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eSubSet Tag - Employees working in Recruitment department \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/b\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:subset\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003edecider\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"recruitmentDecider\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003esource\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"employees\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e , \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"department\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:subset\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;br/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;b\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eSubSet Tag - Employees 2 and 3 \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/b\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:subset\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003estart\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ecount\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"2\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003esource\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"employees\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e , \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"department\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:subset\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 讓我們通過使用一個標籤:\u003c/p\u003e \n\u003ch3\u003e iterator標籤\u003c/h3\u003e \n\u003cp\u003e 我們使用iterator標籤要經過員工列表。我們提供「employees」屬性iterator標籤作爲源。在body迭代器標籤,我們現在有訪問Employee對象在員工列表。我們打印隨後他們部門的員工的名字。\u003c/p\u003e \n\u003ch3\u003e SORT\u0026nbsp;標籤\u003c/h3\u003e \n\u003cp\u003e 首先,我們聲明一個bean DepartmentComparator。我們給這個bean名稱deptComparator。然後,我們使用的形式的標記,並指定作爲源和作爲比較器使用的的「deptComparator」的「僱員」列表中。然後,按照前面的例子中,我們遍歷列表和打印員工。正如可以看到的輸出,打印部門排序的員工列表\u003c/p\u003e \n\u003ch3\u003e SUBSET\u0026nbsp;標籤\u003c/h3\u003e \n\u003cp\u003e 用來獲取的列表或陣列的一個子集,該子集標記。我們有兩種口味的子標籤。在第一個例子,我們使用recrutimentDecider 招聘部(請參閱getRecruitmentDecider()方法在Employee.java)工作的員工以獲取列表。\u003c/p\u003e \n\u003cp\u003e 在第二個例子中,我們沒有使用任何決策者,而是我們所追求的元素列表中的第2和第3。子標記需要兩個參數「count」和「start」。 「start」的子集確定的起點,「count」的子集確定的長度。\u003c/p\u003e \n\u003ch2\u003e 配置文件\u003c/h2\u003e \n\u003cp\u003e struts.xml 應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"employee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.Employee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/employee.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e web.xml中,應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊\u0026nbsp;Export \u0026gt; WAR File創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/employee.action。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Struts iterator tag\" src=\"https://asset.1ju.org/cmsstatic/struts2-iterator-1.jpg\"\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"a5:T36a3,"])</script><script>self.__next_f.push([1,"\u003ch2\u003e 創建動作類:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHelloWorldAction\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建視圖\u003c/h2\u003e \n\u003cp\u003e 讓我們有index.jsp文件如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\tpageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;h1\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World From Struts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/h1\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;form\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;label\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003efor\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003ePlease pick a name\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/label\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;select\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;option\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Mike\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eMike\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/option\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;option\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Jason\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eJason\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/option\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;option\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Mark\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eMark\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/option\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/select\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;input\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"submit\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Say Hello\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 接下來 helloWorld.jsp 演示使用,\u0026nbsp;if, else\u0026nbsp;和\u0026nbsp;elseif\u0026nbsp;標籤:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eExample of If and Else\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;b\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eExample of If and Else\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/b\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:if\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etest\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name=='Mike'\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n You have selected 'Mike'. \r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:if\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:elseif\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etest\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name=='Jason'\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n You have selected 'Jason'\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:elseif\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:else\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n You have not selected 'Mike' or 'Jason'.\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:else\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在這裏,如果標籤返回true,如果「test」屬性中指定的條件返回true。在我們的例子中,我們比較反對「Mike」。如果這個名字是Mike,標籤返回true,我們打印的字符串,否則「elseif」塊被執行,如果不滿意,那麼被執行else塊。這是從傳統的,如果沒有什麼不同,if, else if\u0026nbsp;可以在Java語言中。\u003c/p\u003e \n\u003ch2\u003e 配置文件\u003c/h2\u003e \n\u003cp\u003e struts.xml 應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e web.xml 應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊\u0026nbsp;Export \u0026gt; WAR File創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Struts If Tag input\" src=\"https://asset.1ju.org/cmsstatic/else-1.jpg\"\u003e \n\u003cp\u003e 現在選擇「Mark」,並提交頁面。您應該看到翻頁\u003c/p\u003e \n\u003cimg alt=\"Struts If Tag output\" src=\"https://asset.1ju.org/cmsstatic/else-2.jpg\"\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"a6:T5cda,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 如果有兩個列表A和B的值,A1,A2和B1,B2。合併列表,會給出A1,B1,A2,B2。\u003c/p\u003e \n\u003ch2\u003e 創建動作類:\u003c/h2\u003e \n\u003cp\u003e 首先,讓我們創建一個簡單的類叫做Employee.java,它看起來像:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eArrayList\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e org\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eapache\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eSubsetIteratorFilter\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eDecider\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(){}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003edepartment \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n employees \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eArrayList\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"George\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Recruitment\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Danielle\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Accounts\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Melissa\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Recruitment\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Rose\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Accounts\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n contractors \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eArrayList\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Mindy\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Database\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Vanessa\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Network\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eDecider\u003c/span\u003e\u003cspan class=\"pln\"\u003e getRecruitmentDecider\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eDecider\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eboolean\u003c/span\u003e\u003cspan class=\"pln\"\u003e decide\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eObject\u003c/span\u003e\u003cspan class=\"pln\"\u003e element\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e employee \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003eelement\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e employee\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egetDepartment\u003c/span\u003e\u003cspan class=\"pun\"\u003e().\u003c/span\u003e\u003cspan class=\"pln\"\u003eequals\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Recruitment\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e};\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getDepartment\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setDepartment\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003edepartment \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e getEmployees\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setEmployees\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eemployees \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e getContractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setContractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003econtractors \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e Employee類有兩個屬性 -\u0026nbsp;name\u0026nbsp;和\u0026nbsp;department,我們也有兩個員工名單 -\u0026nbsp;employees\u0026nbsp;和contractors。我們有一個方法叫做getRecruitmentDecider,返回Decider\u0026nbsp;對象。Decider\u0026nbsp;實現返回true,如果僱員招聘部門工作,否則返回false。\u003c/p\u003e \n\u003cp\u003e 接下來,讓我們創建一個DepartmentComparator 比較Employee對象:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eComparator\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eDepartmentComparator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eimplements\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eComparator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e compare\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e e1\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e e2\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e e1\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egetDepartment\u003c/span\u003e\u003cspan class=\"pun\"\u003e().\u003c/span\u003e\u003cspan class=\"pln\"\u003ecompareTo\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003ee2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egetDepartment\u003c/span\u003e\u003cspan class=\"pun\"\u003e());\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@Override\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e compare\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eObject\u003c/span\u003e\u003cspan class=\"pln\"\u003e arg0\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eObject\u003c/span\u003e\u003cspan class=\"pln\"\u003e arg1\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\t\u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"lit\"\u003e0\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在上面的例子所示,部門比較的基礎上按字母順序排列的部門員工進行比較。\u003c/p\u003e \n\u003ch2\u003e 創建視圖\u003c/h2\u003e \n\u003cp\u003e 創建一個文件叫做employee.jsp以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmployees\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;b\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmployees and Contractors Merged together\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/b\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;br\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:merge\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"allemployees\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"employees\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"contractors\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:merge\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:iterator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"allemployees\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e,\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"department\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 合併標記需要兩個或兩個以上的列表作爲參數。我們需要給合併一個id,這樣我們就可以重用它。在這個例子中,我們提供了作爲參數傳遞給員工和承包商的合併標籤。然後,我們使用「allemployees」ID合併列表遍歷並打印員工的細節。\u003c/p\u003e \n\u003ch2\u003e 配置文件\u003c/h2\u003e \n\u003cp\u003e struts.xml中應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"employee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.Employee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/employee.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e web.xml中,應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊\u0026nbsp;Export \u0026gt; WAR File創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/employee.action。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Struts merge tag\" src=\"https://asset.1ju.org/cmsstatic/struts2-merge-1.jpg\"\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"a7:T5d44,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 說,如果有兩個列表A和B的值A1,A2和B1,B2。合併列表,會給你的A1,A2,B1,B2,而append 名單,會有A1,A2,B1,B2。\u003c/p\u003e \n\u003ch2\u003e 創建動作類:\u003c/h2\u003e \n\u003cp\u003e 首先,讓我們創建一個簡單的類叫做Employee.java,它看起來像:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eArrayList\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e org\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eapache\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eSubsetIteratorFilter\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eDecider\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(){}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003edepartment \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n employees \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eArrayList\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"George\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Recruitment\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Danielle\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Accounts\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Melissa\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Recruitment\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Rose\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Accounts\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n contractors \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eArrayList\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Mindy\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Database\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Vanessa\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Network\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e));\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eDecider\u003c/span\u003e\u003cspan class=\"pln\"\u003e getRecruitmentDecider\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eDecider\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eboolean\u003c/span\u003e\u003cspan class=\"pln\"\u003e decide\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eObject\u003c/span\u003e\u003cspan class=\"pln\"\u003e element\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e employee \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003eelement\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e employee\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egetDepartment\u003c/span\u003e\u003cspan class=\"pun\"\u003e().\u003c/span\u003e\u003cspan class=\"pln\"\u003eequals\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Recruitment\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e};\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getDepartment\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setDepartment\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003edepartment \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e department\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e getEmployees\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setEmployees\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eemployees \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e employees\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e getContractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setContractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003econtractors \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e contractors\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e Employee類有兩個屬性 -\u0026nbsp;name\u0026nbsp;和\u0026nbsp;department,我們也有兩個員工名單 -\u0026nbsp;employees\u0026nbsp;和contractors。我們有一個方法叫做getRecruitmentDecider,返回Decider\u0026nbsp;對象。Decider\u0026nbsp;實現返回true,如果僱員招聘部門工作,否則返回false。\u003c/p\u003e \n\u003cp\u003e 接下來,讓我們創建一個DepartmentComparator比較Employee對象:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eComparator\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eDepartmentComparator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eimplements\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eComparator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e compare\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e e1\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEmployee\u003c/span\u003e\u003cspan class=\"pln\"\u003e e2\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e e1\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egetDepartment\u003c/span\u003e\u003cspan class=\"pun\"\u003e().\u003c/span\u003e\u003cspan class=\"pln\"\u003ecompareTo\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003ee2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egetDepartment\u003c/span\u003e\u003cspan class=\"pun\"\u003e());\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@Override\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e compare\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eObject\u003c/span\u003e\u003cspan class=\"pln\"\u003e arg0\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eObject\u003c/span\u003e\u003cspan class=\"pln\"\u003e arg1\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\t\u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"lit\"\u003e0\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在上面的例子所示,部門比較的基礎上按字母順序排列的部門員工進行比較。\u003c/p\u003e \n\u003ch2\u003e 創建視圖\u003c/h2\u003e \n\u003cp\u003e 創建一個文件叫做employee.jsp以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmployees\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;b\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmployees and Contractors Merged together\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/b\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;br\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:append\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"allemployees\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"employees\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"contractors\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:append\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:iterator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"allemployees\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e,\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"department\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e append標籤需要兩個或兩個以上列出作爲參數。我們需要給予追加一個id,這樣我們就可以重用它。在這個例子中,我們提供了作爲參數傳遞給員工和承包商的附加標籤。然後,我們使用「allemployees」ID遍歷附加列表和打印員工的細節。\u003c/p\u003e \n\u003ch2\u003e 配置文件\u003c/h2\u003e \n\u003cp\u003e struts.xml中應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"employee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.Employee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/employee.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e web.xml中,應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊Export \u0026gt; WAR File\u0026nbsp;創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/employee.action。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Struts append tag\" src=\"https://asset.1ju.org/cmsstatic/struts2-append-1.jpg\"\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"a8:T29bb,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 我們經常遇到的一些情況,必須創建列表或數組上遍歷列表。可以創建列表或數組使用scriptlet或者可以使用generator\u0026nbsp;標籤。\u0026nbsp;tag.\u003c/p\u003e \n\u003ch2\u003e 創建action類:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHelloWorldAction\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建視圖\u003c/h2\u003e \n\u003cp\u003e 下列 helloWorld.jsp 展示使用generator\u0026nbsp;標記:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;h2\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eExample of Generator Tag\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/h2\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;h3\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eThe colours of rainbow:\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/h3\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:generator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eval\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{'Violet,Indigo,Blue,\r\n Green,Yellow,Orange,Red '}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ecount\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"7\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eseparator\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\",\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:generator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\t\r\n\t\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在這裏,我們創建一個generator\u0026nbsp;標籤,我們要求它解析的字符串,其中包含逗號分隔的列表,形成了彩虹的顏色。我們告訴發電機標籤,分隔符是「,」我們希望所有七個值在列表中。如果我們只關心前三個值,然後我們會設置計數至3。發電機標記在體內,我們使用了迭代器去通過由generator\u0026nbsp;標記創建的值的打印屬性的值。\u003c/p\u003e \n\u003ch2\u003e 配置文件\u003c/h2\u003e \n\u003cp\u003e struts.xml 應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e web.xml 應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊Export \u0026gt; WAR File\u0026nbsp;創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/hello.action。這會給出以下畫面:\u0026nbsp;\u003c/p\u003e \n\u003cimg alt=\"Struts generator tag\" src=\"https://asset.1ju.org/cmsstatic/struts2-generator-1.jpg\"\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"a9:T3cd6,"])</script><script>self.__next_f.push([1,"\u003cp\u003e Struts 2 的數據標籤主要用於操作頁面上顯示的數據。下面列出的是重要的數據標籤:\u003c/p\u003e \n\u003ch2\u003e action標籤:\u003c/h2\u003e \n\u003cp\u003e 此標記使開發人員能夠直接從JSP頁面調用動作指定動作的名稱和一個可選的命名空間。標籤的主體內容是用行動來呈現結果。任何結果處理器定義在struts.xml這個動作將被忽略,指定除非executeResult參數。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;div\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eTag to execute the action\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/div\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;br\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"actionTagAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eexecuteResult\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;br\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;div\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eTo invokes special method in action class\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/div\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;br\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"actionTagAction!specialMethod\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eexecuteResult\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e action標籤實例\u003c/p\u003e \n\u003ch2\u003e include 標籤:\u003c/h2\u003e \n\u003cp\u003e 將用於另一個JSP頁面中包含另一個JSP文件。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e\u0026lt;-- First Syntax --\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:include\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myJsp.jsp\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u0026lt;-- Second Syntax --\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:include\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myJsp.jsp\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"param1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"value2\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"param2\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"value2\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:include\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u0026lt;-- Third Syntax --\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:include\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myJsp.jsp\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"param1\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003evalue1\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"param2\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003evalue2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:include\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e include 標籤實例\u003c/p\u003e \n\u003ch2\u003e bean 標籤:\u003c/h2\u003e \n\u003cp\u003e bean標籤實例化一個類,符合JavaBeans規範。此標記的主體可以包含多個元素:參數設置該類別的任何mutator方法。如果var屬性設置在BeanTag上,它會放置到堆棧上下文的bean實例。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;s:bean\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"org.apache.struts2.util.Counter\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evar\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"counter\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"first\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"20\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"last\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"25\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:bean\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e bean標籤實例\u003c/p\u003e \n\u003ch2\u003e date標籤:\u003c/h2\u003e \n\u003cp\u003e date標籤,將讓在一個快速和容易的方式格式化日期。可以指定自定義格式(如「DD/ MM / YYYY HH:MM」),可以生成易讀的符號(如「2小時,14分鐘」),或者可以依傍預定義的格式關鍵 struts.date.format 屬性文件。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;s:date\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"person.birthday\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eformat\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"dd/MM/yyyy\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:date\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"person.birthday\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eformat\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{getText('some.i18n.key')}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:date\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"person.birthday\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003enice\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:date\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"person.birthday\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e date標籤實例\u003c/p\u003e \n\u003ch2\u003e param 標籤:\u003c/h2\u003e \n\u003cp\u003e 這些參數標籤可用於參數其他標籤。該標籤具有以下兩個參數。\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e name (String) - 參數的名稱\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e value (Object) - 參數的值\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;pre\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;ui:component\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;ui:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"key\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"[0]\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;ui:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"value\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"[1]\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;ui:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"context\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"[2]\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/ui:component\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/pre\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e param標籤實例\u003c/p\u003e \n\u003ch2\u003e property 標籤:\u003c/h2\u003e \n\u003cp\u003e 這些屬性標籤是用來獲取屬性的值,這將默認堆棧的頂部,如果沒有指定。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;s:push\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myBean\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"com\"\u003e\u0026lt;!-- Example 1: --\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myBeanProperty\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"com\"\u003e\u0026lt;!-- Example 2: --\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eTextUtils\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myBeanProperty\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003edefault\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"a default value\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:push\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e property標籤實例\u003c/p\u003e \n\u003ch2\u003e push 標籤:\u003c/h2\u003e \n\u003cp\u003e 這些push標籤是用來推堆棧簡化使用。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;s:push\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"user\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:propery\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"firstName\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:propery\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"lastName\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:push\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e push標籤實例\u003c/p\u003e \n\u003ch2\u003e set 標籤:\u003c/h2\u003e \n\u003cp\u003e 這些set標籤分配一個值給一個變量在指定的範圍內。它是有用的,當想分配一個變量到複雜的表達式,然後簡單地引用變量每次而不是複雜的表達。可用的範圍是application, session, request, page和行動。\u0026nbsp;\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;s:set\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myenv\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"environment.name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myenv\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e set 標籤實例\u003c/p\u003e \n\u003ch2\u003e text 標籤:\u003c/h2\u003e \n\u003cp\u003e 這些\u0026nbsp;text\u0026nbsp;標籤是用來呈現一個i18n 文本消息。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"com\"\u003e\u0026lt;!-- First Example --\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:i18n\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.action.test.i18n.Shop\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:text\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"main.title\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:i18n\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"com\"\u003e\u0026lt;!-- Second Example --\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:text\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"main.title\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"com\"\u003e\u0026lt;!-- Third Examlpe --\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:text\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"i18n.label.greetings\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eMr Smith\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:text\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e text 標籤實例\u003c/p\u003e \n\u003ch2\u003e url 標籤:\u003c/h2\u003e \n\u003cp\u003e 這些URL標籤是用來創建一個URL。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003e\u0026lt;-- Example 1 --\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:url\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"editGadget.action\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"id\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{selected}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:url\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u0026lt;-- Example 2 --\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:url\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"editGadget\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"id\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{selected}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:url\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u0026lt;-- Example 3--\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:url\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eincludeParams\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"get\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"id\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{'22'}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:url\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e url標籤實例\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"aa:T4c2d,"])</script><script>self.__next_f.push([1,"\u003cp\u003e action標記允許程序員從視圖頁面執行動作。他們可以做到這一點通過指定的動作名稱。他們可以設置的「executeResult」參數設置爲「true」,在視圖中直接呈現結果。或者他們可以將此參數設置爲「false」,但利用請求屬性暴露的操作方法。\u003c/p\u003e \n\u003ch2\u003e 創建action類:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHelloWorldAction\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建視圖\u003c/h2\u003e \n\u003cp\u003e 讓我們具有 helloWorld.jsp 展示使用generator\u0026nbsp;標記:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;h2\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eExample of Generator Tag\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/h2\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;h3\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eThe colours of rainbow:\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/h3\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:generator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eval\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{'Violet,Indigo,Blue,\r\n Green,Yellow,Orange,Red '}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ecount\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"7\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eseparator\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\",\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:generator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\t\r\n\t\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 接下來讓我們有employees.jsp包含以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmployees\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eexecuteResult\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Output from Hello: \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;br\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 配置文件\u003c/h2\u003e \n\u003cp\u003e struts.xml 應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"employee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.Employee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/employee.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e web.xml 應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊\u0026nbsp;Export \u0026gt; WAR File\u0026nbsp;創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/employee.action。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Struts action tag\" src=\"https://asset.1ju.org/cmsstatic/struts2-action-1.jpg\"\u003e \n\u003cp\u003e 正如可以看到在這個例子中,我們指定爲「true」的值executeResult。因此,hello.action結果是直接在網頁上呈現。helloWorld.jsp打印彩虹的顏色 - 這是現在employee.jsp呈現\u003c/p\u003e \n\u003cp\u003e 現在,讓我們稍微修改 HelloWorldAction.java:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eArrayList\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e org\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eapache\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eServletActionContext\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHelloWorldAction\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pln\"\u003e names \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eArrayList\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n names\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Robert\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n names\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Page\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n names\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eadd\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Kate\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eServletActionContext\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egetRequest\u003c/span\u003e\u003cspan class=\"pun\"\u003e().\u003c/span\u003e\u003cspan class=\"pln\"\u003esetAttribute\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"names\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e names\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 最後,修改employee.jsp,如下所示:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmployees\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eexecuteResult\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"false\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Output from Hello: \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;br\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:iterator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"#attr.names\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 再次右鍵點擊項目名稱,並單擊Export \u0026gt; WAR File創建一個WAR文件。然後部署此WAR在Tomcat 的 webapps目錄下。\u003cbr\u003e 最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/employee.action。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Struts action tag\" src=\"https://asset.1ju.org/cmsstatic/struts2-action-2.jpg\"\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"ab:T328b,"])</script><script>self.__next_f.push([1,"\u003cp\u003e Struts 的\u0026nbsp;include\u0026nbsp;標籤和JSP include標記非常相似,它很少使用。我們已經看到了如何將一個Struts動作到一個jsp使用\u0026lt;s:action\u0026gt;標籤的輸出。 \u0026lt;s:include\u0026gt;標籤略有不同。它可以進入一個jsp輸出包括一個jsp,servlet或任何其他資源(其他的東西比一個Struts動作)。類似\u0026lt;jsp:include\u0026gt;,但它允許您將參數傳遞給被包含的文件,它是Struts框架的一部分。\u003c/p\u003e \n\u003cp\u003e 下面的例子展示了我們如何將include輸出的helloWorld.jsp到employee.jsp。在這種情況下,動作在HelloWorldAction.java方法將不會被調用,因爲我們是直接包括JSP。\u003c/p\u003e \n\u003ch2\u003e 創建動作類:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHelloWorldAction\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建視圖\u003c/h2\u003e \n\u003cp\u003e 讓我們包含以下內容的helloWorld.jsp:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;h2\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eExample of Generator Tag\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/h2\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;h3\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eThe colours of rainbow:\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/h3\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:generator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eval\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{'Violet,Indigo,Blue,\r\n Green,Yellow,Orange,Red '}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ecount\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"7\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eseparator\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\",\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:generator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\t\r\n\t\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 接下來讓我們有employees.jsp包含以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmployees\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;p\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eAn example of the include tag: \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/p\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:include\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"HelloWorld.jsp\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 配置文件\u003c/h2\u003e \n\u003cp\u003e struts.xml 應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"employee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.Employee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/employee.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e web.xml 應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊Export \u0026gt; WAR File創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/employee.action。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Struts include tag\" src=\"https://asset.1ju.org/cmsstatic/struts2-include-1.jpg\"\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"ac:T3614,"])</script><script>self.__next_f.push([1,"\u003cp\u003e bean標籤的設置和push\u0026nbsp;標籤的組合,它可以創建一個新的對象實例,然後設置變量的值。然後,它的bean可以在值棧,因此,它可用於在JSP頁面。\u003c/p\u003e \n\u003cp\u003e bean標籤需要一個Java Bean來工作。所以,標準的java bean規律應遵循。這是bean 應該有一個無參數的構造函數。要公開和使用的所有屬性的getter和setter 方法​​。對於這個練習的目的,讓我們用下面的計數器類,在struts util包。Counter\u0026nbsp;類是一個bean,可以使用一個計數器來跟蹤。\u0026nbsp;\u003c/p\u003e \n\u003cp\u003e 因此,讓我們所有的文件保持不變,並修改的helloWorld.jsp文件。\u003c/p\u003e \n\u003ch2\u003e 創建動作類:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHelloWorldAction\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建視圖\u003c/h2\u003e \n\u003cp\u003e 讓我們包含以下內容 helloWorld.jsp:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:bean\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"org.apache.struts2.util.Counter\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evar\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"counter\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"first\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"20\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"last\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"25\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:bean\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;ul\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:iterator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"#counter\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;li\u0026gt;\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;/li\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/ul\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 接下來讓我們有employees.jsp包含以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmployees\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;p\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eAn example of the include tag: \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/p\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:include\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"HelloWorld.jsp\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 配置文件\u003c/h2\u003e \n\u003cp\u003e 你的struts.xml應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"employee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.Employee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/employee.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e web.xml中應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊Export \u0026gt; WAR File創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/hello.action。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Struts bean tag\" src=\"https://asset.1ju.org/cmsstatic/struts2-bean-1.jpg\"\u003e \n\u003cp\u003e 在這個例子中,我們實例化一個新的org.apache.struts2.util.Counter bean實例。然後我們的第一個屬性設置爲20和25最後一個屬性。這意味着計數器的值分別爲20,21,22,23,24和25。我們給一個名爲「Counter」的bean。 struts的bean標籤將bean實例化,並把它值棧中的。現在我們可以使用迭代器去,通過計數器bean的nd打印出計數器的值。.\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"ad:T2922,"])</script><script>self.__next_f.push([1,"\u003cp\u003e date標籤允許在一個快速和容易的方式格式化日期。用戶可以指定自定義的格式(如「DD/ MM / YYYY HH:MM」),可以產生容易可讀的符號(如「2小時,14分鐘),或預定義的格式就可以求助於鍵struts.date.format'在屬性文件中。\u003c/p\u003e \n\u003ch2\u003e 創建動作類:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.*;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHelloWorldAction\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eDate\u003c/span\u003e\u003cspan class=\"pln\"\u003e currentDate\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n setCurrentDate\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eDate\u003c/span\u003e\u003cspan class=\"pun\"\u003e());\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setCurrentDate\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eDate\u003c/span\u003e\u003cspan class=\"pln\"\u003e date\u003c/span\u003e\u003cspan class=\"pun\"\u003e){\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ecurrentDate \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e date\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eDate\u003c/span\u003e\u003cspan class=\"pln\"\u003e getCurrentDate\u003c/span\u003e\u003cspan class=\"pun\"\u003e(){\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e currentDate\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建視圖\u003c/h2\u003e \n\u003cp\u003e 以下helloWorld.jsp的內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;h2\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eCurrent Date\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/h2\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;h3\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eDay/Month/Year Format\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/h3\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:date\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"currentDate\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eformat\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"dd/MM/yyyy\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;h3\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eMonth/Day/Year Format\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/h3\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:date\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"currentDate\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eformat\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"MM/dd/yyyy\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 配置文件\u003c/h2\u003e \n\u003cp\u003e struts.xml 應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e web.xml 應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊\u0026nbsp;Export \u0026gt; WAR File創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/hello.action。這會給出以下畫面:\u0026nbsp;\u003c/p\u003e \n\u003cimg alt=\"Struts date tag\" src=\"https://asset.1ju.org/cmsstatic/struts2-date-1.jpg\"\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"ae:T3430,"])</script><script>self.__next_f.push([1,"\u003cp\u003e param標籤可用於參數其他標籤。包括標籤和bean標籤,這種標籤的例子。讓我們以同樣的例子我們已經討論,同時討論bean標籤。\u003c/p\u003e \n\u003ch2\u003e 創建動作類:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHelloWorldAction\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建視圖\u003c/h2\u003e \n\u003cp\u003e 讓我們看看包含以下內容的helloWorld.jsp:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e %\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:bean\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"org.apache.struts2.util.Counter\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evar\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"counter\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"first\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"20\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"last\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"25\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:bean\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;ul\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:iterator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"#counter\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;li\u0026gt;\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;/li\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/ul\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 接下來讓我們看看employees.jsp包含以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmployees\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;p\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eAn example of the include tag: \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/p\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:include\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"HelloWorld.jsp\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 配置文件\u003c/h2\u003e \n\u003cp\u003e struts.xml中應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"employee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.Employee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/employee.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e web.xml 應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊「導出」\u0026gt;WAR文件創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/hello.action。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Struts bean tag\" src=\"https://asset.1ju.org/cmsstatic/struts2-bean-1.jpg\"\u003e \n\u003cp\u003e 在這個例子中,我們實例化一個新的org.apache.struts2.util.Counter bean的實例。然後我們的第一個屬性設置爲20和25的最後一個屬性。這意味着計數器的值分別爲20,21,22,23,24和25。我們給一個名爲「counter」的bean。 struts的bean標籤bean的實例化,並把它值棧中的。現在我們可以使用迭代器去,通過計數器bean的nd打印出計數器的值。\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"af:T3fd4,"])</script><script>self.__next_f.push([1,"\u003cp\u003e property\u0026nbsp;標籤是用來獲取屬性的值,這將默認堆棧的頂部,如果沒有指定。這個例子顯示了三個簡單的數據標記 - 即set,\u0026nbsp;push\u0026nbsp;和\u0026nbsp;property\u0026nbsp;的用法。\u0026nbsp;\u003c/p\u003e \n\u003ch2\u003e 創建動作類:\u003c/h2\u003e \n\u003cp\u003e 對於這個練習,讓我們重用的例子在「數據類型轉換」一章,但小的修改。因此,讓我們開始創建類。考慮以下POJO類Environment.java。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 我們動作類:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eSystemDetails\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pln\"\u003e environment \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Development\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e operatingSystem \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"Windows XP SP3\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pln\"\u003e getEnvironment\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e environment\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setEnvironment\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pln\"\u003e environment\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eenvironment \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e environment\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getOperatingSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e operatingSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setOperatingSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e operatingSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eoperatingSystem \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e operatingSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建視圖\u003c/h2\u003e \n\u003cp\u003e 讓我們有System.jsp以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\tpageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eSystem Details\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;p\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eThe environment name property can be accessed in three ways:\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/p\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n (Method 1) Environment Name: \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"environment.name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n (Method 2) Environment Name: \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:push\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"environment\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:push\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n (Method 3) Environment Name:\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:set\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myenv\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"environment.name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myenv\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 現在,讓我們去逐一通過三個選項:\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e 在第一個方法中,我們使用屬性標記的環境的名稱來獲取值。由於環境變量是在動作類,它可以自動值棧中的。我們可以直接引用它使用屬性environment.name。當一個類中的屬性數有限。試想一下,如果有20個環境類中的屬性。每次需要參考這些變量需要添加「environment.」作爲前綴。push標籤記處理。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 在第二種方法中,我們把「environment」屬性的堆棧。因此,現在主體內的 push\u0026nbsp;標記,環境屬性是可堆棧的根。所以,現在引用屬性,很容易在這個例子所示。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 在最後的方法,我們使用設置的標籤來創建一個新的變量稱爲myenv。此變量的值設置爲environment.name。所以,現在我們可以使用這個變量的地方,我們是指環境的名稱。\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003ch2\u003e 配置文件\u003c/h2\u003e \n\u003cp\u003e 你的struts.xml中應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"system\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.SystemDetails\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/System.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e web.xml中應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊\u0026nbsp;Export \u0026gt; WAR File\u0026nbsp;創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/system.action。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Struts property tag\" src=\"https://asset.1ju.org/cmsstatic/struts2-property-1.jpg\"\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"b0:T3ff2,"])</script><script>self.__next_f.push([1,"\u003cp\u003e property\u0026nbsp;標籤是用來獲取屬性的值,這將默認堆棧的頂部,如果沒有指定。這個例子顯示了三個簡單的數據標記 - 即set,\u0026nbsp;push\u0026nbsp;和\u0026nbsp;property\u0026nbsp;的用法。\u0026nbsp;\u003c/p\u003e \n\u003ch2\u003e 創建動作類:\u003c/h2\u003e \n\u003cp\u003e 對於這個練習,讓我們重用的例子在「數據類型轉換」一章,但小的修改。因此,讓我們開始創建類。考慮以下POJO類Environment.java。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 我們的動作類:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eSystemDetails\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pln\"\u003e environment \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"Development\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e operatingSystem \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"Windows XP SP3\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e SUCCESS\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pln\"\u003e getEnvironment\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e environment\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setEnvironment\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eEnvironment\u003c/span\u003e\u003cspan class=\"pln\"\u003e environment\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eenvironment \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e environment\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getOperatingSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e operatingSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setOperatingSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e operatingSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eoperatingSystem \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e operatingSystem\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建視圖\u003c/h2\u003e \n\u003cp\u003e 我們有System.jsp以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\tpageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eSystem Details\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;p\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eThe environment name property can be accessed in three ways:\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/p\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n (Method 1) Environment Name: \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"environment.name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n (Method 2) Environment Name: \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:push\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"environment\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:push\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n (Method 3) Environment Name:\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:set\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myenv\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"environment.name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myenv\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 現在,讓我們去逐一通過三個選項:\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e 在第一個方法中,我們使用屬性標記的環境的名稱來獲取值。由於環境變量是在動作類,它可以自動值棧中的。我們可以直接引用它使用屬性environment.name。當一個類中的屬性數有限。試想一下,如果有20個環境類中的屬性。每次需要參考這些變量需要添加「environment.」作爲前綴。push標籤記處理。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 在第二種方法中,我們把「environment」屬性的堆棧。因此,現在主體內的 push\u0026nbsp;標記,環境屬性是可堆棧的根。所以,現在引用屬性,很容易在這個例子所示。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 在最後的方法,我們使用設置的標籤來創建一個新的變量稱爲myenv。此變量的值設置爲environment.name。所以,現在我們可以使用這個變量的地方,我們是指環境的名稱。\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003ch2\u003e 配置文件\u003c/h2\u003e \n\u003ch2\u003e \u003cspan\u003e你的struts.xml中應該像這樣:\u003c/span\u003e\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"system\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.SystemDetails\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/System.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 你的web.xml文件內容應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊\u0026nbsp;Export \u0026gt; WAR File\u0026nbsp;創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/system.action。這會給出以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Struts property tag\" src=\"https://asset.1ju.org/cmsstatic/struts2-property-1.jpg\"\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"b1:T2f3c,"])</script><script>self.__next_f.push([1,"\u003cp\u003e text 標籤是一個通用的標記,用來渲染一個i18n的文本消息。按照三個步驟:\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e 該消息必須在一個資源包,它與作爲動作具有相同的名稱。在實踐中,這意味着,應該爲類具有相同名稱的Java類在同一個包創建屬性文件,.properties擴展。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 如果具名的消息沒有被發現,然後主體的標記將被用作默認的消息。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 如果沒有正文被使用,那麼該消息的名稱將被使用。\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e 讓我們來檢查下面的例子來理解文本標籤的用法:\u003c/p\u003e \n\u003ch2\u003e 創建動作類:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHelloWorldAction\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建視圖\u003c/h2\u003e \n\u003cp\u003e 讓我們包含以下內容的helloWorld.jsp:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eText Tag Example\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:i18n\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:text\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name.success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:text\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name.xyz\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eMessage doesn't exists\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:text\u0026gt;\u0026lt;br\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:text\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"name.msg.param\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eZARA\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:text\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:i18n\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 配置文件\u003c/h2\u003e \n\u003cp\u003e 讓我們創建一個屬性名稱相同的文件,動作類包名。因此,在這種情況下,我們將創建HelloWorldAction.properties文件,並保持在類路徑:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esuccess \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eThis\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eis\u003c/span\u003e\u003cspan class=\"pln\"\u003e success message\r\nname\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003emsg\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eparam \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eThe\u003c/span\u003e\u003cspan class=\"pln\"\u003e param example \u003c/span\u003e\u003cspan class=\"pun\"\u003e-\u003c/span\u003e\u003cspan class=\"pln\"\u003e param \u003c/span\u003e\u003cspan class=\"pun\"\u003e:\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"lit\"\u003e0\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 你的struts.xml中應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.custom.i18n.resources\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"ApplicationResources\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloaction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e web.xml中,應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊Export \u0026gt; WAR File創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/hello.action。這會給出以下畫面:\u0026nbsp;\u003c/p\u003e \n\u003cimg alt=\"Struts text tag\" src=\"https://asset.1ju.org/cmsstatic/struts2-text-1.jpg\"\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"b2:T29b1,"])</script><script>self.__next_f.push([1,"\u003cp\u003e URL標籤是負責生成URL字符串。這樣做的好處是,你可以提供參數標籤。我們通過一個例子來說明使用的URL標籤。\u003c/p\u003e \n\u003ch2\u003e 創建動作類:\u003c/h2\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eHelloWorldAction\u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ename \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e name\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e 創建視圖\u003c/h2\u003e \n\u003cp\u003e helloWorld.jsp包含以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:url\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"login\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"login\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evar\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myurl\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:param\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"user\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eZara\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:url\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u0026lt;a href='\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"#myurl\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e'\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"#myurl\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;/a\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在這裏,我們生成一個網址鏈接「login.action」。我們已經給這個url名稱「myurl」。這是爲了讓我們可以重用這個網址鏈接在多個地方的jsp文件。然後,我們提供的url參數調用用戶。參數值實際上追加到查詢字符串,可以看到從上面的輸出。\u0026nbsp;\u003c/p\u003e \n\u003cp\u003e 主要是有用是當你想創建一個bean屬性值的基礎上動態超鏈接的URL標籤。\u003c/p\u003e \n\u003ch2\u003e 配置文件\u003c/h2\u003e \n\u003cp\u003e 你的struts.xml中應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloaction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.HelloWorldAction\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/HelloWorld.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 你的web.xml 應該像這樣:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 右鍵點擊項目名稱,並單擊Export \u0026gt; WAR File創建一個WAR文件。然後部署這個WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/hello.action。這會給你以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Struts url tag\" src=\"https://asset.1ju.org/cmsstatic/struts2-url-1.jpg\"\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"b3:T4e8a,"])</script><script>self.__next_f.push([1,"\u003cp\u003e form 標籤的列表是Struts的UI標籤的一個子集。這些標籤可以幫助渲染中需要Struts Web應用程序和用戶界面可以分爲三類。本章將帶你通過所有三種類型的UI標籤:\u003c/p\u003e \n\u003ch2\u003e 簡單UI標籤:\u003c/h2\u003e \n\u003cp\u003e 我們已經使用這些標籤已經在我們的例子中。讓我們來看看一個簡單的一些簡單UI標籤的視圖頁面email.jsp:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\tpageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:head/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:div\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eEmail Form\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:div\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:text\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Please fill in the form below:\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:form\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"post\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eenctype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"multipart/form-data\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:hidden\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"secret\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"abracadabra\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:textfield\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ekey\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"email.from\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"from\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:password\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ekey\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"email.password\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"password\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:textfield\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ekey\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"email.to\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"to\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:textfield\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ekey\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"email.subject\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"subject\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:textarea\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ekey\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"email.body\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"email.body\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:label\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003efor\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"attachment\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Attachment\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:file\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"attachment\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaccept\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"text/html,text/plain\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:token\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:submit\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ekey\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"submit\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 如果你是知道的HTML,那麼所有使用的標籤是很常見的HTML標籤與一個額外前綴s:隨着每個標籤和不同的屬性。當我們執行上面的程序中,我們可以得到以下的用戶界面,只要使用所有鍵設置正確的映射。\u003c/p\u003e \n\u003cimg alt=\"Struts Simple UI tags\" src=\"https://asset.1ju.org/cmsstatic/struts2-19.jpg\"\u003e \n\u003cp\u003e 如圖所示,s:head產生Struts2的應用程序所需的javascript和樣式表元素。\u003c/p\u003e \n\u003cp\u003e 接下來,我們有s:div和s:text元素。s:div被用來渲染HTML DIV元素。這是非常有用的當混合使用HTML和Struts標籤。對於這些人來說,他們有選擇使用s:div來呈現一個div。\u0026nbsp;\u003c/p\u003e \n\u003cp\u003e s:text如圖所示用於在屏幕上呈現文本。\u003c/p\u003e \n\u003cp\u003e 接下來我們有s:form標籤。\u0026nbsp;s:form標籤決定提交表單的action屬性。因爲我們有一個文件上傳元素的形式,我們必須設置enctype屬性multipart。否則,我們就可以保留此空白。\u003c/p\u003e \n\u003cp\u003e 在表單標籤的末尾,我們有s:submit標籤。這是用來提交表單。當提交表單時,所有的表單值提交到指定的動作在s:form標籤。\u003c/p\u003e \n\u003cp\u003e s:form裏面,我們有一個隱藏的屬性稱爲secret。這使得一個隱藏的元素在HTML中。在我們的案例中,「祕密」的元素值「abracadabra」。此元素向最終用戶是不可見的,並用於承載的狀態下,從一個視圖。\u0026nbsp;\u003c/p\u003e \n\u003cp\u003e 接下來,我們有s:label, s:textfield, s:password 和 s:textarea標籤。這些用於呈現標籤,輸入字段,密碼和文本區域分別。我們所看到的這些動作「Struts - 發送電子郵件」例子。這裏要注意的最重要的事情是使用「key」屬性。 「key」屬性用於獲取這些控件從屬性文件中的標籤。\u003c/p\u003e \n\u003cp\u003e 然後,我們有\u0026nbsp;s:file標記使得輸入文件上傳組件。該組件允許用戶上傳文件。在這個例子中,我們使用了「accept」 參數位置s:file\u0026nbsp;指定允許上傳的文件類型的文件標記。\u0026nbsp;\u003c/p\u003e \n\u003cp\u003e 最後,我們有s:token\u0026nbsp;標籤。令牌的標籤,這是用來找出雙提交表單是否已經生成一個獨特的標記。\u003c/p\u003e \n\u003cp\u003e 表單呈現時,一個隱藏的變量被放置令牌值。讓我們說,例如令牌是「ABC」。當表單提交時,Struts過濾器會檢查對存儲在會話的令牌令牌。如果匹配,它消除了從會話令牌。現在,如果意外形式(無論是通過刷新或通過點擊瀏覽器的後退按鈕)重新提交,表單將被重新提交「ABC」作爲標記。在這種情況下,過濾器將檢查對再次存儲在會話中的令牌的令牌。但由於令牌「ABC」已經從會話中刪除,這將不匹配和Struts的過濾器將拒絕請求。\u003c/p\u003e \n\u003ch2\u003e 組 UI 標籤:\u003c/h2\u003e \n\u003cp\u003e 組UI標籤被用來創建單選按鈕,複選框。讓我們來看看一個簡單的視圖頁的helloWorld.jsp的複選框和單選按鈕標籤:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:head\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:form\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hello.action\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:radio\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Gender\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"gender\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elist\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"{'male','female'}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:checkboxlist\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Hobbies\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hobbies\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003elist\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"{'sports','tv','shopping'}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 當我們執行上述程序的輸出將看起來類似於以下內容:\u003c/p\u003e \n\u003cimg alt=\"Struts group UI tags\" src=\"https://asset.1ju.org/cmsstatic/struts2-20.jpg\"\u003e \n\u003cp\u003e 現在讓我們來看看這個例子。在第一個例子中,我們創建了一個簡單的單選按鈕,「Gender」的標籤。單選按鈕標籤的name屬性是強制性的,所以我們指定一個名稱是「Gender」。然後我們提供一個列表的性別。這份名單是填充值「male」和「female」。因此,在輸出中,我們得到了一個單選按鈕,其具有兩個值。\u003c/p\u003e \n\u003cp\u003e 在第二個例子中,我們創建了一個複選框列表。這是收集用戶的愛好。用戶可以有一個以上的愛好,因此,我們所使用的複選框,而不是單選按鈕。該複選框被填充列表\"sports\", \"Tv\" 和 \"Shopping\"。這就提出了一個複選框列表的愛好。\u003c/p\u003e \n\u003ch2\u003e 選擇 UI 標籤:\u003c/h2\u003e \n\u003cp\u003e 讓我們來探討Struts提供的選擇標記的不同變化。讓我們來看看一個簡單的視圖頁的helloWorld.jsp的select標籤:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:head\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:form\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"login.action\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:select\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"username\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Username\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003elist\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"{'Mike','John','Smith'}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:select\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Company Office\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"mySelection\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{'America'}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003elist\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{#{'America':'America'}}\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:optgroup\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Asia\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003elist\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{#{'India':'India','China':'China'}}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:optgroup\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Europe\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003elist\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{#{'UK':'UK','Sweden':'Sweden','Italy':'Italy'}}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:select\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:combobox\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"My Sign\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"mySign\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003elist\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"#{'aries':'aries','capricorn':'capricorn'}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eheaderKey\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eheaderValue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"--- Please Select ---\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eemptyOption\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"capricorn\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:doubleselect\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Occupation\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"occupation\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003elist\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"{'Technical','Other'}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003edoubleName\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"occupations2\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003edoubleList\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"top == 'Technical' ? \r\n {'I.T', 'Hardware'} : {'Accounting', 'H.R'}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 當我們執行上述程序的輸出將看起來類似於以下內容:\u003c/p\u003e \n\u003cimg alt=\"Struts select UI tags\" src=\"https://asset.1ju.org/cmsstatic/struts2-21.jpg\"\u003e \n\u003cp\u003e 現在讓我們通過個別情況下,一個接一個。\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e 首先,select標籤生成的HTML選擇框。在第一個例子中,我們創建了一個簡單的選擇框「username」和「username」標籤。選擇框將被填充一個列表,其中包含Mike, John 和\u0026nbsp;Smith的名字。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 在第二個例子中,我們的公司總部設在美國。它還擁有全球辦事處,在亞洲和歐洲。我們要顯示一個選擇框辦事處,但大陸的名稱,我們要進行分組的全球辦事處。這是optgroup就派上用場了。我們使用s:optgroup標籤來創建新組。我們給一個標籤和一個單獨的列表。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 在第三個例子中,使用組合框。組合框是一個輸入字段和一個選擇框的組合。用戶可以選擇從選擇框中的值,在這種情況下,輸入字段自動填入用戶已選擇的值。如果用戶直接輸入一個值,然後選擇框沒有值將被選中。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 在我們的例子中,我們有太陽標誌的組合框列出。選擇框允許用戶輸入他的太陽星座,如果它不是在列表中只列出了四個條目。我們還添加一個頭項的選擇框。頭項是一個選擇框的頂部顯示。在我們的例子中,我們要顯示\u0026nbsp;\"Please Select\"。如果用戶不選擇什麼,那麼我們假設-1的值。在某些情況下,我們不希望用戶選擇一個空值。在這些條件下,一會的的「emptyOption」屬性設置爲false。最後,在我們的例子中,我們提供的「capricorn」組合框的默認值。\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e 第四個例子,我們有一個雙選。使用雙重選擇,當想顯示了兩個選擇框。在第一個選擇框選擇的值確定出現在第二個選擇框。在我們的例子中,第一個選擇框顯示\"Technical\" 和 \"Other\"。如果用戶選擇技術,我們將在第二個選擇框,顯示IT和硬件。否則,我們將顯示會計和人力資源。使用「list」和「doubleList」將屬性,如示例中所示,這是可能的。\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e 在上面的例子中,我們做了比較,看看如果頂部的選擇框等於介紹技術。如果確實如此,那麼,我們顯示IT和硬件。我們還需要給機頂盒的名稱(\"name='Occupations')和底下的框中(doubleName='occupations2')。\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"b4:T1a7e,"])</script><script>self.__next_f.push([1,"\u003cp\u003e Struts使用Dojo框架的 AJAX標記實現。首先,這個例子中,你需要添加 struts2-dojo-plugin-2.2.3.jar。你可以得到這個文件的lib文件夾struts2的下載\u0026nbsp;(C:struts-2.2.3-allstruts-2.2.3libstruts2-dojo-plugin-2.2.3.jar)\u003c/p\u003e \n\u003cp\u003e 對於這個鍛鍊,讓我們修改 helloWorld.jsp如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"sx\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-dojo-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:head\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;sx:head\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;sx:autocompleter\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Favourite Colour\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003elist\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"{'red','green','blue'}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;br\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;sx:datetimepicker\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"deliverydate\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Delivery Date\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003edisplayFormat\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"dd/MM/yyyy\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;br\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:url\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"url\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"/hello.action\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;sx:div\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ehref\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"%{#url}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003edelay\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"2000\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n Initial Content\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/sx:div\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;sx:tabbedpanel\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"tabContainer\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;sx:div\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Tab 1\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eTab 1\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/sx:div\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;sx:div\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Tab 2\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eTab 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/sx:div\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/sx:tabbedpanel\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 當我們運行上面的例子中,我們可以得到下面的輸出:\u003c/p\u003e \n\u003cimg alt=\"Struts Ajax tags\" src=\"https://asset.1ju.org/cmsstatic/struts2-ajax-1.jpg\"\u003e \n\u003cp\u003e 現在讓我們通過這個例子一步來。\u003c/p\u003e \n\u003cp\u003e 首先要注意的是另外一個新的標籤庫前綴\u0026nbsp;sx. \u0026nbsp;(struts-dojo-tags)是專門創建的標記庫的AJAX集成。\u003c/p\u003e \n\u003cp\u003e 然後在HTML頭,我們稱之爲sx:head。這將初始化Dojo框架,使得它準備爲所有的AJAX調用內頁。這一步很重要 - ,沒有sx:head初始化Ajax調用不會起作用。\u0026nbsp;\u003c/p\u003e \n\u003cp\u003e 首先,我們有自動完成標籤。自動完成標籤看起來很像一個選擇框。它填充了紅色,綠色和藍色的值。但之間的一個選擇框而這一次不同​​的是,它自動完成。也就是說,如果開始鍵入gr,這將填補它爲「green」。除此之外,這個標籤是非常相似s:select標籤,我們前面介紹。\u003c/p\u003e \n\u003cp\u003e 接下來,我們有一個日期時間選擇器。這個標籤創建一個輸入欄旁邊的一個按鈕。當按下按鈕時,彈出一個顯示日期和時間選擇器。當用戶選擇的日期,該日期將填充到輸入文本標記屬性中所指定的格式。在我們的例子中,我們指定dd/MM/yyyy\u0026nbsp;日期格式。\u0026nbsp;\u003c/p\u003e \n\u003cp\u003e 接下來我們創建一個URL標記的system.action在前面的練習中,我們創建的文件。它並不一定要的system.action - 它可以是任何行動您之前創建的文件。然後我們有一個div設置超鏈接的url和延遲設置爲2秒鐘。會發生什麼事而言,\"Initial Content\"將顯示2秒鐘,然後div的內容將被替換的內容從hello.action執行。\u003c/p\u003e \n\u003cp\u003e 最後,我們有一個簡單的選項卡面板有兩個選項卡。標籤的div標籤「選項卡1和Tab2。\u003c/p\u003e \n\u003cp\u003e 慢慢地隨着每一個版本,它應該是值得注意的AJAX標籤集成Struts,仍然是一個工作的進步和成熟整合。\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"b5:T3f14,"])</script><script>self.__next_f.push([1,"\u003cp\u003e Spring是一個流行的Web框架,它提供易於集成與很多常見的網絡任務。所以,問題是,爲什麼我們需要Spring,當我們有Struts2?Spring是超過一個MVC框架 - 它提供了許多其它好用的東西,這是不是在Struts。例如:依賴注入可以是有用的任何框架。在本章中,我們將通過一個簡單的例子來看看如何集成Spring和Struts2一起。\u003c/p\u003e \n\u003cp\u003e 首先,需要添加下列文件到項目的構建路徑從Spring安裝。您可以下載並安裝最新版本的Spring框架從\u0026nbsp;\u003ca href=\"http://www.springsource.org/download\"\u003ehttp://www.springsource.org/download\u003c/a\u003e\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e org.springframework.asm-x.y.z.M(a).jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e org.springframework.beans-x.y.z.M(a).jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e org.springframework.context-x.y.z.M(a).jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e org.springframework.core-x.y.z.M(a).jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e org.springframework.expression-x.y.z.M(a).jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e org.springframework.web-x.y.z.M(a).jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e org.springframework.web.servlet-x.y.z.M(a).jar\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e 最後加入struts2-spring-plugin-x.y.z.jar在WEB-INF/lib從struts的lib目錄。如果使用的是Eclipse,那麼可能會面臨一個異常的java.lang.ClassNotFoundException異常:org.springframework.web.context.ContextLoaderListener。爲了解決這個問題,應該在一類依賴的標記標籤右上點擊快速修復發佈/導出所有的依賴關係。最後,確保不存在依賴衝突標記「選項卡下。\u003c/p\u003e \n\u003cimg alt=\"Struts and Sprint Integration\" src=\"https://asset.1ju.org/cmsstatic/struts2spring-1.gif\"\u003e \n\u003cp\u003e 現在讓我們來設置web.xml中的Struts-Spring集成如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n\t\u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n\thttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"3.0\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts 2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;listener\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;listener-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.springframework.web.context.ContextLoaderListener\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/listener-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/listener\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 這裏要注意的最重要的事情是我們已經配置了監聽器。 ContextLoaderListener的需要加載Spring上下文文件。 Spring的配置文件名爲applicationContext.xml文件,它必須放置在同一水平web.xml文件\u003c/p\u003e \n\u003cp\u003e 讓我們創建一個簡單的動作類稱爲User.java的兩個屬性 - firstName和lastName。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eUser\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e firstName\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e lastName\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getFirstName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e firstName\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setFirstName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e firstName\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003efirstName \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e firstName\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getLastName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e lastName\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setLastName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e lastName\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003elastName \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e lastName\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 現在,讓我們一起創造了applicationContext.xml spring 配置文件並創建實例User.java類。正如前面提到的,這個文件應該在WEB-INF文件夾下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE beans PUBLIC \"-//SPRING//DTD BEAN//EN\" \r\n\"http://www.springframework.org/dtd/spring-beans.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;beans\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;bean\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"userClass\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.User\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"firstName\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Michael\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"lastName\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Jackson\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/bean\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/beans\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 正如上面看到的,我們已經配置了用戶bean,我們放值\u003cb\u003eMichael\u003c/b\u003e\u003cspan\u003e和\u003c/span\u003e\u003cb\u003eJackson\u003c/b\u003e到bean。我們也給這個bean名稱「userClass」,這樣我們就可以重用在其他地方。接下來,讓我們在WebContent文件夾中創建由user.jsp:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page language\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"java\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\tpageEncoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"ISO-8859-1\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \r\n\"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;h1\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World From Struts2 - Spring integration\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/h1\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:textfield\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"firstName\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"First Name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:textfield\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"lastName\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Last Name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 由user.jsp文件相當直接。它只有一個目的 - 顯示的名字和姓氏的用戶對象的值。最後,讓我們把所有的實體一起使用struts.xml文件。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"helloworld\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"user\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"userClass\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/User.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 重要的是要注意的是,我們使用id userClass的引用類。這意味着,我們使用的是spring\u0026nbsp;做的User類的依賴注入。\u003c/p\u003e \n\u003cp\u003e 現在右擊項目名稱,並單擊Export \u0026gt; WAR File創建一個WAR文件。然後部署這個WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/User.jsp。這會給你以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Struts and Spring Integration\" src=\"https://asset.1ju.org/cmsstatic/struts2spring-2.gif\"\u003e \n\u003cp\u003e 現在我們已經看到了如何將兩個偉大的框架 Struts - Spring集成。\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"b6:T54e4,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 在本章中,讓我們通過Struts2的集成Tiles框架所涉及的步驟。 Apache的Tiles是一個內置的模板框架來簡化Web應用程序用戶界面的開發。\u003c/p\u003e \n\u003cp\u003e 首先,我們需要從\u003ca href=\"http://tiles.apache.org/\"\u003eApache Tiles\u003c/a\u003e\u0026nbsp;網站下載的files jar文件。需要添加下面的jar文件添加到項目的類路徑。\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e tiles-api-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e tiles-compat-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e tiles-core-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e tiles-jsp-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e tiles-servlet-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e 除了上述,我們必須下載複製下面的jar文件到WEB-INF/lib。\u0026nbsp;.\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e commons-beanutils-x.y.zjar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e commons-digester-x.y.jar\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e struts2-tiles-plugin-x.y.z.jar\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e 現在,讓我們設置web.xml Struts-Tiles\u0026nbsp;集成。有兩個重要的點,這裏要注意的。首先,我們需要告訴tiles配置文件tiles.xml在哪裏可以找到。在我們的案例中,這將是在/WEB-INF文件夾下。接下來,我們需要初始化tiles偵聽器,配備了Struts2下載。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;web-app\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:xsi\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.w3.org/2001/XMLSchema-instance\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exmlns:web\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003exsi:schemaLocation\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://java.sun.com/xml/ns/javaee \r\n http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eid\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"WebApp_ID\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eversion\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"2.5\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eStruts2Example15\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/display-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;context-param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;param-value\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n /WEB-INF/tiles.xml\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/param-value\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/context-param\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;listener\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;listener-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.tiles.StrutsTilesListener\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/listener-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/listener\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-class\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-name\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/*\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/url-pattern\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/filter-mapping\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eindex.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/welcome-file-list\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/web-app\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 接下來,讓我們一起創建 tiles.xml在/WEB-INF文件夾下包含以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE tiles-definitions PUBLIC\r\n \"-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN\"\r\n \"http://tiles.apache.org/dtds/tiles-config_2_0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;tiles-definitions\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;definition\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"baseLayout\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etemplate\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"/baseLayout.jsp\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;put-attribute\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"title\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Template\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;put-attribute\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"banner\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"/banner.jsp\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;put-attribute\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"menu\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"/menu.jsp\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;put-attribute\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"body\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"/body.jsp\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;put-attribute\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"footer\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"/footer.jsp\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/definition\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;definition\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"tiger\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"baseLayout\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;put-attribute\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"title\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Tiger\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;put-attribute\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"body\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"/tiger.jsp\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/definition\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;definition\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"lion\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"baseLayout\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;put-attribute\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"title\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Lion\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;put-attribute\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"body\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"/lion.jsp\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/definition\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/tiles-definitions\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 文部科學省。我們定義了一個基本框架在baseLayout.jsp佈局。它有5個可重複使用/重寫地區。即標題,橫幅,菜單,主體和頁腳。在baselayout 我們提供了默認值,然後我們創建了兩個自定義擴展的默認佈局。tiger佈局的基本佈局是相似的,除了它使用它的主體和文本「tiger」爲題的tiger.jsp。同樣,lion的佈局是相似的基本佈局,除了它使用lion.jsp,作爲其主體和「lion」作爲標題的文本。\u003c/p\u003e \n\u003cp\u003e 讓我們一起來看看在個別jsp文件。以下是內容的baseLayout.jsp文件:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"http://tiles.apache.org/tags-tiles\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"tiles\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\r\n \"http://www.w3.org/TR/html4/loose.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;meta\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ehttp-equiv\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Content-Type\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003econtent\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u0026lt;tiles:insertAttribute\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"title\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eignore\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;tiles:insertAttribute\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"banner\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;hr/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;tiles:insertAttribute\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"menu\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;hr/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;tiles:insertAttribute\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"body\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;hr/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;tiles:insertAttribute\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"footer\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;br/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 在這裏,我們只是把一個基本的HTML頁面,瓷磚屬性。我們插入tiles\u0026nbsp;屬性,我們需要他們的地方。接下來,就讓我們創建banner.jsp文件包含以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;img\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003esrc\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.yiibai.com/images/tp-logo.gif\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 引入menu.jsp文件將有下面的線是鏈接 - TigerMenu.action和Struts動作LionMenu.action。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%\u003c/span\u003e\u003cspan class=\"lit\"\u003e@taglib\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\r\n\u0026lt;a href=\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:url\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"tigerMenu\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\" Tiger\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/a\u0026gt;\u0026lt;br\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u0026lt;a href=\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:url\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"lionMenu\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\" Lion\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/a\u0026gt;\u0026lt;br\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e lion.jsp文件將有以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;img\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003esrc\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://upload.wikimedia.org/wikipedia/commons/d/d2/Lion.jpg\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\nThe lion\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e tiger.jsp文件將有以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"tag\"\u003e\u0026lt;img\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003esrc\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"http://www.freewebs.com/tigerofdarts/tiger.jpg\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\nThe tiger\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 接下來,讓我們來創建包含以下動作類文件MenuAction.java:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eMenuAction\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e tiger\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"tiger\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e lion\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"lion\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 這是一個相當直截了當類。我們聲明兩種方tiger()和lion()返回老虎和獅子的成果分別。讓我們把它都聚集在struts.xml文件:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"default\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result-types\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result-type\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"tiles\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"org.apache.struts2.views.tiles.TilesResult\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result-types\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"*Menu\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"{1}\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.MenuAction\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"tiger\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"tiles\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003etiger\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"lion\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"tiles\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003elion\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 讓我們檢查我們所做的事情在上述文件中。首先,我們聲明一個新的結果類型,稱爲「tiles」,現在我們是用tiles,而不是簡單的JSP視圖技術。Struts2的tiles支持查看結果類型,所以我們創建的結果類型是「org.apache.struts2.view.tiles.TilesResult」類的「tiles」。\u003c/p\u003e \n\u003cp\u003e 接下來,我們想說,如果請求的是/tigerMenu.action採取「tiger tiles」頁面,用戶如果請求的是/lionMenu.action採取用戶lion tiles頁面。\u003c/p\u003e \n\u003cp\u003e 爲此,我們使用了一點的正則表達式。在我們的行動定義,我們說任何匹配模式「*菜單」,將通過這一行動來處理。匹配方法將被調用在MenuAction類。也就是說,tigerMenu.action將調用\u0026nbsp;tiger(),lionMenu.action將調用\u0026nbsp;lion()。然後,我們需要的結果的結果映射到適當的tiles\u0026nbsp;頁。\u003c/p\u003e \n\u003cp\u003e 現在右擊項目名稱,並單擊Export \u0026gt; WAR File創建一個WAR文件。然後部署這個WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/tigerMenu.jsp。這會給你以下畫面:\u003c/p\u003e \n\u003cimg alt=\"Struts and Tiles Integration\" src=\"https://asset.1ju.org/cmsstatic/struts2tiles-1.gif\"\u003e \n\u003cp\u003e 同樣,如果你轉到lionMenu.action的頁面,你會看到獅子頁使用相同的tiles\u0026nbsp;佈局。\u0026nbsp;\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"b7:T9e4d,"])</script><script>self.__next_f.push([1,"\u003cp\u003e Hibernate是一個高性能的對象/關係持久性和查詢服務許可下的開源GNU通用公共許可證(LGPL),並免費下載。在這一章中,我們要學習如何實現Struts2與Hibernate集成。如果你不熟悉與Hibernate,那麼可以查看我們的Hibernate教程。\u003c/p\u003e \n\u003ch2\u003e 數據庫設置:\u003c/h2\u003e \n\u003cp\u003e 在本教程中,我會使用「struts2_tutorial」MySQL數據庫。我連接到我的機器上使用這個數據庫的用戶名「root」,並且沒有密碼。首先,你需要運行下面的腳本。此腳本創建稱爲student\u0026nbsp;,並創建一個新的表,此表中的記錄數:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pln\"\u003eCREATE TABLE IF NOT EXISTS \u003c/span\u003e\u003cspan class=\"str\"\u003e`student`\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"str\"\u003e`id`\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"lit\"\u003e11\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e NOT NULL AUTO_INCREMENT\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"str\"\u003e`first_name`\u003c/span\u003e\u003cspan class=\"pln\"\u003e varchar\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"lit\"\u003e40\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e NOT NULL\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"str\"\u003e`last_name`\u003c/span\u003e\u003cspan class=\"pln\"\u003e varchar\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"lit\"\u003e40\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e NOT NULL\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"str\"\u003e`marks`\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"lit\"\u003e11\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e NOT NULL\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n PRIMARY KEY \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e`id`\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e--\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e--\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eDumping\u003c/span\u003e\u003cspan class=\"pln\"\u003e data \u003c/span\u003e\u003cspan class=\"kwd\"\u003efor\u003c/span\u003e\u003cspan class=\"pln\"\u003e table \u003c/span\u003e\u003cspan class=\"str\"\u003e`student`\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e--\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\nINSERT INTO \u003c/span\u003e\u003cspan class=\"str\"\u003e`student`\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e`id`\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e`first_name`\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e`last_name`\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e`marks`\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n VALUES\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"lit\"\u003e1\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e'George'\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e'Kane'\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"lit\"\u003e20\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\nINSERT INTO \u003c/span\u003e\u003cspan class=\"str\"\u003e`student`\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e`id`\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e`first_name`\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e`last_name`\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e`marks`\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n VALUES\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"lit\"\u003e2\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e'Melissa'\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e'Michael'\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"lit\"\u003e91\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\nINSERT INTO \u003c/span\u003e\u003cspan class=\"str\"\u003e`student`\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e`id`\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e`first_name`\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e`last_name`\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e`marks`\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n VALUES\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"lit\"\u003e3\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e'Jessica'\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e'Drake'\u003c/span\u003e\u003cspan class=\"pun\"\u003e,\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"lit\"\u003e21\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003c/pre\u003e \n\u003ch2\u003e Hibernate的配置:\u003c/h2\u003e \n\u003cp\u003e 接下來讓我們創建這是Hibernate的配置文件hibernate.cfg.xml中。\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e'1.0'\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e'utf-8'\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE hibernate-configuration PUBLIC\r\n\"-//Hibernate/Hibernate Configuration DTD//EN\"\r\n\"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;hibernate-configuration\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;session-factory\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hibernate.connection.driver_class\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003ec\r\n om.mysql.jdbc.Driver\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/property\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hibernate.connection.url\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n jdbc:mysql://www.yiibai.com/struts_tutorial\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/property\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hibernate.connection.username\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eroot\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/property\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hibernate.connection.password\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u0026lt;/property\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hibernate.connection.pool_size\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e10\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/property\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"show_sql\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003etrue\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/property\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"dialect\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n org.hibernate.dialect.MySQLDialect\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/property\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hibernate.hbm2ddl.auto\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eupdate\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/property\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;mapping\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.hibernate.Student\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/session-factory\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/hibernate-configuration\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 讓我們通過hibernate的配置文件。首先,我們正在使用的MySQL驅動程序。然後,我們聲明 JDBC URL連接到數據庫。然後,聲明連接的用戶名,密碼以及池的大小。我們也表示,我們希望「show_sql」轉向真正看到SQL的日誌文件中。請經過Hibernate教程,瞭解這些屬性是什麼意思。最後,我們設置了的映射類com.yiibai.hibernate.Student,我們將本章中創建。\u003c/p\u003e \n\u003ch2\u003e 環境設置:\u003c/h2\u003e \n\u003cp\u003e 接下來,這個項目需要一大堆的jar文件。附所需的JAR文件的完整列表的截圖:\u003c/p\u003e \n\u003cimg alt=\"Struts and Hibernate Jars\" src=\"https://asset.1ju.org/cmsstatic/struts2hibernate-1.gif\"\u003e \n\u003cp\u003e 大部分的JAR文件可以作爲Struts的分佈的一部分。如果有一個如GlassFish應用服務器,WebSphere或JBoss安裝,那麼可以得到的大部分jar文件從應用服務器的lib文件夾。如果沒有,可以單獨下載的文件:\u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e \u003cp\u003e Hibernate jar files -\u0026nbsp;\u003ca href=\"http://www.hibernate.org/\"\u003eHibernate.org\u003c/a\u003e\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e Struts hibernate plugin -\u0026nbsp;\u003ca href=\"http://code.google.com/p/full-hibernate-plugin-for-struts2/downloads/list\"\u003eStruts hibernate plugin\u003c/a\u003e\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e JTA files-\u0026nbsp;\u003ca href=\"http://www.oracle.com/technetwork/java/javaee/jta/index.htmll\"\u003eJTA files\u003c/a\u003e\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e Dom4j files -\u0026nbsp;\u003ca href=\"http://dom4j.sourceforge.net/\"\u003eDom4j\u003c/a\u003e\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e SLF4J files -\u0026nbsp;\u003ca href=\"http://www.slf4j.org/\"\u003eSLF4J\u003c/a\u003e\u003c/p\u003e \u003c/li\u003e \n \u003cli\u003e \u003cp\u003e log4j files -\u0026nbsp;\u003ca href=\"http://logging.apache.org/log4j/1.2/\"\u003elog4j\u003c/a\u003e\u003c/p\u003e \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e 其餘的文件,應該能夠從struts2的分發得到。\u003c/p\u003e \n\u003ch2\u003e Hibernate 類:\u003c/h2\u003e \n\u003cp\u003e 現在讓我們來創建Hibernate集成所需的Java類。以下內容Student.java:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ehibernate\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e javax\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003epersistence\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eColumn\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e javax\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003epersistence\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eEntity\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e javax\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003epersistence\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eGeneratedValue\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e javax\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003epersistence\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eId\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e javax\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003epersistence\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eTable\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"lit\"\u003e@Entity\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"lit\"\u003e@Table\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"student\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eStudent\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@Id\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@GeneratedValue\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e id\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@Column\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"last_name\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e lastName\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@Column\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"first_name\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e firstName\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e marks\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e getId\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e id\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setId\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e id\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eid \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e id\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getLastName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e lastName\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setLastName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e lastName\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003elastName \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e lastName\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e getFirstName\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e firstName\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setFirstName\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e firstName\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003efirstName \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e firstName\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e getMarks\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e marks\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setMarks\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"kwd\"\u003eint\u003c/span\u003e\u003cspan class=\"pln\"\u003e marks\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003emarks \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e marks\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 這是一個POJO類,Hibernate的規範表。它擁有屬性id,firstName和lastName學生表中的列名對應。接下來讓我們創建StudentDAO.java文件如下:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ehibernate\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eArrayList\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e org\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ehibernate\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eSession\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e org\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ehibernate\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eTransaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egooglecode\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003es2hibernate\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eplugin\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n annotations\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eSessionTarget\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egooglecode\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003es2hibernate\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eplugin\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n annotations\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eTransactionTarget\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eStudentDAO\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@SessionTarget\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eSession\u003c/span\u003e\u003cspan class=\"pln\"\u003e session\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@TransactionTarget\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eTransaction\u003c/span\u003e\u003cspan class=\"pln\"\u003e transaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@SuppressWarnings\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"unchecked\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"typ\"\u003eStudent\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e getStudents\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"typ\"\u003eStudent\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e students \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eArrayList\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"typ\"\u003eStudent\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026gt;();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003etry\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n students \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e session\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ecreateQuery\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"str\"\u003e\"from Student\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e).\u003c/span\u003e\u003cspan class=\"pln\"\u003elist\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ecatch\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eException\u003c/span\u003e\u003cspan class=\"pln\"\u003e e\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n e\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eprintStackTrace\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e students\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e addStudent\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eStudent\u003c/span\u003e\u003cspan class=\"pln\"\u003e student\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n session\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003esave\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003estudent\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e StudentDAO類,學生類是數據訪問層。它有一些方法來列出所有學生,然後保存一個新的學生記錄。\u003c/p\u003e \n\u003ch2\u003e 動作類:\u003c/h2\u003e \n\u003cp\u003e 以下文件AddStudentAction.java定義我們的動作類。我們這裏有兩個動作方法 -\u0026nbsp;execute() 和 listStudents()。 execute()方法是用來添加新的學生記錄。使用DAO的save()方法來實現這一目標。另一種方法,listStudents()用來列出學生。我們使用DAO的的列表方法得到所有學生的名單。\u0026nbsp;\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"kwd\"\u003epackage\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estruts2\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eArrayList\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e java\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eutil\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eopensymphony\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003exwork2\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eModelDriven\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ehibernate\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eStudent\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003eimport\u003c/span\u003e\u003cspan class=\"pln\"\u003e com\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eyiibai\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003ehibernate\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"typ\"\u003eStudentDAO\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eclass\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eAddStudentAction\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003eextends\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eActionSupport\u003c/span\u003e\u003cspan class=\"pln\"\u003e \r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003eimplements\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eModelDriven\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"typ\"\u003eStudent\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026gt;{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eStudent\u003c/span\u003e\u003cspan class=\"pln\"\u003e student \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eStudent\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"typ\"\u003eStudent\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e students \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eArrayList\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"typ\"\u003eStudent\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026gt;();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"typ\"\u003eStudentDAO\u003c/span\u003e\u003cspan class=\"pln\"\u003e dao \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003enew\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eStudentDAO\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"lit\"\u003e@Override\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eStudent\u003c/span\u003e\u003cspan class=\"pln\"\u003e getModel\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e student\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e execute\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n dao\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003eaddStudent\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"pln\"\u003estudent\u003c/span\u003e\u003cspan class=\"pun\"\u003e);\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eString\u003c/span\u003e\u003cspan class=\"pln\"\u003e listStudents\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n students \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e dao\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003egetStudents\u003c/span\u003e\u003cspan class=\"pun\"\u003e();\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"str\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eStudent\u003c/span\u003e\u003cspan class=\"pln\"\u003e getStudent\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e student\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setStudent\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eStudent\u003c/span\u003e\u003cspan class=\"pln\"\u003e student\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estudent \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e student\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"typ\"\u003eStudent\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e getStudents\u003c/span\u003e\u003cspan class=\"pun\"\u003e()\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ereturn\u003c/span\u003e\u003cspan class=\"pln\"\u003e students\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003epublic\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"kwd\"\u003evoid\u003c/span\u003e\u003cspan class=\"pln\"\u003e setStudents\u003c/span\u003e\u003cspan class=\"pun\"\u003e(\u003c/span\u003e\u003cspan class=\"typ\"\u003eList\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"typ\"\u003eStudent\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e students\u003c/span\u003e\u003cspan class=\"pun\"\u003e)\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"pun\"\u003e{\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"kwd\"\u003ethis\u003c/span\u003e\u003cspan class=\"pun\"\u003e.\u003c/span\u003e\u003cspan class=\"pln\"\u003estudents \u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"pln\"\u003e students\u003c/span\u003e\u003cspan class=\"pun\"\u003e;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\t\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e}\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 實現ModelDriven接口你會注意到,這是用來當你的操作類處理一個具體的模型類(如學生),而不是個人屬性(如名字,姓氏)。的ModelAware接口需要實現的方法,以返回到模型。在我們的例子中,我們返回「學生」對象。\u003c/p\u003e \n\u003ch2\u003e 創建視圖文件:\u003c/h2\u003e \n\u003cp\u003e 現在讓我們創建student.jsp視圖文件包含以下內容:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e page contentType\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"text/html; charset=UTF-8\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"pun\"\u003e\u0026lt;%@\u003c/span\u003e\u003cspan class=\"pln\"\u003e taglib prefix\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"s\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e uri\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"/struts-tags\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e%\u0026gt;\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;html\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eHello World\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:head\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/head\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:form\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eaction\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"addStudent\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:textfield\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"firstName\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"First Name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:textfield\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"lastName\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Last Name\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:textfield\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"marks\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003elabel\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"Marks\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:submit/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;hr/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;table\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;tr\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;td\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eFirst Name\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/td\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;td\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eLast Name\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/td\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;td\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003eMarks\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/td\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/tr\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;s:iterator\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"students\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\t\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;tr\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;td\u0026gt;\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"firstName\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;/td\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;td\u0026gt;\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"lastName\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;/td\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;td\u0026gt;\u0026lt;s:property\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"marks\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u0026lt;/td\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/tr\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:iterator\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\t\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/table\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/s:form\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/body\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 非常簡單student.jsp。在上面的部分,我們有一個形式提交到「addStudent.action」。這需要在名字,姓氏和備註。因爲addStudent 動作,自動綁到ModelAware的「AddSudentAction」,將創建一個學生bean的名字,姓氏和標記自動填充的值。\u003c/p\u003e \n\u003cp\u003e 在底部,我們去通過的學生名單(見AddStudentAction.java)。我們遍歷列表和顯示的值在表中的姓氏,名稱和備註。\u003c/p\u003e \n\u003ch2\u003e Struts 配置:\u003c/h2\u003e \n\u003cp\u003e 讓我們把它放在一起使用struts.xml:\u003c/p\u003e \n\u003cpre class=\"prettyprint prettyprinted\"\u003e\r\n\u003cspan class=\"pun\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan class=\"pln\"\u003exml version\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"1.0\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e encoding\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"str\"\u003e\"UTF-8\"\u003c/span\u003e\u003cspan class=\"pun\"\u003e?\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\u003c/span\u003e\u003cspan class=\"dec\"\u003e\u0026lt;!DOCTYPE struts PUBLIC\r\n \"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n \"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;struts\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;constant\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"struts.devMode\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003evalue\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"true\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"tag\"\u003e/\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;package\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"myhibernate\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003eextends\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"hibernate-default\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"addStudent\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"execute\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.AddStudentAction\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003etype\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"redirect\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n listStudents\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;action\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"listStudents\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003emethod\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"listStudents\"\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"atn\"\u003eclass\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"com.yiibai.struts2.AddStudentAction\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;result\u003c/span\u003e\u003cspan class=\"pln\"\u003e \u003c/span\u003e\u003cspan class=\"atn\"\u003ename\u003c/span\u003e\u003cspan class=\"pun\"\u003e=\u003c/span\u003e\u003cspan class=\"atv\"\u003e\"success\"\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e/students.jsp\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/result\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/action\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/package\u0026gt;\u003c/span\u003e\u003cspan class=\"pln\"\u003e\r\n\r\n\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/struts\u0026gt;\u003c/span\u003e\u003c/pre\u003e \n\u003cp\u003e 這裏要注意的最重要的事情是,我們包函「myhibernate」擴展Struts2默認包稱爲「hibernate-default」。然後我們聲明兩個動作 - addStudent和listStudents。 addStudent調用execute()上AddStudentAction類,然後,它調用listStudents操作方法successs。\u003c/p\u003e \n\u003cp\u003e listStudent動作方法調用listStudents()上AddStudentAction類作爲視圖,並使用student.jsp\u003c/p\u003e \n\u003cp\u003e 現在右擊項目名稱,並單擊Export \u0026gt; WAR\u0026nbsp;文件創建一個WAR文件。然後部署這個WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/student.jsp。這會給你以下畫面:\u0026nbsp;\u003c/p\u003e \n\u003cimg alt=\"Struts and Hibernate Result\" src=\"https://asset.1ju.org/cmsstatic/struts2hibernate-2.gif\"\u003e \n\u003cp\u003e 在上面的部分,我們得到的一種形式,進入一個新的學生記錄和底部列出了學生在數據庫中的值。繼續並添加一個新的學生記錄,按提交。屏幕將刷新並顯示您的更新列表。\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"b8:T1caf,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 在這個例子中,我們將學習如何在Struts 2中創建一個Hello World例子。 \u003c/p\u003e \n\u003cp\u003e 使用以下庫或工具: \u003c/p\u003e \n\u003cul\u003e \n \u003cli\u003e MyEclipse 10 \u003c/li\u003e \n \u003cli\u003e Struts 2.1 \u003c/li\u003e \n\u003c/ul\u003e \n\u003cp\u003e 整個工程結構如下圖所示: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts-2-hello-world-xml-1.png\" alt=\"Struts 2 hello world (XML版本)\"\u003e \u003c/p\u003e \n\u003ch2\u003e 1. 創建一個Web項目工程 \u003c/h2\u003e \n\u003cp\u003e 啓動打開 MyEclipse,創建一個Web工程名稱爲:struts2-xml-demo,選擇 File -\u0026gt; New -\u0026gt; Web Project ,如下圖所示: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts-2-hello-world-xml-2.png\" alt=\"Struts 2 hello world (XML版本)\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003c/p\u003e \n\u003cp\u003e 在這個項目上添加 struts2 的支持,右鍵點擊\u0026nbsp;struts2-xml-demo 工程,選擇 MyEclipse -\u0026gt; Add Struts Capabilities,在彈出的對話框中選擇 Strut 2.1,如下圖所示: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts-2-hello-world-xml-3.png\" alt=\"Struts 2 hello world (XML版本)\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003c/p\u003e \n\u003ch2\u003e 2. JSP視圖文件 \u003c/h2\u003e \n\u003cp\u003e 這是一個JSP登錄頁面,它使用Struts2標籤來顯示用戶名,密碼輸入框和提交按鈕。 \u003c/p\u003e \n\u003cp\u003e Fie : login.jsp \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-html\"\u003e\u0026lt;%@ page contentType=\"text/html; charset=UTF-8\"%\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\"%\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n\t\u0026lt;h1\u0026gt;Struts 2 Hello World Example\u0026lt;/h1\u0026gt;\r\n\r\n\t\u0026lt;s:form action=\"Welcome\"\u0026gt;\r\n\t\t\u0026lt;s:textfield name=\"username\" label=\"Username\" /\u0026gt;\r\n\t\t\u0026lt;s:password name=\"password\" label=\"Password\" /\u0026gt;\r\n\t\t\u0026lt;s:submit /\u0026gt;\r\n\t\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cp\u003e \u003cem\u003e文件: welcome_user.jsp\u003c/em\u003e\u0026nbsp;– 一個JSP視圖用來頁面顯示歡迎信息給用戶。 \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-html\"\u003e\u0026lt;%@ page contentType=\"text/html; charset=UTF-8\"%\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\"%\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n\t\u0026lt;h1\u0026gt;Struts 2 Hello World 示例\u0026lt;/h1\u0026gt;\r\n\r\n\t\u0026lt;h2\u0026gt;\r\n\t\tHello\r\n\t\t\u0026lt;s:property value=\"username\" /\u0026gt;\r\n\t\u0026lt;/h2\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 對 Struts1 和 Struts2 有非常相似的UI標籤語法,只是在命名HTML元素,例如,術語有一點不同: \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eStruts 1\u003c/strong\u003e \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003e \u003c/strong\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-html\"\u003e\u0026lt;%@taglib uri=\"http://struts.apache.org/tags-html\" prefix=\"html\"%\u0026gt;\r\n\u0026lt;html:form action=\"Welcome\"\u0026gt;\r\n \u0026lt;html:text property=\"username\"/\u0026gt;\r\n\u0026lt;/html:form\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eStruts 2\u003c/strong\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-html\"\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;s:form action=\"Welcome\"\u0026gt;\r\n\t\u0026lt;s:textfield name=\"username\" label=\"Username\"/\u0026gt;\r\n\u0026lt;/s:form\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. 動作,所有的業務邏輯放在這裏 \u003c/h2\u003e \n\u003cp\u003e 一個簡單的 Struts2 的 Action 類,它裏面聲明的所有業務邏輯。 \u003c/p\u003e \n\u003cp\u003e File : WelcomeUserAction.java \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-java\"\u003epackage com.yiibai.user.action;\r\n\r\n/**\r\n * \r\n * @author yiibai.com\r\n *\r\n */\r\npublic class WelcomeUserAction {\r\n\t\r\n\tprivate String username;\r\n\r\n\tpublic String getUsername() {\r\n\t\treturn username;\r\n\t}\r\n\r\n\tpublic void setUsername(String username) {\r\n\t\tthis.username = username;\r\n\t}\r\n\r\n\t// all struts logic here\r\n\tpublic String execute() {\r\n\r\n\t\treturn \"SUCCESS\";\r\n\r\n\t}\r\n}\u003c/pre\u003e \n\u003cp\u003e 在Struts2中,Action類實現任何接口或擴展任何類不是必需的,但它需要創建一個execute()方法來實現所有的業務邏輯,並返回一個字符串值,告訴用戶重定向到哪裏。 \u003c/p\u003e \n\u003cdiv\u003e\n 注意 \n \u003cbr\u003e 您可能會看到一些用戶實現 com.opensymphony.xwork2.Action 類, 但它是完全可選的(不是必須的),因爲com.opensymphony.xwork2.Action只是提供一些方便的常量。 \n\u003c/div\u003e \n\u003cdiv\u003e\n Struts1中的Action類需要擴展org.apache.struts.action.Action。 但是,Struts 2的Action類是可選的,但是仍然允許執行com.opensymphony.xwork2.Action的一些方便的常量,或者擴展com.opensymphony.xwork2.ActionSupport 對於一些常見的默認動作執行的功能。 \n\u003c/div\u003e \n\u003ch2\u003e 5. Struts配置文件 \u003c/h2\u003e \n\u003cp\u003e Strut配置文件是用來連接所有的東西在一起。 XML文件名必須是\u0026nbsp;「struts.xml」。在這個實例中,它位於\u0026nbsp; \u003c/p\u003e \n\u003cp\u003e \u003cem\u003eFile : struts.xml\u003c/em\u003e \u003c/p\u003e \n\u003cp\u003e \u003cem\u003e \u003c/em\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-xml\"\u003e\u003cem\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC \"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN\" \"http://struts.apache.org/dtds/struts-2.1.dtd\"\u0026gt;\r\n\u0026lt;struts\u0026gt;\r\n\t\u0026lt;package name=\"user\" namespace=\"/User\" extends=\"struts-default\"\u0026gt;\r\n\t\t\u0026lt;action name=\"Login\"\u0026gt;\r\n\t\t\t\u0026lt;result\u0026gt;/login.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\u0026lt;action name=\"Welcome\" class=\"com.yiibai.user.action.WelcomeUserAction\"\u0026gt;\r\n\t\t\t\u0026lt;result name=\"SUCCESS\"\u0026gt;/welcome_user.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt; \u003c/em\u003e\u003c/pre\u003e \n\u003cem\u003e \u003c/em\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cp\u003e 聲明包和包含動作類,動作類是不言自明的,但你仍可能會感興趣下面的新標籤: \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003e1. package name=」user」\u003c/strong\u003e\u003cbr\u003e 就在包名,並不真正去關心它。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003e2. namespace=」/User」\u003c/strong\u003e\u003cbr\u003e 它用於匹配「/User」URL模式。 \u003c/p\u003e \n\u003cdiv\u003e\n 注意 \n \u003cbr\u003e 實際上,Struts2的命名空間相當於Struts的1多個功能模塊 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003e3. extends=」struts-default」\u003c/strong\u003e\u003cbr\u003e 這意味着該包是擴展了struts-default 包組件和攔截器,這是在struts-default.xml中文件中聲明的,位於struts2-core.jar 文件的根目錄。 \u003c/p\u003e \n\u003ch2\u003e 6. web.xml \u003c/h2\u003e \n\u003cp\u003e 配置Web應用程序部署描述符(web.xml)文件Struts2的集成到Web項目。 \u003c/p\u003e \n\u003cp\u003e \u003cem\u003eFile web.xml\u003c/em\u003e \u003c/p\u003e \n\u003cp\u003e \u003cem\u003e \u003c/em\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-xml\"\u003e\u003cem\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\"?\u0026gt;\r\n\u0026lt;web-app version=\"3.0\" \r\n\txmlns=\"http://java.sun.com/xml/ns/javaee\" \r\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" \r\n\txsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee \r\n\thttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\u0026gt;\r\n \u0026lt;display-name\u0026gt;\u0026lt;/display-name\u0026gt;\t\r\n \u0026lt;welcome-file-list\u0026gt;\r\n \u0026lt;welcome-file\u0026gt;index.jsp\u0026lt;/welcome-file\u0026gt;\r\n \u0026lt;/welcome-file-list\u0026gt;\r\n \u0026lt;filter\u0026gt;\r\n \t\u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n \t\u0026lt;filter-class\u0026gt;\r\n \t\torg.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter\r\n \t\u0026lt;/filter-class\u0026gt;\r\n \u0026lt;/filter\u0026gt;\r\n \u0026lt;filter-mapping\u0026gt;\r\n \t\u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n \t\u0026lt;url-pattern\u0026gt;*.action\u0026lt;/url-pattern\u0026gt;\r\n \u0026lt;/filter-mapping\u0026gt;\u0026lt;/web-app\u0026gt;\u003c/em\u003e\u003c/pre\u003e \n\u003ch2\u003e 7. 運行測試結果 \u003c/h2\u003e \n\u003cp\u003e 在Struts2中,可以直接使用.action後綴訪問操作類。如下URL: \u003c/p\u003e \n\u003cp\u003e http://localhost:8080/struts2-xml-demo/User/Login.action \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts-2-hello-world-xml-4.png\" alt=\"Struts 2 hello world (XML版本)\"\u003e \u003c/p\u003e \n\u003cp\u003e 提交後到 http://localhost:8080/Struts2Example/User/Welcome.action 顯示如下: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts-2-hello-world-xml-5.png\" alt=\"Struts 2 hello world (XML版本)\"\u003e \u003c/p\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"b9:T2078,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e\n 在這個教程,我們重複使用以前 STRUST2 \u0026nbsp;Hello\u0026nbsp;World(XML版本)的例子,並將其轉換成註解版本。 \n\u003c/div\u003e \n\u003ch2\u003e Struts2\u0026nbsp;註解概念 \u003c/h2\u003e \n\u003cdiv\u003e\n Struts2註解是由Struts\u0026nbsp;2的約定插件的支持,所以,必須要了解其背後的「掃描方法」和「命名轉換」機制的魔力。 \n\u003c/div\u003e \n\u003ch2\u003e 1.\u0026nbsp;掃描方法 \u003c/h2\u003e \n\u003cdiv\u003e\n 許多Struts\u0026nbsp;2的文章或書籍說,可以配置過濾器的「init-param」或「struts.convention.action.packages」告訴Struts2,其中掃描註解的類。\u0026nbsp;例如, \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eweb.xml\u003c/strong\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-xml\"\u003e\u0026lt;filter\u0026gt;\r\n \u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n \u0026lt;filter-class\u0026gt;org.apache.struts2.dispatcher.FilterDispatcher\u0026lt;/filter-class\u0026gt;\r\n \u0026lt;init-param\u0026gt;\r\n\t\u0026lt;param-name\u0026gt;actionPackages\u0026lt;/param-name\u0026gt;\r\n\t\u0026lt;param-value\u0026gt;com.yiibai.common\u0026lt;/param-value\u0026gt;\r\n \u0026lt;/init-param\u0026gt;\r\n\u0026lt;/filter\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 從測試(Struts22.1.6和2.1.8版本),這是不正確的,不管你把在「param-value」還是\u0026nbsp;「struts.convention.action.packages「,\u0026nbsp;在Struts\u0026nbsp;2會忽略它,並只掃描指定的文件夾命名:struts,\u0026nbsp;struts2,\u0026nbsp;action\u0026nbsp;或\u0026nbsp;actions\u0026nbsp;。 \u003c/p\u003e \n\u003cdiv\u003e\n 下面是掃描工作 \n\u003c/div\u003e \n\u003col\u003e \n \u003cli\u003e 掃描其位於包的命名註解的類\u0026nbsp;「struts, struts2, action 或 actions「. \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 接着,掃描相匹配下列任一條件的文件: \n \u003c/div\u003e \n \u003cul\u003e \n \u003cli\u003e 實例了\u0026nbsp;com.opensymphony.xwork2.Action\u0026nbsp;接口。 \u003c/li\u003e \n \u003cli\u003e 擴展了\u0026nbsp;com.opensymphony.xwork2.ActionSupport\u0026nbsp;類 \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 文件名用動作(例如:UserAction,LoginAction)結束 \n \u003c/div\u003e \u003c/li\u003e \n \u003c/ul\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e 詳細請查看這裏\u003ca href=\"http://struts.apache.org/docs/convention-plugin.html#ConventionPlugin-Codebehindhelloworld\"\u003eStruts 2\u0026nbsp;約定插件文件\u003c/a\u003e \u003c/p\u003e \n\u003ch2\u003e 2.\u0026nbsp;命名轉換器 \u003c/h2\u003e \n\u003cdiv\u003e\n Struts\u0026nbsp;2的約定插件將所有的註解操作文件名轉換爲指定的格式。 \n\u003c/div\u003e \n\u003cp\u003e 例如 :\u0026nbsp;LoginAction.java \u003c/p\u003e \n\u003col\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 首先,去掉「Action」字符在文件名的末尾,如果存在的話。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 其次,轉換文件名的第一個字母爲小寫。 \n \u003c/div\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv\u003e\n 因此,去除結束並轉換第一個字母爲小寫後,LoginAction.action 將變爲 login.action。 \n\u003c/div\u003e \n\u003cdiv\u003e\n Struts2約定插件的「掃描方法」和「命名轉換」特性真正帶來了很多的便利和好處,只有當你的Struts2項目正確下面的命名約定纔會帶來好處; 否則,這將是一場災難。 \n\u003c/div\u003e \n\u003ch2\u003e Struts 2\u0026nbsp;註解例子 \u003c/h2\u003e \n\u003cdiv\u003e\n 現在是時候開始轉換過程了,我們使用MyEclipse 10 創建一個工程爲:struts2example。 \n\u003c/div\u003e \n\u003ch2\u003e \u003cp\u003e 最終的項目結構 \u003c/p\u003e \u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-1.png\" alt=\"Struts2註解示例\"\u003e \u003c/p\u003e \u003c/h2\u003e \n\u003ch2\u003e 2. LoginAction \u003c/h2\u003e \n\u003cp\u003e 擴展ActionSupport並創建了LoginAction,什麼也不做,ActionSupport\u0026nbsp;默認返回 「success」 字符串,這將匹配\u0026nbsp;@Result 並重定位到 「pages/login.jsp「. \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003e註解版本\u003c/strong\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-java\"\u003epackage com.yiibai.user.action;\r\n\r\nimport org.apache.struts2.convention.annotation.Namespace;\r\nimport org.apache.struts2.convention.annotation.Result;\r\nimport org.apache.struts2.convention.annotation.ResultPath;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\n@Namespace(\"/User\")\r\n@ResultPath(value=\"/\")\r\n@Result(name=\"success\",location=\"/login.jsp\")\r\npublic class LoginAction extends ActionSupport{\r\n\r\n}\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eXML 實現版本\u003c/strong\u003e \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003e \u003c/strong\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-xml\"\u003e\u003cstrong\u003e\u0026lt;package name=\"user\" namespace=\"/User\" extends=\"struts-default\"\u0026gt;\r\n\t\u0026lt;action name=\"Login\"\u0026gt;\r\n\t\t\u0026lt;result\u0026gt;/login.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\u0026lt;/package\u0026gt;\u003c/strong\u003e\u003c/pre\u003e \n\u003ch2\u003e 3. WelcomeUserAction \u003c/h2\u003e \n\u003cp\u003e 重寫execute()方法並指定\u0026nbsp;@Action 和 @Result 註解。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003e註解版本\u003c/strong\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-java\"\u003epackage com.yiibai.user.action;\r\n\r\nimport org.apache.struts2.convention.annotation.Action;\r\nimport org.apache.struts2.convention.annotation.Namespace;\r\nimport org.apache.struts2.convention.annotation.Result;\r\nimport org.apache.struts2.convention.annotation.ResultPath;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\n@Namespace(\"/User\")\r\n@ResultPath(value=\"/\")\r\npublic class WelcomeUserAction extends ActionSupport{\r\n\r\n\tprivate String username;\r\n\t \r\n\tpublic String getUsername() {\r\n\t\treturn username;\r\n\t}\r\n\r\n\tpublic void setUsername(String username) {\r\n\t\tthis.username = username;\r\n\t}\r\n\r\n\t@Action(value=\"Welcome\", results={\r\n\t\t@Result(name=\"success\",location=\"welcome_user.jsp\")\r\n\t})\r\n\tpublic String execute() {\r\n\r\n\t\treturn SUCCESS;\r\n\r\n\t}\r\n}\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003e\u003cstrong\u003eXML 實現版本\u003c/strong\u003e\u003c/strong\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-xml\"\u003e\u0026lt;package name=\"user\" namespace=\"/User\" extends=\"struts-default\"\u0026gt;\r\n \u0026lt;action name=\"Welcome\" class=\"com.yiibai.user.action.WelcomeUserAction\"\u0026gt;\r\n\t\u0026lt;result name=\"SUCCESS\"\u0026gt;/welcome_user.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\u0026lt;/package\u0026gt;\u003c/pre\u003e \n\u003cdiv\u003e\n Struts 2 註解 –\u0026nbsp;@Action,\u0026nbsp;@Result\u0026nbsp;和\u0026nbsp;@Namespace\u0026nbsp;不言自明,可以將它與XML比較。@ResultPath\u0026nbsp;可能需要一點點的解釋,請參閱本\u0026nbsp;@ResultPath示例 \n\u003c/div\u003e \n\u003ch2\u003e 4. JSP視圖頁面 \u003c/h2\u003e \n\u003cdiv\u003e\n 普通JSP視圖頁面來接受用戶名和密碼後點擊提交按鈕,並重定向到一個歡迎頁面。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003elogin.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-html\"\u003e\u0026lt;%@ page contentType=\"text/html; charset=UTF-8\"%\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\"%\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n\t\u0026lt;h1\u0026gt;Struts 2 註解示例\u0026lt;/h1\u0026gt;\r\n\r\n\t\u0026lt;s:form action=\"Welcome\"\u0026gt;\r\n\t\t\u0026lt;s:textfield name=\"username\" label=\"用戶名\" /\u0026gt;\r\n\t\t\u0026lt;s:password name=\"password\" label=\"密碼\" /\u0026gt;\r\n\t\t\u0026lt;s:submit value=\"提交\"/\u0026gt;\r\n\t\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003ewelcome_user.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-html\"\u003e\u0026lt;%@ page contentType=\"text/html; charset=UTF-8\" %\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 註解示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h4\u0026gt;您好, \u0026lt;s:property value=\"username\"/\u0026gt;\u0026lt;/h4\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. struts.xml \u003c/h2\u003e \n\u003cdiv\u003e\n 所有類註解無需創建 struts.xml 文件。 \n\u003c/div\u003e \n\u003ch2\u003e 6. web.xml \u003c/h2\u003e \n\u003cp\u003e 只要創建一個典型的web.xml文件,並聲明FilterDispatcher過濾器標準。 \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-xml\"\u003e\u0026lt;!DOCTYPE web-app PUBLIC\r\n \"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN\"\r\n \"http://java.sun.com/dtd/web-app_2_3.dtd\" \u0026gt;\r\n\r\n\u0026lt;web-app\u0026gt;\r\n \u0026lt;display-name\u0026gt;Struts 2 Web Application\u0026lt;/display-name\u0026gt;\r\n \r\n \u0026lt;filter\u0026gt;\r\n\t\u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n\t\u0026lt;filter-class\u0026gt;org.apache.struts2.dispatcher.FilterDispatcher\u0026lt;/filter-class\u0026gt;\r\n \u0026lt;/filter\u0026gt;\r\n \r\n \u0026lt;filter-mapping\u0026gt;\r\n\t\u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n\t\u0026lt;url-pattern\u0026gt;/*\u0026lt;/url-pattern\u0026gt;\r\n \u0026lt;/filter-mapping\u0026gt;\r\n \r\n\u0026lt;/web-app\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 7. 運行測試 \u003c/h2\u003e \n\u003cdiv\u003e\n LoginAction.action 改爲 login.action,請參閱上面的「命名轉換器」。 \n\u003c/div\u003e \n\u003cp\u003e \u003ca href=\"http://localhost:8080/struts2example/User/login.action\"\u003ehttp://localhost:8080/struts2example/User/login.action\u003c/a\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-2.png\" alt=\"Struts2註解示例\"\u003e \u003c/p\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003cp\u003e 提交到\u0026nbsp;\u003ca href=\"http://localhost:8080/Struts2Example/User/Welcome.action\"\u003ehttp://localhost:8080/Struts2Example/User/Welcome.action\u003c/a\u003e\u0026nbsp;後顯示: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-3.png\" alt=\"Struts2註解示例\"\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/convention-plugin.html\"\u003eStruts 2 約定插件文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e Strust 2 Hello World (XML 版本) \u003c/li\u003e \n\u003c/ol\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"ba:Tb63,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e\n 在Struts 2中,\u0026nbsp;@ResultPath 註解用於控制Struts2找到存儲的結果或JSP頁面。默認情況下,它會找到結果頁在\u0026nbsp;「WEB-INF/content/」 文件夾。 \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003cspan\u003e不知道爲什麼在Struts2註解設置\u003c/span\u003e\u0026nbsp;「WEB-INF/content/」 作爲默認目錄, 但是大部分的應用並不將結果頁放入到 「WEB-INF/content/」 目錄. 可能 \n \u003cspan\u003eStruts2慣例也並不是一個標準的文件夾結構。\u003c/span\u003e \n \u003cspan\u003e\u0026nbsp;\u003c/span\u003e \n \u003cspan\u003e我一般是在 Struts\u0026nbsp;2 根路徑作爲默認的文件夾。\u003c/span\u003e \n\u003c/div\u003e \n\u003ch2\u003e @ResultPath 示例 \u003c/h2\u003e \n\u003ch2\u003e 1. 默認結果路徑 \u003c/h2\u003e \n\u003cp\u003e 在登錄動作類,設置 「/User」 作爲命名空間, 並重定向到 「pages/login.jsp」 頁面。 \u003c/p\u003e \n\u003cp\u003e P.S\u0026nbsp;假設struts2example是上下文servlet名稱 \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-java\"\u003e@Namespace(\"/User\")\r\n@Result(name=\"success\",location=\"pages/login.jsp\")\r\npublic class LoginAction extends ActionSupport{\r\n}\u003c/pre\u003e \n\u003cp\u003e 訪問它,如下: \u003c/p\u003e \n\u003cpre\u003ehttp\u003cspan\u003e:\u003c/span\u003e\u003cspan\u003e/\u003c/span\u003e\u003cspan\u003e/\u003c/span\u003elocalhost\u003cspan\u003e:\u003c/span\u003e\u003cspan\u003e8080\u003c/span\u003e\u003cspan\u003e/\u003c/span\u003estruts2example\u003cspan\u003e/\u003c/span\u003eUser\u003cspan\u003e/\u003c/span\u003elogin\u003cspan\u003e.\u003c/span\u003eaction\u003c/pre\u003e \n\u003cdiv\u003e\n Struts\u0026nbsp;2將從默認位置找到「login.jsp」結果頁面: \n\u003c/div\u003e \n\u003cpre\u003e\u003cspan\u003e/\u003c/span\u003estruts2example\u003cspan\u003e/\u003c/span\u003eWEB\u003cspan\u003e-\u003c/span\u003eINF\u003cspan\u003e/\u003c/span\u003econtent\u003cspan\u003e/\u003c/span\u003eUser\u003cspan\u003e/\u003c/span\u003epages\u003cspan\u003e/\u003c/span\u003elogin\u003cspan\u003e.\u003c/span\u003ejsp\u003c/pre\u003e \n\u003ch2\u003e 2. 定製結果路徑 \u003c/h2\u003e \n\u003cp\u003e 如果JSP結果頁面存儲在其他位置,那麼可以使用 @ResultPath註釋設置改變它。 \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-java\"\u003e@Namespace(\"/User\")\r\n@ResultPath(value=\"/\")\r\n@Result(name=\"success\",location=\"pages/login.jsp\")\r\npublic class LoginAction extends ActionSupport{\r\n}\u003c/pre\u003e \n\u003cp\u003e 再一次訪問: \u003c/p\u003e \n\u003cpre\u003ehttp\u003cspan\u003e:\u003c/span\u003e\u003cspan\u003e/\u003c/span\u003e\u003cspan\u003e/\u003c/span\u003elocalhost\u003cspan\u003e:\u003c/span\u003e\u003cspan\u003e8080\u003c/span\u003e\u003cspan\u003e/s\u003c/span\u003etruts2example\u003cspan\u003e/\u003c/span\u003eUser\u003cspan\u003e/\u003c/span\u003elogin\u003cspan\u003e.\u003c/span\u003eaction\u003c/pre\u003e \n\u003cdiv\u003e\n 現在Struts2將從不同的位置找到「login.jsp」結果頁面: \n\u003c/div\u003e \n\u003cpre\u003e\u003cspan\u003e/\u003c/span\u003eStruts2Example\u003cspan\u003e/\u003c/span\u003eUser\u003cspan\u003e/\u003c/span\u003epages\u003cspan\u003e/\u003c/span\u003elogin\u003cspan\u003e.\u003c/span\u003ejsp\u003c/pre\u003e \n\u003ch2\u003e 全局@ResultPath \u003c/h2\u003e \n\u003cp\u003e @ResultPath只適用於類級別。在全局範圍內應用它,可以在 struts.xml 文件中進行配置。 \u003c/p\u003e \n\u003cp\u003e struts.xml \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-xml\"\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n\u0026lt;struts\u0026gt;\r\n\t\u0026lt;constant name=\"struts.convention.result.path\" value=\"/\"/\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8.1/docs/convention-plugin.html#ConventionPlugin-ResultPathannotation\"\u003eStruts 2 @ResultPath 註解文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"bb:Td77,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e \n \u003cspan\u003eStruts\u0026nbsp;2自帶有「包含文件」功能,包含多個Struts配置文件合併爲一個單元。\u003c/span\u003e \n \u003c/div\u003e \n\u003c/div\u003e \n\u003ch2\u003e \n \u003cdiv\u003e\n 單個Struts配置文件 \n \u003c/div\u003e \u003c/h2\u003e \n\u003cdiv\u003e\n 讓我們來看看一個糟糕的 Struts\u0026nbsp;2 配置示例。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003estruts.xml\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \r\n\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\u0026lt;/package\u0026gt;\r\n\r\n\u0026lt;package name=\"audit\" namespace=\"/audit\" extends=\"struts-default\"\u0026gt;\r\n\t\u0026lt;action name=\"WelcomeAudit\"\u0026gt;\r\n\t\t\u0026lt;result\u0026gt;pages/welcome_audit.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\u0026lt;/package\u0026gt;\r\n\r\n\u0026lt;package name=\"user\" namespace=\"/user\" extends=\"struts-default\"\u0026gt;\r\n\t\u0026lt;action name=\"WelcomeUser\"\u0026gt;\r\n\t\t\u0026lt;result\u0026gt;pages/welcome_user.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\u0026lt;/package\u0026gt;\r\n\r\n\u0026lt;/struts\u0026gt;\u0026nbsp;\u003c/pre\u003e \n\u003cp\u003e 在上面的Struts配置文件中,組織所有「用戶」和「審覈」配置設置在一個文件中,這不是建議的,必須迴避。應該打破這種形式,而將struts.xml文件分成更小的模塊相關的部分。 \u003c/p\u003e \n\u003ch2\u003e \n \u003cdiv\u003e\n 多個Struts配置文件 \n \u003c/div\u003e \u003c/h2\u003e \n\u003cdiv\u003e\n 在Struts2,應該給每個模塊一個Struts配置文件。在這種情況下,可以創建三個文件: \n\u003c/div\u003e \n\u003col\u003e \n \u003cli\u003e audit-struts.xml –\u0026nbsp;將所有審計模塊設置在這裏。 \u003c/li\u003e \n \u003cli\u003e user-struts.xml –\u0026nbsp;將所有用戶模塊設置在這裏。 \u003c/li\u003e \n \u003cli\u003e struts.xml –\u0026nbsp;默認設置,包含 struts-audit.xml 和 Struts-user.xml 兩個文件。 \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e \u003cstrong\u003estruts-audit.xml\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n\u0026lt;package name=\"audit\" namespace=\"/audit\" extends=\"struts-default\"\u0026gt;\r\n\t\u0026lt;action name=\"WelcomeAudit\"\u0026gt;\r\n\t\t\u0026lt;result\u0026gt;pages/welcome_audit.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\u0026lt;/package\u0026gt;\r\n\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003estruts-user.xml\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \r\n\u0026lt;package name=\"user\" namespace=\"/user\" extends=\"struts-default\"\u0026gt;\r\n\t\u0026lt;action name=\"WelcomeUser\"\u0026gt;\r\n\t\t\u0026lt;result\u0026gt;pages/welcome_user.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\u0026lt;/package\u0026gt;\r\n\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003estruts.xml\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \r\n\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\u0026lt;/package\u0026gt;\r\n\r\n\u0026lt;include file=\"conf/user-struts.xml\"\u0026gt;\u0026lt;/include\u0026gt;\r\n\u0026lt;include file=\"conf/audit-struts.xml\"\u0026gt;\u0026lt;/include\u0026gt;\r\n\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 現在文件夾結構看起來如下: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-include-1.png\" alt=\"Struts2 include(包含)多個配置文件\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"bc:T12e2,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e\n Struts\u0026nbsp;2的命名空間是一個新的概念,用來處理多個模塊。由下式給出一個命名空間的每個模塊。此外,它還可以用來避免位於不同的模塊相同的操作名稱之間的衝突。 \n\u003c/div\u003e \n\u003cp\u003e 看下面的一張圖來了解一個URL匹配Struts\u0026nbsp;2的動作命名空間。 \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-4.png\" alt=\"Struts2命名空間配置和解釋\"\u003e \u003c/p\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003ch2\u003e 1. 命名空間配置 \u003c/h2\u003e \n\u003cdiv\u003e\n 讓我們通過一個Struts2的命名空間配置的例子來了解它是如何與URL和文件夾相匹配。 \n\u003c/div\u003e \n\u003cp\u003e P.S\u0026nbsp;包中的「name」不會影響結果,只是給一個有意義的名字。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003estruts.xml\u003c/strong\u003e \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003e \u003c/strong\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-xml\"\u003e\u003cstrong\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC \"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN\" \"http://struts.apache.org/dtds/struts-2.1.dtd\"\u0026gt;\r\n\u0026lt;struts\u0026gt;\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\u0026lt;action name=\"SayWelcome\"\u0026gt;\r\n\t\t\t\u0026lt;result\u0026gt;/pages/welcome.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\u0026lt;/package\u0026gt;\r\n\r\n\t\u0026lt;package name=\"common\" namespace=\"/common\" extends=\"struts-default\"\u0026gt;\r\n\t\t\u0026lt;action name=\"SayWelcome\"\u0026gt;\r\n\t\t\t\u0026lt;result\u0026gt;/common/pages/welcome.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\u0026lt;/package\u0026gt;\r\n\r\n\t\u0026lt;package name=\"user\" namespace=\"/user\" extends=\"struts-default\"\u0026gt;\r\n\t\t\u0026lt;action name=\"SayWelcome\"\u0026gt;\r\n\t\t\t\u0026lt;result\u0026gt;/common/user/welcome.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt; \u003c/strong\u003e\u003c/pre\u003e \n\u003cp\u003e Struts\u0026nbsp;2的動作命名空間映射到文件夾結構。 \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-5.png\" alt=\"Struts2命名空間配置和解釋\"\u003e \u003c/p\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003ch2\u003e 2. JSP視圖頁面 \u003c/h2\u003e \n\u003cp\u003e 3\u0026nbsp;JSP頁面視圖具有相同的文件名,但是在不同的模塊位置。 \u003c/p\u003e \n\u003cp\u003e 根 – \u0026nbsp;pages/welcome.jsp \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-html\"\u003e\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;title\u0026gt;Struts2命名空間示例 - yiibai.com\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n\t\u0026lt;h1\u0026gt;Struts2命名空間示例\u0026lt;/h1\u0026gt;\r\n\t\u0026lt;h4\u0026gt;Welcome - namespace = \"root\"\u0026lt;/h4\u0026gt;\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e Common 模塊 – \u0026nbsp;common/pages/welcome.jsp \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-html\"\u003e\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;title\u0026gt;Struts2命名空間示例 - yiibai.com\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n\t\u0026lt;h1\u0026gt;Struts2命名空間示例\u0026lt;/h1\u0026gt;\r\n\t\u0026lt;h4\u0026gt;Welcome - namespace = \"common\"\u0026lt;/h4\u0026gt;\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e User 模塊 – \u0026nbsp;user/pages/welcome.jsp \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-html\"\u003e\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;title\u0026gt;Struts2命名空間示例 - yiibai.com\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n\t\u0026lt;h1\u0026gt;Struts2命名空間示例\u0026lt;/h1\u0026gt;\r\n\r\n\t\u0026lt;h4\u0026gt;Welcome - namespace = \"user\"\u0026lt;/h4\u0026gt;\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. 映射 – 如何工作? \u003c/h2\u003e \n\u003cp\u003e \u003cstrong\u003e示例 1\u003c/strong\u003e\u003cbr\u003e URL :\u0026nbsp;http://localhost:8080/Struts2Example/SayWelcome.action \u003c/p\u003e \n\u003cp\u003e 將匹配根命名空間。 \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-xml\"\u003e\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\u0026lt;action name=\"SayWelcome\"\u0026gt;\r\n\t\t\t\u0026lt;result\u0026gt;/pages/welcome.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\u0026lt;/package\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 這會顯示\u0026nbsp;pages/welcome.jsp 頁面的內容 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003e示例 2\u003c/strong\u003e\u003cbr\u003e URL :\u0026nbsp;http://localhost:8080/Struts2Example/common/SayWelcome.action\u003cbr\u003e 這會匹配\u0026nbsp;common 命名空間的內容: \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-xml\"\u003e\t\u0026lt;package name=\"common\" namespace=\"/common\" extends=\"struts-default\"\u0026gt;\r\n\t\t\u0026lt;action name=\"SayWelcome\"\u0026gt;\r\n\t\t\t\u0026lt;result\u0026gt;/common/pages/welcome.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\u0026lt;/package\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 這會顯示\u0026nbsp;\u003cstrong\u003e\u003cstrong\u003ecommon/pages/welcome.jsp\u003c/strong\u003e\u0026nbsp;\u003c/strong\u003e頁面的內容 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003e示例 3\u003c/strong\u003e\u003cbr\u003e URL :\u0026nbsp;http://localhost:8080/Struts2Example/user/SayWelcome.action\u003cbr\u003e 這會匹配 common 命名空間的內容: \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-xml\"\u003e\u0026lt;package name=\"user\" namespace=\"/user\" extends=\"struts-default\"\u0026gt;\r\n\t\u0026lt;action name=\"SayWelcome\"\u0026gt;\r\n\t\t\u0026lt;result\u0026gt;/common/user/welcome.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\u0026lt;/package\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 這會顯示\u0026nbsp;\u003cstrong\u003euser/pages/welcome.jsp\u003c/strong\u003e\u0026nbsp;頁面的內容. \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003cp\u003e \u003c/p\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/namespace-configuration.html\"\u003eStruts2命名空間配置參考\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e 代碼下載:\u003ca href=\"http://pan.baidu.com/s/1hqe1nZe\"\u003ehttp://pan.baidu.com/s/1hqe1nZe\u003c/a\u003e \u003c/p\u003e \n\u003cp\u003e\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"bd:T737,"])</script><script>self.__next_f.push([1,"\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cp\u003e 在Struts2開發中,這應該是第一個學習配置的值。爲了啓用 Struts\u0026nbsp;2 的開發模式,可以通過自動配置顯著增加Struts2的開發速度和屬性文件加載,以及額外的日誌和調試功能。 \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e \n \u003cem\u003e\u003cstrong\u003e注:\u003c/strong\u003e自動重新加載功能真的是一個方便的功能。\u003c/em\u003e \n \u003cem\u003e每次修改屬性或XML配置文件更改,應用程序不再需要重啓才能生效。\u003c/em\u003e \n \u003c/div\u003e \n \u003cdiv\u003e \n \u003cdiv\u003e \n \u003cem\u003e默認情況下,Struts\u0026nbsp;2的開發模式是禁用的。\u003c/em\u003e \n \u003c/div\u003e \n \u003c/div\u003e \n \u003ch2\u003e \n \u003cdiv\u003e\n 啓用Struts2開發模式 \n \u003c/div\u003e \u003c/h2\u003e \n \u003cdiv\u003e\n 將「struts.devMode」的值設置爲true,可以在Struts的屬性文件或XML配置文件。 \n \u003c/div\u003e \n \u003cp\u003e \u003cstrong\u003estruts.properties\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003estruts.devMode = true\r\u003c/pre\u003e \n \u003cp\u003e \u003cstrong\u003estruts.xml\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003e\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n \u003ch2\u003e \n \u003cdiv\u003e\n 禁用Struts\u0026nbsp;2的開發模式 \n \u003c/div\u003e \u003c/h2\u003e \n \u003cp\u003e 設置「struts.devMode」爲false,無論是在Struts屬性文件或XML配置文件。 \u003c/p\u003e \n \u003cp\u003e \u003cstrong\u003estruts.properties\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003estruts.devMode = false\r\u003c/pre\u003e \n \u003cp\u003e \u003cstrong\u003estruts.xml\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003e\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"false\" /\u0026gt;\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n \u003cdiv\u003e\n 開發模式只適合於開發和調試環境。在生產環境中,你必須禁用它。因爲整個應用程序的配置 \n \u003cspan\u003e它會引起對性能顯著影響\u003c/span\u003e,屬性文件將在每次請求重新加載,許多額外的日誌和調試信息也將提供。 \n \u003c/div\u003e \n \u003ch2\u003e 參考 \u003c/h2\u003e \n \u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/devmode.html\"\u003eStruts 2 開發模式文檔\u003c/a\u003e \u003c/li\u003e \n \u003c/ol\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"be:T742,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e\n 在Struts2中,所有動作類有一個默認的後綴 .action 擴展。\u0026nbsp;例如, \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;struts\u0026gt;\r\n \u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\u0026lt;action name=\"SayStruts2\"\u0026gt;\r\n\t\t\u0026lt;result\u0026gt;pages/printStruts2.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003cdiv\u003e\n 如要訪問「SayStruts2」動作類,需要使用以下網址: \n\u003c/div\u003e \n\u003cpre\u003eAction URL : http://localhost:8080/Struts2Example/SayStruts2.action\u003c/pre\u003e \n\u003ch2\u003e \n \u003cdiv\u003e\n 配置動作擴展 \n \u003c/div\u003e \u003c/h2\u003e \n\u003cdiv\u003e\n Struts\u0026nbsp;2是允許配置擴展名的,要對其進行更改,只需要聲明一個常數「struts.action.extension」值: \n\u003c/div\u003e \n\u003ch2\u003e 1. html 擴展 \u003c/h2\u003e \n\u003cdiv\u003e\n 更改動作類爲 .html 的擴展名。 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;struts\u0026gt;\r\n\t \r\n \u0026lt;constant name=\"struts.action.extension\" value=\"html\"/\u0026gt; \r\n\t\r\n \u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\u0026lt;action name=\"SayStruts2\"\u0026gt;\r\n\t\t\u0026lt;result\u0026gt;pages/printStruts2.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003cdiv\u003e\n 現在,可以通過訪問「SayStruts2」動作類,使用如下URL: \n\u003c/div\u003e \n\u003cpre\u003eAction URL : http://localhost:8080/Struts2Example/SayStruts2.html\u003c/pre\u003e \n\u003ch2\u003e 2. 不使用擴展 \u003c/h2\u003e \n\u003cdiv\u003e\n 動作類更改爲空的擴展。 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;struts\u0026gt;\r\n\t \r\n \u0026lt;constant name=\"struts.action.extension\" value=\"\"/\u0026gt; \r\n\t\r\n \u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\u0026lt;action name=\"SayStruts2\"\u0026gt;\r\n\t\t\u0026lt;result\u0026gt;pages/printStruts2.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003cdiv\u003e\n 現在,可以通過如下的URL來訪問「SayStruts2' 動作類: \n\u003c/div\u003e \n\u003cpre\u003eAction URL : http://localhost:8080/Struts2Example/SayStruts2\u003c/pre\u003e \n\u003cbr\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"bf:T15f8,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n 在Struts2中,會花大部分的時間用在用動作來處理工作。動作類包含業務邏輯,獲取資源包,保存數據,驗證,並選擇應發回給用戶的視圖的結果頁面。這是Struts2的核心,所以必須要了解動作的基本概念。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003ch2\u003e 1. 動作 - Action \u003c/h2\u003e \n\u003cp\u003e Struts\u0026nbsp;2動作不強迫你實現任何接口或擴展類,它只是需要你實現一個 execute()方法返回一個字符串來表示其應該返回的結果頁面。 \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-java\"\u003epackage com.yiibai.user.action; \r\npublic class LoginAction{\r\n //business logic\r\n public String execute() {\r\n return \"success\";\r\n }\r\n}\u003c/pre\u003e \n\u003cp\u003e 在struts.xml中,配置使用Action類動作(action)標記和類屬性。定義結果頁面用結果的標籤和動作名稱返回給用戶,可以用它來訪問動作類的名稱屬性。 \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-java\"\u003e\u0026lt;package name=\"user\" namespace=\"/User\" extends=\"struts-default\"\u0026gt;\r\n \u0026lt;action name=\"validateUser\" class=\"com.yiibai.user.action.LoginAction\"\u0026gt;\r\n \u0026lt;result name=\"success\"\u0026gt;pages/welcome.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\u0026lt;package\u0026gt;\u003c/pre\u003e \n\u003cdiv\u003e\n 現在,可以通過 .action 擴展名後綴訪問動作。 \n\u003c/div\u003e \n\u003cpre\u003ehttp\u003cspan\u003e:\u003c/span\u003e\u003cspan\u003e/\u003c/span\u003e\u003cspan\u003e/\u003c/span\u003elocalhost\u003cspan\u003e:\u003c/span\u003e\u003cspan\u003e8080\u003c/span\u003e\u003cspan\u003e/\u003c/span\u003eStruts2Example\u003cspan\u003e/\u003c/span\u003eUser\u003cspan\u003e/\u003c/span\u003evalidateUser\u003cspan\u003e.\u003c/span\u003eaction\u0026nbsp;\u003c/pre\u003e \n\u003cdiv\u003e\n 默認.action是可配置的,只需要設置「struts.action.extension」的值,以滿足您的需要。 \n\u003c/div\u003e \n\u003ch2\u003e 2.\u0026nbsp;可選動作接口 \u003c/h2\u003e \n\u003cp\u003e Struts\u0026nbsp;2帶有一個可選的動作接口(com.opensymphony.xwork2.Action)。通過實現這個接口,它帶來了一些方便和好處,看下面的源代碼: \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-java\"\u003epackage com.opensymphony.xwork2;\r\npublic interface Action {\r\n public static final String SUCCESS = \"success\";\r\n public static final String NONE = \"none\";\r\n public static final String ERROR = \"error\";\r\n public static final String INPUT = \"input\";\r\n public static final String LOGIN = \"login\";\r\n public String execute() throws Exception;\r\n}\u003c/pre\u003e \n\u003cp\u003e 這個接口是非常簡單的,配有5常用常數值:\u003cstrong\u003e\u0026nbsp;\u003c/strong\u003e\u003cstrong\u003esuccess, error, none, input and logic\u003c/strong\u003e。現在的動作類可以直接使用常量。 \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-java\"\u003epackage com.yiibai.user.action;\r\nimport com.opensymphony.xwork2.Action;\r\npublic class LoginAction{\r\n //business logic\r\n public String execute() {\r\n return SUCCESS;\r\n }\r\n}\u003c/pre\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 不明白爲什麼很多Struts開發人員喜歡實現此動作接口,它更好地擴展了ActionSupport。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003ch2\u003e 3. ActionSupport \u003c/h2\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n Support\u0026nbsp;類,通常的做法是提供接口的默認實現。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e \u0026nbsp;ActionSupport (\u003cstrong\u003ecom.opensymphony.xwork2.ActionSupport\u003c/strong\u003e),\u0026nbsp;\u003cspan\u003e一個非常強大和方便的類,它提供了幾個重要接口的缺省實現:\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cspan\u003e \u003c/span\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-java\"\u003epublic class ActionSupport implements Action, Validateable, \r\n ValidationAware, TextProvider, LocaleProvider, Serializable {\r\n ...\r\n}\u003c/pre\u003e \n\u003cp\u003e ActionSupport\u0026nbsp;類提供一些功能: \u003c/p\u003e \n\u003cp\u003e 1. 驗證\u0026nbsp;–\u0026nbsp;聲明一個validate()方法,並在裏面實現驗證代碼。 \u003c/p\u003e \n\u003cp\u003e 2.\u0026nbsp;文字本地化\u0026nbsp;–\u0026nbsp;使用gettext()方法來獲得資源包的消息。 \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-java\"\u003epackage com.yiibai.user.action;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\npublic class LoginAction extends ActionSupport{\r\n private String username;\r\n private String password;\r\n public String getPassword() {\r\n return password;\r\n }\r\n public void setPassword(String password) {\r\n this.password = password;\r\n }\r\n public String getUsername() {\r\n return username;\r\n }\r\n public void setUsername(String username) {\r\n this.username = username;\r\n }\r\n //business logic\r\n public String execute() {\r\n return \"SUCCESS\";\r\n }\r\n //simple validation\r\n public void validate(){\r\n if(\"\".equals(getUsername())){\r\n addFieldError(\"username\", getText(\"username.required\"));\r\n }\r\n if(\"\".equals(getPassword())){\r\n addFieldError(\"password\", getText(\"password.required\"));\r\n }\r\n }\r\n}\u003c/pre\u003e \n\u003cdiv\u003e\n 在大多數情況下,應該擴展此類妥當,方便提供功能,除非你有理由不這樣做。這也是一個很不錯的學習類,以瞭解如何做一些重要的Struts2接口的實現。 \n\u003c/div\u003e \n\u003ch2\u003e 4. 動作註釋 \u003c/h2\u003e \n\u003cp\u003e Struts\u0026nbsp;2對註解有很好的支持,你可以擺脫XML文件,並使用@action在動作類上替換。 \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-java\"\u003epackage com.yiibai.user.action;\r\nimport org.apache.struts2.convention.annotation.Action;\r\nimport org.apache.struts2.convention.annotation.Namespace;\r\nimport org.apache.struts2.convention.annotation.Result;\r\nimport org.apache.struts2.convention.annotation.ResultPath;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n@Namespace(\"/User\")\r\n@ResultPath(value=\"/\")\r\npublic class ValidateUserAction extends ActionSupport{\r\n @Action(value=\"Welcome\", results={\r\n @Result(name=\"success\",location=\"pages/welcome_user.jsp\")\r\n })\r\n public String execute() {\r\n return SUCCESS;\r\n }\r\n}\u003c/pre\u003e \n\u003ch2\u003e 總結 \u003c/h2\u003e \n\u003cdiv\u003e\n 擴展ActionSupport類,它適合在大多數情況下。 \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"c0:T1ac0,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n 本教程顯示使用Struts2的 ActionError 和 ActionMessage 類。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e 1.\u0026nbsp;ActionError\u0026nbsp;–\u0026nbsp;是用來發送錯誤信息反饋給用戶\u0026nbsp;- 通過\u0026nbsp;\u0026lt;s:actionerror/\u0026gt;\u0026nbsp;來顯示。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:if test=\"hasActionErrors()\"\u0026gt;\r\n \u0026lt;div class=\"errors\"\u0026gt;\r\n \u0026lt;s:actionerror/\u0026gt;\r\n \u0026lt;/div\u0026gt;\r\n\u0026lt;/s:if\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 2.\u0026nbsp;\u003cstrong\u003eActionMessage\u003c/strong\u003e\u0026nbsp;–\u0026nbsp;\u003cspan\u003e用於發送信息的反饋消息給用戶,\u003c/span\u003e\u003cspan\u003e\u003cspan\u003e通過\u0026nbsp;\u003c/span\u003e\u003c/span\u003e\u003cstrong\u003e\u0026lt;s:actionmessage/\u0026gt;\u0026nbsp;\u003c/strong\u003e\u003cspan\u003e來顯示。\u003c/span\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:if test=\"hasActionMessages()\"\u0026gt;\r\n \u0026lt;div class=\"welcome\"\u0026gt;\r\n \u0026lt;s:actionmessage/\u0026gt;\r\n \u0026lt;/div\u0026gt;\r\n\u0026lt;/s:if\u0026gt;\u0026nbsp;\u003c/pre\u003e \n\u003cp\u003e 這裏有一個簡單的登錄表單,如果用戶名不等於「yiibai.com」將顯示錯誤消息(actionerror),否則重定向到另一個頁面,顯示歡迎信息(ActionMessage)。此外,所有的標籤和錯誤消息檢索來自資源包(屬性文件)。 \u003c/p\u003e \n\u003ch2\u003e 1. 文件夾結構 \u003c/h2\u003e \n\u003cp\u003e 在MyEclipse中創建一個web工程,名稱爲:struts2-errormsg,看這個項目結構,如下圖: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2actionerroractionmessage-1.png\" alt=\"Struts2的ActionError&ActionMessage示例\"\u003e \u003c/p\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003ch2\u003e 2.\u0026nbsp;屬性文件 \u003c/h2\u003e \n\u003cdiv\u003e\n 一共有兩個屬性文件用來存儲信息,其中 LoginAction.properties 文件放在\u0026nbsp;com.yiibai.user.action 包下。 \n\u003c/div\u003e \n\u003cp\u003e LoginAction.properties \u003c/p\u003e \n\u003cpre class=\"prettyprint\"\u003e#Welcome messages\r\nwelcome.hello = 你好\r\n#error message\r\nusername.required = 用戶名不可以爲空\r\npassword.required = 密碼不可以爲空\u003c/pre\u003e \n\u003cp\u003e global.properties \u003c/p\u003e \n\u003cpre class=\"prettyprint\"\u003e#Global messages\r\nglobal.username = 用戶名\r\nglobal.password = 密碼\r\nglobal.submit = 提交\r\nglobal.reset = 重置\u003c/pre\u003e \n\u003ch2\u003e 3. 動作-Action \u003c/h2\u003e \n\u003cp\u003e 一個經典的動作類,做一個簡單的檢查,以確認用戶名是否等於「yiibai.com\",並使用\u0026nbsp;addActionError()設置錯誤信息或addActionMessage()設置成功的消息。 \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.user.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class LoginAction extends ActionSupport{\r\n\r\n\tprivate String username;\r\n\tprivate String password;\r\n\t \r\n\tpublic String getPassword() {\r\n\t\treturn password;\r\n\t}\r\n\r\n\tpublic void setPassword(String password) {\r\n\t\tthis.password = password;\r\n\t}\r\n\r\n\tpublic String getUsername() {\r\n\t\treturn username;\r\n\t}\r\n\r\n\tpublic void setUsername(String username) {\r\n\t\tthis.username = username;\r\n\t}\r\n\r\n\t//business logic\r\n\tpublic String execute() {\r\n\r\n\t\treturn \"SUCCESS\";\r\n\r\n\t}\r\n\r\n\t//simple validation\r\n\tpublic void validate(){\r\n\t\tif(\"yiibai.com\".equals(getUsername())){\r\n\t\t\taddActionMessage(\"You are valid user!\");\r\n\t\t}else{\r\n\t\t\taddActionError(\"I don't know you, dont try to hack me!\");\r\n\t\t}\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 4. JSP頁面視圖 \u003c/h2\u003e \n\u003cdiv\u003e\n 兩個簡單的JSP頁面以及CSS樣式自定義錯誤消息。 \n\u003c/div\u003e \n\u003cp\u003e login.jsp \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-html\"\u003e\u0026lt;%@ page contentType=\"text/html; charset=UTF-8\" %\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;title\u0026gt;Struts2 ActionError \u0026amp; ActionMessage 示例\u0026lt;/title\u0026gt;\r\n\u0026lt;style type=\"text/css\"\u0026gt;\r\n.errors {\r\n background-color:#FFCCCC;\r\n border:1px solid #CC0000;\r\n width:400px;\r\n margin-bottom:8px;\r\n}\r\n.errors li{ \r\n list-style: none; \r\n}\r\n\u0026lt;/style\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2 ActionError \u0026amp; ActionMessage 示例\u0026lt;/h1\u0026gt;\r\n\u0026lt;s:if test=\"hasActionErrors()\"\u0026gt;\r\n \u0026lt;div class=\"errors\"\u0026gt;\r\n \u0026lt;s:actionerror/\u0026gt;\r\n \u0026lt;/div\u0026gt;\r\n\u0026lt;/s:if\u0026gt;\r\n\u0026lt;s:form action=\"validateUser\"\u0026gt;\r\n \u0026lt;s:textfield key=\"global.username\" name=\"username\"/\u0026gt;\r\n \u0026lt;s:password key=\"global.password\" name=\"password\"/\u0026gt;\r\n \u0026lt;s:submit key=\"global.submit\" name=\"submit\"/\u0026gt;\r\n\u0026lt;/s:form\u0026gt;\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003ewelcome.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003e \u003c/strong\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-html\"\u003e\u003cstrong\u003e\u0026lt;%@ page contentType=\"text/html; charset=UTF-8\"%\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\"%\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;title\u0026gt;Struts2 ActionError \u0026amp; ActionMessage 示例\u0026lt;/title\u0026gt;\r\n\u0026lt;style type=\"text/css\"\u0026gt;\r\n.welcome {\r\n background-color: #DDFFDD;\r\n border: 1px solid #009900;\r\n width: 200px;\r\n}\r\n.welcome li {\r\n list-style: none;\r\n}\r\n\u0026lt;/style\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n \u0026lt;h1\u0026gt;Struts 2 ActionError \u0026amp; ActionMessage示例\u0026lt;/h1\u0026gt;\r\n \u0026lt;s:if test=\"hasActionMessages()\"\u0026gt;\r\n \u0026lt;div class=\"welcome\"\u0026gt;\r\n \u0026lt;s:actionmessage /\u0026gt;\r\n \u0026lt;/div\u0026gt;\r\n \u0026lt;/s:if\u0026gt;\r\n \u0026lt;h4\u0026gt;\r\n \u0026lt;s:property value=\"getText('welcome.hello')\" /\u0026gt;\r\n \u0026lt;s:property value=\"username\" /\u0026gt;\r\n \u0026lt;/h4\u0026gt;\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/strong\u003e\u003c/pre\u003e \n\u003ch2\u003e 5. struts.xml \u003c/h2\u003e \n\u003cp\u003e 鏈接所有的在一起 \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-xml\"\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n\r\n\u0026lt;struts\u0026gt;\r\n \u0026lt;constant name=\"struts.custom.i18n.resources\" value=\"global\" /\u0026gt;\r\n\r\n \u0026lt;package name=\"user\" namespace=\"/user\" extends=\"struts-default\"\u0026gt;\r\n \u0026lt;action name=\"login\"\u0026gt;\r\n\t \u0026lt;result\u0026gt;/pages/login.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n \u0026lt;action name=\"validateUser\" class=\"com.yiibai.user.action.LoginAction\"\u0026gt;\r\n\t \u0026lt;result name=\"SUCCESS\"\u0026gt;/pages/welcome.jsp\u0026lt;/result\u0026gt;\r\n\t \u0026lt;result name=\"input\"\u0026gt;/pages/login.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 在Struts2,ActionError和ActionMessage功能和用法與Struts1非常相似。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003ch2\u003e 6. 運行並測試 \u003c/h2\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/struts2-errormsg/user/login.action\u003c/em\u003e \u003c/p\u003e \n\u003cp\u003e \u003cem\u003e\u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2actionerroractionmessage-2.png\" alt=\"Struts2的ActionError&ActionMessage示例\"\u003e\u003cbr\u003e \u003c/em\u003e \u003c/p\u003e \n\u003cp\u003e \u003cspan\u003e用戶名是無效的,顯示錯誤信息:\u003c/span\u003e\u0026lt;s:actionerror/\u0026gt; \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2actionerroractionmessage-3.png\" alt=\"Struts2的ActionError&ActionMessage示例\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003cspan\u003e用戶名是有效的,顯示歡迎信息:\u003c/span\u003e\u0026lt;s:actionmessage/\u0026gt; \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2actionerroractionmessage-4.png\" alt=\"Struts2的ActionError&ActionMessage示例\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003cspan\u003e\u003cbr\u003e \u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cspan\u003e源代碼下載 –\u0026nbsp;\u003c/span\u003e\u003ca href=\"http://pan.baidu.com/s/1pJkYCPH\"\u003eStruts2-ActionError-ActionMessage.zip\u003c/a\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"c1:T1066,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n 這裏我們創建一個web工程爲:struts2-modeldrive ,用於講解演示Struts2模型驅動這一章內容的學習。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e 如果一個動作實現了「模型驅動」- ModelDriven\u0026nbsp;接口,它就獲得了表單數據自動傳輸到對象的額外能力。請參見下面的完整的例子: \u003c/p\u003e \n\u003ch2\u003e 1.\u0026nbsp;域對象 \u003c/h2\u003e \n\u003cp\u003e 一個顧客(customer)對象,有 setter 和 getter 方法。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eCustomer.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common;\r\n\r\npublic class Customer{\r\n\t\r\n\tString name;\r\n\tint age;\r\n\t\r\n\tpublic String getName() {\r\n\t\treturn name;\r\n\t}\r\n\tpublic void setName(String name) {\r\n\t\tthis.name = name;\r\n\t}\r\n\tpublic int getAge() {\r\n\t\treturn age;\r\n\t}\r\n\tpublic void setAge(int age) {\r\n\t\tthis.age = age;\r\n\t}\r\n\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. 動作 - Action \u003c/h2\u003e \n\u003cp\u003e Action類,實現了模型驅動ModelDriven\u0026nbsp;接口,聲明getModel()方法返回客戶的對象。當表單數據提交到這個動作,它會自動將表單數據傳輸到客戶的屬性。 \u003c/p\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 客戶對象必須手動初始化。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eCustomerAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.yiibai.common.Customer;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\nimport com.opensymphony.xwork2.ModelDriven;\r\n \r\npublic class CustomerAction extends ActionSupport \r\n\timplements ModelDriven{\r\n\r\n\t//have to initialize it\r\n\tCustomer customer = new Customer();\r\n\t\r\n\tpublic String execute() throws Exception {\r\n\t\r\n\t\treturn SUCCESS;\r\n\t\t\r\n\t}\r\n\r\n\tpublic Object getModel() {\r\n\t\t\r\n\t\treturn customer;\r\n\t\t\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 3. JSP頁面 \u003c/h2\u003e \n\u003cdiv\u003e\n JSP頁面的模型驅動(ModelDriven)的示範。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eaddCustomer.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 ModelDriven example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;Add Customer\u0026lt;/h2\u0026gt;\r\n\u0026lt;s:form action=\"customerAction\" \u0026gt;\r\n \u0026lt;s:textfield name=\"name\" label=\"Name\" /\u0026gt;\r\n \u0026lt;s:textfield name=\"age\" label=\"Age\" value=\"\"/\u0026gt;\r\n \u0026lt;s:submit /\u0026gt;\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003esuccess.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 ModelDriven example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;Customer Details\u0026lt;/h2\u0026gt;\r\nName : \u0026lt;s:property value=\"name\" /\u0026gt;\u0026lt;br\u0026gt;\r\nAge : \u0026lt;s:property value=\"age\" /\u0026gt;\u0026lt;br\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \t\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\r\n\t\t\u0026lt;action name=\"addCustomerAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.CustomerAction\" \u0026gt;\r\n\t\t \u0026lt;result name=\"success\"\u0026gt;pages/addCustomer.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\r\n\t\t\u0026lt;action name=\"customerAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.CustomerAction\" \u0026gt;\r\n\t\t \u0026lt;result name=\"success\"\u0026gt;pages/success.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. 示例 \u003c/h2\u003e \n\u003cp\u003e 訪問客戶表,填寫表格\u0026nbsp;(name : 「yiibai.com」, age 」 「26」)\u0026nbsp;並點擊提交按鈕,表單數據(name\u0026nbsp;\u0026amp;\u0026nbsp;age)\u0026nbsp;將自動轉移到客戶的屬性(name\u0026nbsp;\u0026amp;\u0026nbsp;age)\u0026nbsp;(按屬性名稱匹配)。 \u003c/p\u003e \n\u003cp\u003e http://localhost:8080/struts2-modeldrive/addCustomerAction.action \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-6.png\" alt=\"Struts2模型驅動實例\"\u003e \u003c/p\u003e \n\u003cp\u003e http://localhost:8080/struts2-modeldrive/customerAction.action \u003c/p\u003e \n\u003cdiv\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-7.png\" alt=\"Struts2模型驅動實例\"\u003e \n \u003cbr\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003cbr\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003cspan\u003e\u003cspan\u003e工程源代碼下載 -\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1hqxyjf2\"\u003ehttp://pan.baidu.com/s/1hqxyjf2\u003c/a\u003e\u003c/span\u003e\u003c/span\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"c2:T8e4,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e\n Struts\u0026nbsp;2的開發者用來聲明行爲屬於一個包,擴展\u0026nbsp;「struts-default「,\u0026nbsp;其中包含默認設置的攔截。 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\u0026lt;action name=\"testingAction\" \r\n\t\tclass=\"com.yiibai.common.action.TestingAction\" \u0026gt;\r\n\t\t\u0026lt;result name=\"success\"\u0026gt;pages/result.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\u0026lt;/package\u0026gt;\u0026nbsp;\u003c/pre\u003e \n\u003cp\u003e 攔截器的默認設置進行分組爲「defaultStack」在struts-default.xml文件中,它位於\u0026nbsp;struts2-core.jar\u0026nbsp;文件,「defaultStack」提供所有的核心Struts2功能,這是最適合應用的需要。 \u003c/p\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 試着學習struts-default.xml文件,它總是最好的攔截器的參考。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003ch2\u003e \n \u003cdiv\u003e\n 映射攔截動作 \n \u003c/div\u003e \u003c/h2\u003e \n\u003cdiv\u003e\n 爲了其它的攔截器映射到動作,請使用「interceptor-ref」元素。 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\u0026lt;action name=\"testingAction\" \r\n\t\tclass=\"com.yiibai.common.action.TestingAction\" \u0026gt;\r\n\t\t\u0026lt;interceptor-ref name=\"timer\"/\u0026gt;\r\n\t\t\u0026lt;interceptor-ref name=\"logger\"/\u0026gt;\r\n\t\t\u0026lt;result name=\"success\"\u0026gt;pages/result.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\u0026lt;/package\u0026gt;\u003c/pre\u003e \n\u003cdiv\u003e\n 在上面的代碼片段,將其映射「timer」\u0026nbsp;和\u0026nbsp;「logger」通過「interceptor-ref」元素攔截到「TestingAction」動作類。 \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 攔截器會按它們聲明的順序觸發。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e 由於「TestingAction」它聲明自己的攔截器,它的直接失去攔截器的所有繼承默認設置,你必須明確才能使用它,見下面聲明「defaultStack」的例子。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\u0026lt;action name=\"testingAction\" \r\n\t\tclass=\"com.yiibai.common.action.TestingAction\" \u0026gt;\r\n\t\t\u0026lt;interceptor-ref name=\"timer\"/\u0026gt;\r\n\t\t\u0026lt;interceptor-ref name=\"logger\"/\u0026gt;\r\n\t\t\u0026lt;interceptor-ref name=\"defaultStack\"/\u0026gt;\r\n\t\t\u0026lt;result name=\"success\"\u0026gt;pages/result.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\u0026lt;/package\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/docs/interceptors.htmll\"\u003eStruts 2 攔截器文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"c3:T697,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n 在Struts2中,可以設置或通過普通的\u0026lt;param\u0026gt;標籤重寫攔截器的參數。見下面的例子: \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003cpre\u003e\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n \u0026lt;action name=\"whateverAction\" \r\n\tclass=\"com.yiibai.common.action.WhateverAction\" \u0026gt;\r\n\t\u0026lt;interceptor-ref name=\"workflow\"\u0026gt;\r\n\t\t\u0026lt;param name=\"excludeMethods\"\u0026gt;whateverMethod\u0026lt;/param\u0026gt;\r\n\t\u0026lt;/interceptor-ref\u0026gt;\r\n\t\u0026lt;result name=\"success\"\u0026gt;pages/whatever.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\t\t\r\n\u0026lt;/package\u0026gt;\u0026nbsp;\u003c/pre\u003e \n \u003cp\u003e 然而,在上面的代碼片段,動作類被聲明爲自己的攔截器,\u0026nbsp;它會導致繼承「defaultStack」攔截器的直接丟失。 \u003c/p\u003e \n \u003cp\u003e 如果你想保持「defaultStack」攔截器,並覆蓋工作流的excludeMethods參數呢?沒問題,試試這個: \u003c/p\u003e \n \u003cpre\u003e\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n \u0026lt;action name=\"whateverAction\" \r\n\tclass=\"com.yiibai.common.action.WhateverAction\" \u0026gt;\r\n\t\u0026lt;interceptor-ref name=\"defaultStack\"\u0026gt;\r\n\t\t\u0026lt;param name=\"workflow.excludeMethods\"\u0026gt;whateverMethod\u0026lt;/param\u0026gt;\r\n\t\u0026lt;/interceptor-ref\u0026gt;\r\n\t\u0026lt;result name=\"success\"\u0026gt;pages/whatever.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\t\t\r\n\u0026lt;/package\u0026gt;\u003c/pre\u003e \n \u003cdiv\u003e\n 上面的代碼片段將保持「defaultStack」攔截並覆蓋「workflow」參數。 \n \u003c/div\u003e \n \u003ch2\u003e 參考 \u003c/h2\u003e \n \u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/interceptors.html\"\u003eStruts2攔截器文檔\u003c/a\u003e\u0026nbsp; \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/workflow-interceptor.html\"\u003eStruts2流程攔截器文檔\u003c/a\u003e \u003c/li\u003e \n \u003c/ol\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"c4:Ta61,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e \n \u003cspan\u003e很多時候,相同的一組攔截器可以適用於不同的動作類,例如,\u003c/span\u003e \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003cpre\u003e\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n \u0026lt;action name=\"checkInAction\" \r\n\tclass=\"com.yiibai.common.action.CheckInAction\" \u0026gt;\r\n\t\u0026lt;interceptor-ref name=\"timer\"/\u0026gt;\r\n \u0026lt;interceptor-ref name=\"logger\"/\u0026gt;\r\n\t\u0026lt;interceptor-ref name=\"defaultStack\" /\u0026gt;\r\n\t\u0026lt;result name=\"success\"\u0026gt;/pages/checkIn.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\r\n \u0026lt;action name=\"checkOutAction\" \r\n\tclass=\"com.yiibai.common.action.CheckOutAction\" \u0026gt;\r\n\t\u0026lt;interceptor-ref name=\"timer\"/\u0026gt;\r\n \u0026lt;interceptor-ref name=\"logger\"/\u0026gt;\r\n\t\u0026lt;interceptor-ref name=\"defaultStack\" /\u0026gt;\r\n\t\u0026lt;result name=\"success\"\u0026gt;/pages/checkOut.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\t\r\n\u0026lt;/package\u0026gt;\u003c/pre\u003e \n \u003cdiv\u003e\n 在上述情況下,它有許多重複工作以及不能重複使用。 \n \u003c/div\u003e \n \u003cp\u003e 幸運的是,在Struts\u0026nbsp;2自帶的攔截器棧,使開發人員建立一組攔截到一個單元名爲「棧名字」,\u0026nbsp;和可以通過「棧名字」引用操作它。 \u003c/p\u003e \n \u003cdiv\u003e \n \u003cdiv\u003e\n 最佳做法 \n \u003c/div\u003e 建議組合相同的一組攔截器到一個攔截器棧擺脫重複的工作,並增加了項目的可重用性。 \n \u003c/div\u003e \n \u003cpre\u003e\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n \u0026lt;interceptors\u0026gt;\r\n \t\u0026lt;interceptor-stack name=\"defaultStackWithLog\"\u0026gt;\r\n \u0026lt;interceptor-ref name=\"timer\"/\u0026gt;\r\n \u0026lt;interceptor-ref name=\"logger\"/\u0026gt;\r\n\t \u0026lt;interceptor-ref name=\"defaultStack\" /\u0026gt;\r\n \u0026lt;/interceptor-stack\u0026gt;\r\n \u0026lt;/interceptors\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"checkInAction\" \r\n\tclass=\"com.yiibai.common.action.CheckInAction\" \u0026gt;\r\n\t\u0026lt;interceptor-ref name=\"defaultStackWithLog\"/\u0026gt;\r\n\t\u0026lt;result name=\"success\"\u0026gt;/pages/checkIn.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\r\n \u0026lt;action name=\"checkOutAction\" \r\n\tclass=\"com.yiibai.common.action.CheckOutAction\" \u0026gt;\r\n\t\u0026lt;interceptor-ref name=\"defaultStackWithLog\"/\u0026gt;\r\n\t\u0026lt;result name=\"success\"\u0026gt;/pages/checkOut.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\t\r\n\u0026lt;/package\u0026gt;\u0026nbsp;\u003c/pre\u003e \n \u003cp\u003e 在上面的例子更新,聲明一個攔截器棧,命名爲「defaultStackWithLog」其中包括「timer「,\u0026nbsp;「logger」\u0026nbsp;和\u0026nbsp;「defaultStack」\u0026nbsp;攔截器,並且它通過「interceptor-ref」元素引用一個正常的攔截器。 \u003c/p\u003e \n \u003ch2\u003e 參考 \u003c/h2\u003e \n \u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/interceptors.html\"\u003eStruts2攔截器文檔\u003c/a\u003e \u003c/li\u003e \n \u003c/ol\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"c5:T1311,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n 在Struts2中附帶一個名爲「execAndWait」一個非常有趣的「執行和等待」攔截器,這是一個非常方便的攔截器長時間運行操作在後臺,顯示用戶的自定義的等待頁面。在本教程中,它顯示了一個完整的使用 Struts2\u0026nbsp;execAndWait 攔截器的例子。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003ch2\u003e 1. 動作 \u003c/h2\u003e \n\u003cdiv\u003e\n 一個普通的動作類,有一個長時間運行進程,證明了execAndWait效果。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eLongProcessAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class LongProcessAction extends ActionSupport{\r\n\r\n\tpublic String execute() throws Exception {\r\n\t\r\n\t\t//it should be delay few seconds, \r\n\t\t//unless you have a super powerful computer.\r\n\t\tfor(int i =0; i\u0026lt;1000000; i++){\r\n\t\t\tSystem.out.println(i);\r\n\t\t}\r\n\t\treturn SUCCESS;\r\n\t\t\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. JSP頁面 \u003c/h2\u003e \n\u003cdiv\u003e\n 創建兩個頁面: \n\u003c/div\u003e \n\u003col\u003e \n \u003cli\u003e wait.jsp\u0026nbsp;-\u0026nbsp;顯示給用戶,長時間運行的進程。 \u003c/li\u003e \n \u003cli\u003e success.jsp\u0026nbsp;-\u0026nbsp;顯示給用戶的過程完成之後。 \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv\u003e\n HTML meta refresh \n \u003cbr\u003e 記得把元刷新的等待頁面頂部;\u0026nbsp;否則,該網頁將不重定向到成功頁面,即使該過程完成。 \n\u003c/div\u003e \n\u003cp\u003e 在這個wait.jsp,元刷新設置在每5秒網頁重新加載,如果該過程完成後,將重定向到\u0026nbsp;success.jsp,\u0026nbsp;否則留在同一個頁面。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003ewait.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-html\"\u003e\u0026lt;%@ page contentType=\"text/html; charset=UTF-8\"%\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;title\u0026gt;Struts 2 execAndWait 示例\u0026lt;/title\u0026gt;\r\n\u0026lt;meta http-equiv=\"refresh\" content=\"5;url=\u0026lt;s:url includeParams=\"all\" /\u0026gt;\"/\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 execAndWait 示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h3\u0026gt;Please wait while we process your request...\u0026lt;/h3\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003esuccess.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-html\"\u003e\u0026lt;%@ page contentType=\"text/html; charset=UTF-8\"%\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;title\u0026gt;Struts 2 execAndWait 示例\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 execAndWait 示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h3\u0026gt;Done\u0026lt;/h3\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3.\u0026nbsp;執行和等待攔截器 \u003c/h2\u003e \n\u003cdiv\u003e\n 鏈接動作類並聲明「execAndWait」攔截器。 \n\u003c/div\u003e \n\u003cdiv\u003e\n execAndWait 參數 \n \u003col\u003e \n \u003cli\u003e delay (optional)\u0026nbsp;:\u0026nbsp;以毫秒爲單位初始延遲顯示在wait.jsp。默認是沒有延遲的。 \u003c/li\u003e \n \u003cli\u003e delaySleepInterval (optional)\u0026nbsp;:\u0026nbsp;時間間隔是以毫秒爲單位來檢查後臺進程\u003cspan\u003e是否\u003c/span\u003e已經完成,默認值是100毫秒。 \u003c/li\u003e \n \u003c/ol\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003estruts.xml\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\u0026lt;action name=\"longProcessAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.LongProcessAction\" \u0026gt;\r\n\t\t\t\r\n\t\t\t\u0026lt;interceptor-ref name=\"execAndWait\"\u0026gt;\r\n\t\t \u0026lt;param name=\"delay\"\u0026gt;1000\u0026lt;/param\u0026gt;\r\n\t\t \u0026lt;param name=\"delaySleepInterval\"\u0026gt;500\u0026lt;/param\u0026gt;\r\n\t\t \u0026lt;/interceptor-ref\u0026gt;\r\n\t\t \r\n\t\t \u0026lt;result name=\"wait\"\u0026gt;/pages/wait.jsp\u0026lt;/result\u0026gt;\r\n\t\t \u0026lt;result name=\"success\"\u0026gt;/pages/success.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\r\n\t\u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u0026nbsp;\u003c/pre\u003e \n\u003cp\u003e 在這種情況下,將延遲1秒顯示至wait.jsp,並檢查後臺進程是否在每500毫秒完成。即使這個過程完成後,它仍然需要等待 wait.jsp 元刷新來觸發頁面重載。 \u003c/p\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e 訪問網址:\u0026nbsp;http://localhost:8080/struts2execandwait/longProcessAction.action \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-execandwait-1.png\" alt=\"Struts2 execAndWait攔截器例子\"\u003e \u003c/p\u003e \n\u003cdiv\u003e\n 延時1秒,顯示在 wait.jsp 。 \n\u003c/div\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003cp\u003e 當該過程完成時,自動顯示在 success.jsp。 \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-execandwait-2.png\" alt=\"Struts2 execAndWait攔截器例子\"\u003e\u003cspan\u003e\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003c/p\u003e 代碼下載: \n\u003ca href=\"http://pan.baidu.com/s/1o62BHGY\"\u003ehttp://pan.baidu.com/s/1o62BHGY\u003c/a\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/execute-and-wait-interceptor.html\"\u003eStruts2 execAndWait攔截器文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://en.wikipedia.org/wiki/Meta_refresh\"\u003eHTML Meta Refresh\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"c6:T11da,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 爲了比較直觀的學習,這裏創建一個web工程爲:struts2textfield。整個工程的目錄結構如下: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/textfield-1.png\" alt=\"Struts2 \u003cs:textfield\u003e文本示例\"\u003e \u003c/p\u003e \n\u003cp\u003e 在Struts2中,\u0026lt;s:textfield\u0026gt;文本範例,\u0026nbsp;例如,可以聲明「s:textfield」鍵屬性或標籤和名稱屬性。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:textfield key=\"username\" /\u0026gt;\r\n// 或\r\n\u0026lt;s:textfield label=\"Username\" name=\"username\" /\u0026gt;\u003c/pre\u003e \n\u003cdiv\u003e\n 兩者都產生相同的HTML輸出(默認的XHTML主題)。類似如下的結果: \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;td class=\"tdLabel\"\u0026gt;\r\n \u0026lt;label for=\"registerUser_username\" class=\"label\"\u0026gt;Username:\u0026lt;/label\u0026gt;\r\n\u0026lt;/td\u0026gt;\r\n\u0026lt;td\u0026gt;\r\n \u0026lt;input type=\"text\" name=\"username\" value=\"\" id=\"registerUser_username\"/\u0026gt;\r\n\u0026lt;/td\u0026gt;\u0026nbsp;\u003c/pre\u003e \n\u003cdiv\u003e\n 在Struts2中,「name」將自動映射到JavaBean屬性。\u0026nbsp;在這種情況下,表格提交時,文本框的值使用「name=’username'」將調用對應動作的setUsername(String\u0026nbsp;xx)來設置值。 \n\u003c/div\u003e \n\u003ch2\u003e Struts2 \u0026lt;s:textfield\u0026gt; 示例 \u003c/h2\u003e \n\u003cdiv\u003e\n 在Struts2中創建一個文本框輸入字段示例教程。 \n\u003c/div\u003e \n\u003ch2\u003e 1. 屬性文件 \u003c/h2\u003e \n\u003cdiv\u003e\n 兩個屬性文件用來存儲信息。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eglobal.properties\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e#Global messages\r\nusername = 用戶名\r\nsubmit = 提交\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eRegisterAction.properties\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e#error message\r\nusername.required = 用戶名不可以爲空\u003c/pre\u003e \n\u003ch2\u003e 2. Action \u003c/h2\u003e \n\u003cdiv\u003e\n 使用一個簡單的動作類驗證以確保用戶名不爲空,否則返回錯誤信息。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eRegisterAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.user.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class RegisterAction extends ActionSupport{\r\n\r\n\tprivate String username;\r\n\r\n\tpublic String getUsername() {\r\n\t\treturn username;\r\n\t}\r\n\r\n\tpublic void setUsername(String username) {\r\n\t\tthis.username = username;\r\n\t}\r\n\r\n\t//business logic\r\n\tpublic String execute() {\r\n\r\n\t\treturn \"SUCCESS\";\r\n\r\n\t}\r\n\r\n\t//simple validation\r\n\tpublic void validate(){\r\n\t\tif(\"\".equals(getUsername())){\r\n\t\t\taddFieldError(\"username\", getText(\"username.required\"));\r\n\t\t}\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 3. 視圖文件 \u003c/h2\u003e \n\u003cdiv\u003e\n 結果頁面使用Struts2\u0026nbsp;「s:textfield」來創建一個HTML文本框輸入字段。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eregister.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 - textbox 示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:form action=\"registerUser\" namespace=\"/user\"\u0026gt;\r\n\r\n\t\u0026lt;s:textfield key=\"username\" /\u0026gt;\r\n\t\u0026lt;s:submit key=\"submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003ewelcome.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ page contentType=\"text/html;charset=UTF-8\" %\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 - textbox 示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\u0026lt;s:property value=\"username\"/\u0026gt;\u0026lt;/h2\u0026gt;\r\nor\r\n\u0026lt;h2\u0026gt;\u0026lt;s:property value=\"%{username}\"/\u0026gt;\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \u0026lt;constant name=\"struts.custom.i18n.resources\" value=\"global\" /\u0026gt;\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \t\r\n \u0026lt;package name=\"user\" namespace=\"/user\" extends=\"struts-default\"\u0026gt;\r\n\t\u0026lt;action name=\"register\"\u0026gt;\r\n\t\t\u0026lt;result\u0026gt;/pages/register.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\t\u0026lt;action name=\"registerUser\" \r\n class=\"com.yiibai.user.action.RegisterAction\"\u0026gt;\r\n\t\t\u0026lt;result name=\"SUCCESS\"\u0026gt;/pages/welcome.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;result name=\"input\"\u0026gt;/pages/register.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. 示例顯示 \u003c/h2\u003e \n\u003cp\u003e http://localhost:8080/struts2textfield/user/register.action \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/textfield-2.png\" alt=\"Struts2 \u003cs:textfield\u003e文本示例\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/textfield-3.png\" alt=\"Struts2 \u003cs:textfield\u003e文本示例\"\u003e \u003c/p\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.x/docs/textfield.html\"\u003eStruts2文本文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv\u003e \n \u003cbr\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"c7:T144a,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cp\u003e \u003cspan\u003e在這一章節中,我們創建一個Web工程爲:\u003c/span\u003e\u003cspan\u003estruts2passwd,演示\u003c/span\u003e\u003cspan\u003e\u0026lt;s:password\u0026gt;的使用。完整的工程目錄結構如下:\u003c/span\u003e \u003c/p\u003e \n \u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/password-1.png\" alt=\"Struts2 \u003cs:password\u003e密碼示例\"\u003e \u003c/p\u003e \n\u003c/div\u003e \n\u003cp\u003e 在Struts2中,可以使用\u0026lt;s:password\u0026gt;來創建HTML密碼字段。例如,可以聲明「s:password」鍵屬性或者標籤和名稱屬性。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:password key=\"password\" /\u0026gt;\r\n//or\r\n\u0026lt;s:textfield label=\"Password\" name=\"password\" /\u0026gt;\u003c/pre\u003e \n\u003cdiv\u003e\n 兩者都產生相同的HTML輸出(在默認的XHTML主題)。 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;td class=\"tdLabel\"\u0026gt;\r\n \u0026lt;label for=\"registerUser_password\" class=\"label\"\u0026gt;Password:\u0026lt;/label\u0026gt;\r\n\u0026lt;/td\u0026gt; \r\n\u0026lt;td\u0026gt;\r\n \u0026lt;input type=\"password\" name=\"password\" id=\"registerUser_password\"/\u0026gt;\r\n\u0026lt;/td\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e Struts2 \u0026lt;s:password\u0026gt; 示例 \u003c/h2\u003e \n\u003cdiv\u003e\n 一個頁面,「密碼」和「確認密碼」字段,並做了驗證,以確保「確認密碼」是與「密碼」相匹配。 \n\u003c/div\u003e \n\u003ch2\u003e 1.\u0026nbsp;屬性文件 \u003c/h2\u003e \n\u003cp\u003e \u003cstrong\u003eglobal.properties\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e#Global messages\r\nusername = 用名名\r\npassword = 密碼\r\nconfirmPassword = 確認密碼\r\nsubmit = 提交\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eRegisterAction.properties\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e#error message\r\nusername.required = Username is required\r\npassword.required = Password is required\r\ncpassword.required = Confirm password is required\r\ncpassword.notmatch = Confirm password is not match\u003c/pre\u003e \n\u003ch2\u003e 2. 動作 - Action \u003c/h2\u003e \n\u003cp\u003e \u003cstrong\u003eRegisterAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.user.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class RegisterAction extends ActionSupport{\r\n\r\n\tprivate String username;\r\n\tprivate String password;\r\n\tprivate String confirmPassword;\r\n\t\r\n\tpublic String getPassword() {\r\n\t\treturn password;\r\n\t}\r\n\r\n\tpublic void setPassword(String password) {\r\n\t\tthis.password = password;\r\n\t}\r\n\r\n\tpublic String getConfirmPassword() {\r\n\t\treturn confirmPassword;\r\n\t}\r\n\r\n\tpublic void setConfirmPassword(String confirmPassword) {\r\n\t\tthis.confirmPassword = confirmPassword;\r\n\t}\r\n\r\n\tpublic String getUsername() {\r\n\t\treturn username;\r\n\t}\r\n\r\n\tpublic void setUsername(String username) {\r\n\t\tthis.username = username;\r\n\t}\r\n\r\n\t//business logic\r\n\tpublic String execute() {\r\n\r\n\t\treturn \"SUCCESS\";\r\n\r\n\t}\r\n\r\n\t//simple validation\r\n\tpublic void validate(){\r\n\t\tif(\"\".equals(getUsername())){\r\n\t\t\taddFieldError(\"username\", getText(\"username.required\"));\r\n\t\t}\r\n\t\tif(\"\".equals(getPassword())){\r\n\t\t\taddFieldError(\"password\", getText(\"password.required\"));\r\n\t\t}\r\n\t\tif(\"\".equals(getConfirmPassword())){\r\n\t\t\taddFieldError(\"confirmPassword\", getText(\"cpassword.required\"));\r\n\t\t}\r\n\t\t\r\n\t\tif(!(getPassword().equals(getConfirmPassword()))){\r\n\t\t\taddFieldError(\"confirmPassword\", getText(\"cpassword.notmatch\"));\r\n\t\t}\r\n\t}\r\n\r\n}\u003c/pre\u003e \n\u003ch2\u003e 3. 視圖頁面 \u003c/h2\u003e \n\u003cdiv\u003e\n 結果頁面使用 Struts2\u0026nbsp;的「s:password」標籤來創建一個HTML密碼字段。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eregister.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 - password 示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:form action=\"registerUser\" namespace=\"/user\"\u0026gt;\r\n\r\n\t\u0026lt;s:textfield key=\"username\" /\u0026gt;\r\n\t\u0026lt;s:password key=\"password\" /\u0026gt;\r\n\t\u0026lt;s:password key=\"confirmPassword\" /\u0026gt;\r\n\t\r\n\t\u0026lt;s:submit key=\"submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003ewelcome.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ page contentType=\"text/html;charset=UTF-8\" %\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 - password 示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;Password : \u0026lt;s:property value=\"password\"/\u0026gt;\u0026lt;/h2\u0026gt;\r\n\u0026lt;h2\u0026gt;Confirm Password : \u0026lt;s:property value=\"%{confirmPassword}\"/\u0026gt;\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \u0026lt;constant name=\"struts.custom.i18n.resources\" value=\"global\" /\u0026gt;\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \t\r\n \u0026lt;package name=\"user\" namespace=\"/user\" extends=\"struts-default\"\u0026gt;\r\n\t\u0026lt;action name=\"register\"\u0026gt;\r\n\t\t\u0026lt;result\u0026gt;/pages/register.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\t\u0026lt;action name=\"registerUser\" \r\n class=\"com.yiibai.user.action.RegisterAction\"\u0026gt;\r\n\t\t\u0026lt;result name=\"SUCCESS\"\u0026gt;/pages/welcome.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;result name=\"input\"\u0026gt;/pages/register.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. 運行示例 \u003c/h2\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/struts2passwd/user/register.action\u003c/em\u003e \u003c/p\u003e \n\u003cp\u003e \u003cem\u003e\u003cimg src=\"https://asset.1ju.org/cmsstatic/password-2.png\" alt=\"Struts2 \u003cs:password\u003e密碼示例\"\u003e\u003cbr\u003e \u003c/em\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.x/docs/password.html\"\u003eStruts2密碼文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"c8:Tca1,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n 在這一章節中,我們創建一個Web工程爲:struts2hidden,演示\u0026lt;s:hidden\u0026gt;的使用。完整的工程目錄結構如下: \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/hidden-1.png\" alt=\"Struts2 \u003cs:hidden\u003e隱藏值例子\"\u003e \n \u003cbr\u003e \n\u003c/div\u003e \n\u003cdiv\u003e\n 在Struts2中可以使用\u0026lt;s:hidden\u0026gt;標籤來創建一個HTML隱藏字段。 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;s:hidden name=\"url\" value=\"http://www.yiibai.com\" /\u0026gt;\u003c/pre\u003e \n\u003cdiv\u003e\n 它會呈現爲下面的HTML代碼。 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;input type=\"hidden\" name=\"url\" value=\"http://www.yiibai.com\" /\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e Struts2 \u0026lt;s:hidden\u0026gt; 示例 \u003c/h2\u003e \n\u003cdiv\u003e\n 一個頁面的URL隱藏值,並顯示隱藏值表示在提交後。 \n\u003c/div\u003e \n\u003ch2\u003e 1. Action \u003c/h2\u003e \n\u003cp\u003e \u003cstrong\u003eHiddenAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class HiddenAction extends ActionSupport{\r\n\r\n\tprivate String url;\r\n\r\n\tpublic String getUrl() {\r\n\t\treturn url;\r\n\t}\r\n\r\n\tpublic void setUrl(String url) {\r\n\t\tthis.url = url;\r\n\t}\r\n\r\n\tpublic String execute() {\r\n\t\treturn SUCCESS;\r\n\t}\r\n\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. 視圖頁面 \u003c/h2\u003e \n\u003cdiv\u003e\n Struts2\u0026nbsp;「s:hidden」標籤來創建一個隱藏值字段。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003ehidden.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 - 隱藏值字段\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:form action=\"helloHidden\" namespace=\"/\"\u0026gt;\r\n\r\n\t\u0026lt;h2\u0026gt;This page has a hidden value (view source): \r\n\t\u0026lt;s:hidden name=\"url\" value=\"http://www.yiibai.com\" /\u0026gt;\u0026lt;/h2\u0026gt; \r\n\r\n\t\u0026lt;s:submit value=\"submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003ewelcome.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ page contentType=\"text/html;charset=UTF-8\" %\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 - 隱藏值字段\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n The hidden value :\r\n \u0026lt;s:property value=\"url\"/\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \t\r\n \u0026lt;package name=\"\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\u0026lt;action name=\"hidden\"\u0026gt;\r\n\t\t\u0026lt;result\u0026gt;/pages/hidden.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\t\u0026lt;action name=\"helloHidden\" class=\"com.yiibai.common.action.HiddenAction\"\u0026gt;\r\n\t\t\u0026lt;result name=\"success\"\u0026gt;/pages/welcome.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e http://localhost:8080/struts2hidden/hidden.action \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/hidden-2.png\" alt=\"Struts2 \u003cs:hidden\u003e隱藏值例子\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/hidden-3.png\" alt=\"Struts2 \u003cs:hidden\u003e隱藏值例子\"\u003e \u003c/p\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.x/docs/hidden.html\"\u003eStruts2隱藏字段\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"c9:Tc29,"])</script><script>self.__next_f.push([1,"\u003cp\u003e \u003cspan\u003e在Struts2,你可以使用\u0026lt;s:textarea\u0026gt;創建HTML textarea文本域。\u003c/span\u003e\u003cspan\u003e爲了比較直觀的學習,這裏創建一個web工程爲:struts2textarea。整個工程的目錄結構如下:\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cspan\u003e\u003cimg src=\"https://asset.1ju.org/cmsstatic/textarea-1.png\" alt=\"Struts2 \u003cs:textarea\u003e文本域實例\"\u003e\u003cbr\u003e \u003c/span\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:textarea label=\"Address\" name=\"address\" cols=\"40\" rows=\"10\"/\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 它會呈現爲如下面的HTML代碼。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;textarea name=\"address\" cols=\"40\" rows=\"10\" id=\"formaction_address\"\u0026gt;\u0026lt;/textarea\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e Struts 2 \u0026lt;s:textarea\u0026gt; 示例 \u003c/h2\u003e \n\u003cp\u003e 頁面包含一個地址textarea字段域,並顯示 textarea的值在表單提交後。 \u003c/p\u003e \n\u003ch2\u003e 1. Action \u003c/h2\u003e \n\u003cp\u003e \u003cstrong\u003eTextAreaAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class TextAreaAction extends ActionSupport{\r\n\r\n\tprivate String address;\r\n\r\n\tpublic String getAddress() {\r\n\t\treturn address;\r\n\t}\r\n\r\n\tpublic void setAddress(String address) {\r\n\t\tthis.address = address;\r\n\t}\r\n\r\n\tpublic String execute() {\r\n\t\treturn SUCCESS;\r\n\t}\r\n\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. 視圖頁面 \u003c/h2\u003e \n\u003cp\u003e Struts2的「s:textarea」標籤來創建一個textarea文本域字段。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003etextarea.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2 文本域實例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:form action=\"helloTextarea\" namespace=\"/\"\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n \u0026lt;s:textarea label=\"Address\" name=\"address\" cols=\"40\" rows=\"10\"/\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;s:submit value=\"submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003ewelcome.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2文本域實例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n \u0026lt;s:property value=\"address\"/\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \t\r\n \u0026lt;package name=\"\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\u0026lt;action name=\"textarea\"\u0026gt;\r\n\t \u0026lt;result\u0026gt;/pages/textarea.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\t\u0026lt;action name=\"helloTextarea\" \r\n class=\"com.yiibai.common.action.TextAreaAction\"\u0026gt;\r\n\t \u0026lt;result name=\"success\"\u0026gt;/pages/welcome.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 運行結果 \u003c/h2\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/struts2textarea/textarea.action\u003c/em\u003e \u003c/p\u003e \n\u003cp\u003e \u003cem\u003e\u003cimg src=\"https://asset.1ju.org/cmsstatic/textarea-2.png\" alt=\"Struts2 \u003cs:textarea\u003e文本域實例\"\u003e\u003cbr\u003e \u003c/em\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.x/docs/textarea.html\"\u003eStruts 2 textarea文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"ca:T165f,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 在Struts2,可以使用\u0026lt;s:radio\u0026gt;標籤來創建一個HTML單選按鈕。有很多方法來填充數據到單選按鈕,可以通過List, OGNL 或 Object。請查看下面的例子就知道了。 \u003c/p\u003e \n\u003ch2\u003e Struts2 \u0026lt;s:radio\u0026gt; 示例 \u003c/h2\u003e \n\u003cp\u003e 舉個例子來說明如何使用列表,OGNL和對象數據填充到Struts2中,使用\u0026lt;s:radio\u0026gt;標籤創建一個單選按鈕。 \u003c/p\u003e \n\u003ch2\u003e 1. 動作 - Action \u003c/h2\u003e \n\u003cp\u003e Action類來創建性別和語言值單選按鈕列表。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eRadioButtonAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\n\r\nimport com.yiibai.common.model.Language;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class RadioButtonAction extends ActionSupport{\r\n\r\n\tprivate List\u0026lt;String\u0026gt; genders;\r\n\tprivate List\u0026lt;Language\u0026gt; languages ;\r\n\t\r\n\tprivate String yourGender;\r\n\tprivate String yourAnswer;\r\n\tprivate String yourLanguage;\r\n\t\r\n\tprivate static final String MALE = \"male\";\r\n\tprivate static final String FEMALE = \"female\";\r\n\tprivate static final String UNKNOWN = \"unknown\";\r\n\t\r\n\tpublic RadioButtonAction(){\r\n\t\t\r\n\t\tgenders = new ArrayList\u0026lt;String\u0026gt;();\r\n\t\tgenders.add(MALE);\r\n\t\tgenders.add(FEMALE);\r\n\t\tgenders.add(UNKNOWN);\r\n\t\t\r\n\t\tlanguages = new ArrayList\u0026lt;Language\u0026gt;();\r\n\t\tlanguages.add( new Language(\"EN\", \"English\") );\r\n\t\tlanguages.add( new Language(\"FR\", \"France\") );\r\n\t\tlanguages.add( new Language(\"CN_ZH\", \"Chinese\") );\r\n\t\tlanguages.add( new Language(\"DE\", \"German\") );\r\n\t\t\r\n\t}\r\n\t\r\n\t//return default gender value\r\n\tpublic String getDefaultGenderValue(){\r\n\t\treturn UNKNOWN;\r\n\t}\r\n\r\n\t//return default language value\r\n\tpublic String getDefaultLanguageValue(){\r\n\t\treturn \"CN_ZH\";\r\n\t}\r\n\t\r\n\tpublic String execute() {\r\n\t\treturn SUCCESS;\r\n\t}\r\n\tpublic String display() {\r\n\t\treturn NONE;\r\n\t}\r\n\t\r\n\t//getter ad setter methods\r\n}\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eLanguage.java\u003c/strong\u003e \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003e \u003c/strong\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-java\"\u003e\u003cstrong\u003epackage com.yiibai.common.model;\r\n\r\npublic class Language{\r\n\r\n\tprivate String languageCode;\r\n\tprivate String languageDisplay;\r\n\t\r\n\tpublic String getLanguageCode() {\r\n\t\treturn languageCode;\r\n\t}\r\n\tpublic void setLanguageCode(String languageCode) {\r\n\t\tthis.languageCode = languageCode;\r\n\t}\r\n\tpublic String getLanguageDisplay() {\r\n\t\treturn languageDisplay;\r\n\t}\r\n\tpublic void setLanguageDisplay(String languageDisplay) {\r\n\t\tthis.languageDisplay = languageDisplay;\r\n\t}\r\n\t\r\n\tpublic Language(String languageCode, String languageDisplay) {\r\n\t\tthis.languageCode = languageCode;\r\n\t\tthis.languageDisplay = languageDisplay;\r\n\t}\r\n}\u003c/strong\u003e\u003c/pre\u003e \n\u003ch2\u003e 2. 結果頁面 \u003c/h2\u003e \n\u003cp\u003e 結果頁面是使用Struts2 「s:radio」 通過List, OGNL 和 object來創建的三個單選按鈕。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eradiobutton.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 radio button example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:form action=\"resultAction\" namespace=\"/\"\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n \u0026lt;s:radio label=\"Gender\" name=\"yourGender\" list=\"genders\" value=\"defaultGenderValue\" /\u0026gt;\r\n \u0026lt;s:radio label=\"Gender\" name=\"yourLanguage\" list=\"languages\" \r\n listKey=\"languageCode\" listValue=\"languageDisplay\" value=\"defaultLanguageValue\" /\u0026gt;\r\n \u0026lt;s:radio label=\"Answer\" name=\"yourAnswer\" list=\"#{'1':'Yes','2':'No'}\" value=\"2\" /\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;s:submit value=\"submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;a\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eresult.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 radio button example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n Your Selected Gender : \u0026lt;s:property value=\"yourGender\"/\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\u0026lt;h2\u0026gt;\r\n Your Selected Language : \u0026lt;s:property value=\"yourLanguage\"/\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\u0026lt;h2\u0026gt;\r\n Your Selected Answer : \u0026lt;s:property value=\"yourAnswer\"/\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \t\r\n \u0026lt;package name=\"com.yiibai.common.action\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"radioButtonAction\" \r\n class=\"com.yiibai.common.action.RadioButtonAction\" method=\"display\"\u0026gt;\r\n\t\t\u0026lt;result name=\"none\"\u0026gt;/pages/radiobutton.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"resultAction\" class=\"com.yiibai.common.action.RadioButtonAction\"\u0026gt;\r\n\t\t\u0026lt;result name=\"success\"\u0026gt;/pages/result.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. 示例 \u003c/h2\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/struts2radio/radioButtonAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/radio-1.png\" alt=\"Struts2 \u003cs:radio\u003e單選按鈕例子\"\u003e \n \u003cbr\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/struts2radio/resultAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/radio-2.png\" alt=\"Struts2 \u003cs:radio\u003e單選按鈕例子\"\u003e \n \u003cbr\u003e \n\u003c/div\u003e \n\u003cdiv class=\"note\"\u003e\n 要了解如何預選值,讀這篇文章 –\u0026nbsp;在Struts2的單選按鈕預選值 \n\u003c/div\u003e \n\u003ch2\u003e 參數 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.11.2/docs/radio.html\"\u003ehttp://struts.apache.org/2.0.11.2/docs/radio.html\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8.1/docs/struts-2-form-tags.html\"\u003ehttp://struts.apache.org/2.1.8.1/docs/struts-2-form-tags.html\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"cb:T1205,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 下面是幾個Struts2的例子來說明如何通過List, OGNL 和對象生成一個單選按鈕默認值(預先選擇)。 \u003c/p\u003e \n\u003ch2\u003e 1. 列表 - List \u003c/h2\u003e \n\u003cp\u003e 在Java代碼中創建一個列表返回單選按鈕的值。 \u003c/p\u003e \n\u003cpre\u003e//...\r\n\tList\u0026lt;String\u0026gt; genders = new ArrayList\u0026lt;String\u0026gt;();\r\n\t\tgenders.add(\"male\");\r\n\t\tgenders.add(\"female\");\r\n\t\tgenders.add(\"unknown\");\r\n\t//...\r\n\tpublic List\u0026lt;String\u0026gt; getGenders() {\r\n\t\treturn genders;\r\n\t}\r\n\tpublic String getDefaultGenderValue(){\r\n\t\treturn \"unknown\";\r\n\t}\r\n\t//...\u003c/pre\u003e \n\u003cp\u003e 在結果頁面中,\u0026lt;s:radio\u0026gt;標籤, list=」genders」將調用 getGenders()方法返回列表單選按鈕的鍵和值。以及\u0026nbsp;value=」defaultGenderValue」\u0026nbsp;會調用\u0026nbsp;getDefaultGenderValue()\u0026nbsp;方法來\u0026nbsp;預先選擇「unknown」值作爲單選按鈕的默認值。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:radio label=\"Gender\" name=\"yourGender\" list=\"genders\" value=\"defaultGenderValue\" /\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 它會生成以下HTML代碼... \u003c/p\u003e \n\u003cpre\u003e\u0026lt;input type=\"radio\" name=\"yourGender\" id=\"resultAction_yourGendermale\" value=\"male\"/\u0026gt;\r\n\u0026lt;label for=\"resultAction_yourGendermale\"\u0026gt;male\u0026lt;/label\u0026gt; \r\n\r\n\u0026lt;input type=\"radio\" name=\"yourGender\" id=\"resultAction_yourGenderfemale\" value=\"female\"/\u0026gt;\r\n\u0026lt;label for=\"resultAction_yourGenderfemale\"\u0026gt;female\u0026lt;/label\u0026gt; \r\n\r\n\u0026lt;input type=\"radio\" name=\"yourGender\" id=\"resultAction_yourGenderunknown\" \r\n checked=\"checked\" value=\"unknown\"/\u0026gt;\r\n\u0026lt;label for=\"resultAction_yourGenderunknown\"\u0026gt;unknown\u0026lt;/label\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 2. OGNL \u003c/h2\u003e \n\u003cp\u003e 在結果頁面中,通過創建OGNL表達式單選按鈕,並預先選擇「2」爲默認值。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:radio label=\"Answer\" name=\"yourAnswer\" list=\"#{'1':'Yes','2':'No'}\" value=\"2\" /\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 它會生成以下HTML代碼... \u003c/p\u003e \n\u003cpre\u003e\u0026lt;input type=\"radio\" name=\"yourAnswer\" id=\"resultAction_yourAnswer1\" value=\"1\"/\u0026gt;\r\n\u0026lt;label for=\"resultAction_yourAnswer1\"\u0026gt;Yes\u0026lt;/label\u0026gt; \r\n\r\n\u0026lt;input type=\"radio\" name=\"yourAnswer\" id=\"resultAction_yourAnswer2\" \r\nchecked=\"checked\" value=\"2\"/\u0026gt;\r\n\u0026lt;label for=\"resultAction_yourAnswer2\"\u0026gt;No\u0026lt;/label\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. Object \u003c/h2\u003e \n\u003cp\u003e 在Java代碼中,創建語言對象languageCode和languageDisplay的屬性。 \u003c/p\u003e \n\u003cpre\u003e//...\r\n public class Language{\r\n\r\n\t private String languageCode;\r\n\t private String languageDisplay;\r\n\t //getter and setter methods\r\n }\u003c/pre\u003e \n\u003cpre\u003e//...\r\n\tList\u0026lt;Language\u0026gt; languages = new ArrayList\u0026lt;Language\u0026gt;();\r\n\t\tlanguages.add( new Language(\"EN\", \"English\") );\r\n\t\tlanguages.add( new Language(\"FR\", \"France\") );\r\n\t\tlanguages.add( new Language(\"CN_ZH\", \"Chinese\") );\r\n\t\tlanguages.add( new Language(\"DE\", \"German\") );\r\n\t//...\r\n\tpublic List\u0026lt;Language\u0026gt; getLanguages() {\r\n\t\treturn languages;\r\n\t}\r\n\tpublic String getDefaultLanguageValue(){\r\n\t\treturn \"CN_ZH\";\r\n\t}\r\n\t//...\u003c/pre\u003e \n\u003cp\u003e 在結果頁面中,\u0026lt;s:radio\u0026gt; 標籤,list=」languages」 會調用 getLanguages()方法返回單選按鈕鍵和值的列表。\u0026nbsp;\u0026nbsp;listKey=」languageCode」\u0026nbsp;表示語言的 languageCode屬性爲單選按鈕的鍵;\u0026nbsp;listValue=」languageDisplay」\u0026nbsp;表示語言的languageDisplay屬性爲單選按鈕的值。最後\u0026nbsp;value=」defaultLanguageValue」\u0026nbsp;會調用\u0026nbsp;\u0026nbsp;getDefaultLanguageValue()\u0026nbsp;方法預先選擇「CN_ZH」 作爲單選按鈕的默認值。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:radio label=\"Gender\" name=\"yourLanguage\" list=\"languages\" \r\n listKey=\"languageCode\" listValue=\"languageDisplay\" value=\"defaultLanguageValue\" /\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 它會生成以下HTML代碼... \u003c/p\u003e \n\u003cpre\u003e\u0026lt;input type=\"radio\" name=\"yourLanguage\" id=\"resultAction_yourLanguageEN\" value=\"EN\"/\u0026gt;\r\n\u0026lt;label for=\"resultAction_yourLanguageEN\"\u0026gt;English\u0026lt;/label\u0026gt; \r\n\r\n\u0026lt;input type=\"radio\" name=\"yourLanguage\" id=\"resultAction_yourLanguageFR\" value=\"FR\"/\u0026gt;\r\n\u0026lt;label for=\"resultAction_yourLanguageFR\"\u0026gt;France\u0026lt;/label\u0026gt; \r\n\r\n\u0026lt;input type=\"radio\" name=\"yourLanguage\" id=\"resultAction_yourLanguageCN_ZH\" \r\nchecked=\"checked\" value=\"CN_ZH\"/\u0026gt;\r\n\u0026lt;label for=\"resultAction_yourLanguageCN_ZH\"\u0026gt;Chinese\u0026lt;/label\u0026gt; \r\n\r\n\u0026lt;input type=\"radio\" name=\"yourLanguage\" id=\"resultAction_yourLanguageDE\" value=\"DE\"/\u0026gt;\r\n\u0026lt;label for=\"resultAction_yourLanguageDE\"\u0026gt;German\u0026lt;/label\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.11.2/docs/radio.html\"\u003ehttp://struts.apache.org/2.0.11.2/docs/radio.html\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8.1/docs/struts-2-form-tags.html\"\u003ehttp://struts.apache.org/2.1.8.1/docs/struts-2-form-tags.html\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"cc:T11dc,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 創建一個Web工程,它的工程名稱爲:struts2chechbox,其完整的項目工程結構如下: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/checkbox-1.png\" alt=\"Struts2 \u003cs:checkbox\u003e複選框例子\"\u003e \u003c/p\u003e \n\u003cp\u003e 在Struts2,可以使用\u0026lt;s:checkbox\u0026gt;標籤來創建一個HTML複選框。fieldValue=」true」是將要提交的複選框的實際值。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:checkbox name=\"checkMe\" fieldValue=\"true\" label=\"Check Me for testing\"/\u0026gt;\u003c/pre\u003e \n\u003cdiv class=\"note\"\u003e\n 一般情況下,不需要聲明fieldValue=「true」,因爲true是默認值。 \n\u003c/div\u003e \n\u003cp\u003e 它會生成下面的HTML。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;input type=\"checkbox\" name=\"checkMe\" value=\"true\" id=\"xx_checkMe\"/\u0026gt;\r\n\u0026lt;input type=\"hidden\" id=\"__checkbox_xx_checkMe\" name=\"__checkbox_checkMe\" value=\"true\"/\u0026gt;\r\n\u0026lt;label for=\"resultAction_checkMe\" class=\"checkboxLabel\"\u0026gt;Check Me for testing\u0026lt;/label\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 預先選擇一個複選框 \u003c/h2\u003e \n\u003cp\u003e 如果想預先選擇一個複選框,只需添加一個value屬性,並將其設置爲true。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:checkbox name=\"checkMe\" fieldValue=\"true\" value=\"true\" label=\"Check Me for testing\"/\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 它會生成下面的HTML。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;input type=\"checkbox\" name=\"checkMe\" value=\"true\" checked=\"checked\" id=\"xx_checkMe\"/\u0026gt;\r\n\u0026lt;input type=\"hidden\" id=\"__checkbox_xx_checkMe\" name=\"__checkbox_checkMe\" value=\"true\" /\u0026gt;\r\n\u0026lt;label for=\"resultAction_checkMe\" class=\"checkboxLabel\"\u0026gt;Check Me for testing\u0026lt;/label\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e Struts2\u0026nbsp;\u0026lt;s:checkbox\u0026gt;\u0026nbsp;示例 \u003c/h2\u003e \n\u003cp\u003e 一個完整的例子,通過Struts 2中創建一個複選框\u0026lt;s:checkbox\u0026gt;, 並指派提交複選框值到Action類並顯示它。 \u003c/p\u003e \n\u003ch2\u003e 1. 動作 - Action \u003c/h2\u003e \n\u003cp\u003e Action類有checkMe布爾屬性來保存複選框值。\u003cbr\u003e \u003cstrong\u003eCheckBoxAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class CheckBoxAction extends ActionSupport{\r\n\r\n\tprivate boolean checkMe;\r\n\r\n\tpublic boolean isCheckMe() {\r\n\t\treturn checkMe;\r\n\t}\r\n\r\n\tpublic void setCheckMe(boolean checkMe) {\r\n\t\tthis.checkMe = checkMe;\r\n\t}\r\n\r\n\tpublic String execute() {\r\n\t\r\n\t\treturn SUCCESS;\r\n\t\r\n\t}\r\n\t\r\n\tpublic String display() {\r\n\t\t\r\n\t\treturn NONE;\r\n\t\r\n\t}\r\n\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. 結果頁面 \u003c/h2\u003e \n\u003cp\u003e 結果頁面使用Struts2的「s:checkbox」標籤來創建一個複選框。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003echeckBox.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 複選框示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:form action=\"resultAction\" namespace=\"/\"\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n\t\u0026lt;s:checkbox name=\"checkMe\" fieldValue=\"true\" label=\"Check Me for testing\"/\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;s:submit value=\"submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eresult.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 複選框示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n CheckBox (CheckMe) value : \u0026lt;s:property value=\"checkMe\"/\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \t\r\n\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"checkBoxAction\" \r\n class=\"com.yiibai.common.action.CheckBoxAction\" method=\"display\"\u0026gt;\r\n\t\u0026lt;result name=\"none\"\u0026gt;/pages/checkBox.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"resultAction\" class=\"com.yiibai.common.action.CheckBoxAction\"\u0026gt;\r\n\t\u0026lt;result name=\"success\"\u0026gt;/pages/result.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. 示例 \u003c/h2\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/struts2checkbox/checkBoxAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/checkbox-2.png\" alt=\"Struts2 \u003cs:checkbox\u003e複選框例子\"\u003e \n \u003cbr\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/\u003cem\u003estruts2checkbox\u003c/em\u003e/resultAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/checkbox-3.png\" alt=\"Struts2 \u003cs:checkbox\u003e複選框例子\"\u003e \n \u003cbr\u003e \n\u003c/div\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/checkbox.html\"\u003eStruts2 複選框文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"cd:T1085,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 在Struts2,可以通過\u0026lt;s:checkboxlist\u0026gt;標籤創建多個複選框具有相同名稱。棘手的問題是如何設置的默認值在多個複選框。例如,複選框以「紅色」,「黃色」,「藍色」,「綠色」選項的列表,並且要同時設置「紅色」和「綠色」爲默認選中的值。這裏創建一個Web工程:struts2setcheckboxes,來演示\u003cspan\u003e在多個複選框\u003c/span\u003e\u003cspan\u003e如何設置的默認值,整個項目的結構如下圖所示:\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cspan\u003e\u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-8.png\" alt=\"Struts2設置多個複選框缺省值\"\u003e\u003cbr\u003e \u003c/span\u003e \u003c/p\u003e \n\u003cdiv class=\"download\"\u003e\n 下載代碼 –\u0026nbsp; \n \u003ca href=\"http://pan.baidu.com/s/1bnfrCUr\"\u003ehttp://pan.baidu.com/s/1bnfrCUr\u003c/a\u003e \n\u003c/div\u003e \n\u003ch2\u003e 1. \u0026lt;s:checkboxlist\u0026gt; 實例 \u003c/h2\u003e \n\u003cp\u003e 一個\u0026nbsp;\u0026lt;s:checkboxlist\u0026gt;\u0026nbsp;示例 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:checkboxlist label=\"What's your favor color\" list=\"colors\" name=\"yourColor\" /\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 產生下面的HTML代碼 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;td class=\"tdLabel\"\u0026gt;\u0026lt;label for=\"resultAction_yourColor\" class=\"label\"\u0026gt;\r\nWhat's your favor color:\u0026lt;/label\u0026gt;\r\n\u0026lt;/td\u0026gt; \r\n\u0026lt;td \u0026gt; \r\n\u0026lt;input type=\"checkbox\" name=\"yourColor\" value=\"red\" id=\"yourColor-1\" /\u0026gt; \r\n\u0026lt;label for=\"yourColor-1\" class=\"checkboxLabel\"\u0026gt;red\u0026lt;/label\u0026gt; \r\n\u0026lt;input type=\"checkbox\" name=\"yourColor\" value=\"yellow\" id=\"yourColor-2\" /\u0026gt; \r\n\u0026lt;label for=\"yourColor-2\" class=\"checkboxLabel\"\u0026gt;yellow\u0026lt;/label\u0026gt; \r\n\u0026lt;input type=\"checkbox\" name=\"yourColor\" value=\"blue\" id=\"yourColor-3\" /\u0026gt; \r\n\u0026lt;label for=\"yourColor-3\" class=\"checkboxLabel\"\u0026gt;blue\u0026lt;/label\u0026gt; \r\n\u0026lt;input type=\"checkbox\" name=\"yourColor\" value=\"green\" id=\"yourColor-4\" /\u0026gt; \r\n\u0026lt;label for=\"yourColor-4\" class=\"checkboxLabel\"\u0026gt;green\u0026lt;/label\u0026gt; \r\n\u0026lt;input type=\"hidden\" id=\"__multiselect_resultAction_yourColor\" \r\n name=\"__multiselect_yourColor\" value=\"\" /\u0026gt; \r\n\u0026lt;/td\u0026gt;\u003c/pre\u003e \n\u003cp\u003e Action類提供顏色選項的複選框的列表。 \u003c/p\u003e \n\u003cpre\u003e//...\r\npublic class CheckBoxListAction extends ActionSupport{\r\n\r\n\tprivate List\u0026lt;String\u0026gt; colors;\r\n\tprivate String yourColor;\r\n\r\n\tpublic CheckBoxListAction(){\r\n\t\t\r\n\t\tcolors = new ArrayList\u0026lt;String\u0026gt;();\r\n\t\tcolors.add(\"red\");\r\n\t\tcolors.add(\"yellow\");\r\n\t\tcolors.add(\"blue\");\r\n\t\tcolors.add(\"green\");\r\n\t}\r\n\t\r\n\tpublic List\u0026lt;String\u0026gt; getColors() {\r\n\t\treturn colors;\r\n\t}\r\n\t//...\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. 單個默認選中值 \u003c/h2\u003e \n\u003cp\u003e 要作爲默認選中的值設爲「紅」選項,只是在行動類中添加一個方法,並返回一個「red」的值。 \u003c/p\u003e \n\u003cpre\u003e//...\r\npublic class CheckBoxListAction extends ActionSupport{\r\n\r\n\t//add a new method\r\n\tpublic String getDefaultColor(){\r\n\t\treturn \"red\";\r\n\t}\r\n}\u003c/pre\u003e \n\u003cp\u003e 在\u0026lt;s:checkboxlist\u0026gt;標籤中,添加一個value屬性並指向 getDefaultColor()方法。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:checkboxlist label=\"What's your favor color\" list=\"colors\" \r\n name=\"yourColor\" value=\"defaultColor\" /\u0026gt;\u003c/pre\u003e \n\u003cdiv class=\"note\"\u003e\n Struts 2將「defaultColor」值匹配到對應Java屬性getDefaultColor()。 \n\u003c/div\u003e \n\u003cp\u003e 再次運行它,「紅」選項將被默認選中。 \u003c/p\u003e \n\u003ch2\u003e 2. 多個默認選中的值 \u003c/h2\u003e \n\u003cp\u003e 要設置多個值「紅色」和「綠色」作爲默認選中的值,就返回一個「String []」,而不是「String\u0026nbsp;」,在Struts 2將相應匹配。 \u003c/p\u003e \n\u003cpre\u003e//...\r\npublic class CheckBoxListAction extends ActionSupport{\r\n\r\n\t//now return a String[]\r\n\tpublic String[] getDefaultColor(){\r\n\t\treturn new String [] {\"red\", \"green\"};\r\n\t}\r\n}\u003c/pre\u003e \n\u003cpre\u003e\u0026lt;s:checkboxlist label=\"What's your favor color\" list=\"colors\" \r\n name=\"yourColor\" value=\"defaultColor\" /\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 再次運行它,「紅色」和「綠色」的選項將被默認選中。 \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cp\u003e \u003ca href=\"http://localhost:8080/struts2setcheckboxes/checkBoxListAction.action\"\u003ehttp://localhost:8080/struts2setcheckboxes/checkBoxListAction.action\u003c/a\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-9.png\" alt=\"Struts2設置多個複選框缺省值\"\u003e \u003c/p\u003e \n\u003cp\u003e 點擊提交後,顯示結果如下圖所示: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-10.png\" alt=\"Struts2設置多個複選框缺省值\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"ce:T13fe,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 這裏創建一個Web工程:struts2checkboxlist,來演示在多個複選框如何設置的默認值,整個項目的結構如下圖所示: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/checkboxlist-1.png\" alt=\"Struts2 \u003cs:checkboxlist\u003e多個複選框例子\"\u003e \u003c/p\u003e \n\u003cp\u003e 在Struts2,可以使用\u0026lt;s:checkboxlist\u0026gt;標籤來使用相同的名稱來創建多個複選框。唯一的問題是如何把握變量中的多個檢查值? 例如, \u003c/p\u003e \n\u003cpre\u003epublic List\u0026lt;String\u0026gt; getColors() {\r\n\tcolors = new ArrayList\u0026lt;String\u0026gt;();\r\n\tcolors.add(\"red\");\r\n\tcolors.add(\"yellow\");\r\n\tcolors.add(\"blue\");\r\n\tcolors.add(\"green\");\r\n\treturn colors;\r\n}\u003c/pre\u003e \n\u003cpre\u003e\u0026lt;s:checkboxlist label=\"What's your favor color\" list=\"colors\" \r\nname=\"yourColor\" value=\"defaultColor\" /\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 一個多複選框以「紅」,「黃」,「藍」和「綠色」爲選項。如果有多個選項被選中,可以通過一個String對象存儲。 \u003c/p\u003e \n\u003cp\u003e 例如,如果「紅」「黃」選項被選中,選中的值將用逗號相結合連接,yourColor = 「red,yellow」. \u003c/p\u003e \n\u003cpre\u003eprivate String yourColor;\r\n\t\r\npublic void setYourColor(String yourColor) {\r\n\tthis.yourColor = yourColor;\r\n}\u003c/pre\u003e \n\u003cdiv class=\"note\"\u003e\n 閱讀這篇文章,有關如何設置多個複選框的默認值。 \n\u003c/div\u003e \n\u003ch2\u003e Struts2\u0026nbsp;\u0026lt;s:checkboxlist\u0026gt;\u0026nbsp;示例 \u003c/h2\u003e \n\u003cp\u003e 一個完整的Struts2實例,通過\u0026lt;s:checkboxlist\u0026gt;用相同的名稱創建多個複選框,存儲檢選中的值,並在另一頁面中顯示。 \u003c/p\u003e \n\u003ch2\u003e 1. 動作 - Action \u003c/h2\u003e \n\u003cp\u003e Action類來生成和保持的多個複選框值。\u003cbr\u003e \u003cstrong\u003eCheckBoxListAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class CheckBoxListAction extends ActionSupport{\r\n\r\n\tprivate List\u0026lt;String\u0026gt; colors;\r\n\r\n\tprivate String yourColor;\r\n\t\r\n\tpublic String getYourColor() {\r\n\t\treturn yourColor;\r\n\t}\r\n\r\n\tpublic void setYourColor(String yourColor) {\r\n\t\tthis.yourColor = yourColor;\r\n\t}\r\n\r\n\tpublic CheckBoxListAction(){\r\n\t\tcolors = new ArrayList\u0026lt;String\u0026gt;();\r\n\t\tcolors.add(\"red\");\r\n\t\tcolors.add(\"yellow\");\r\n\t\tcolors.add(\"blue\");\r\n\t\tcolors.add(\"green\");\r\n\t}\r\n\t\r\n\tpublic String[] getDefaultColor(){\r\n\t\treturn new String [] {\"red\", \"green\"};\r\n\t}\r\n\t\r\n\tpublic List\u0026lt;String\u0026gt; getColors() {\r\n\t\treturn colors;\r\n\t}\r\n\r\n\tpublic void setColors(List\u0026lt;String\u0026gt; colors) {\r\n\t\tthis.colors = colors;\r\n\t}\r\n\r\n\tpublic String execute() {\r\n\t\treturn SUCCESS;\r\n\t}\r\n\t\r\n\tpublic String display() {\r\n\t\treturn NONE;\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. 結果頁面 \u003c/h2\u003e \n\u003cp\u003e 通過「s:checkboxlist」標籤渲染多個複選框。\u003cbr\u003e \u003cstrong\u003echeckBoxlist.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 multiple check boxes example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:form action=\"resultAction\" namespace=\"/\"\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n\t\u0026lt;s:checkboxlist label=\"What's your favor color\" list=\"colors\" \r\n\t name=\"yourColor\" value=\"defaultColor\" /\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;s:submit value=\"submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eresult.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 multiple check boxes example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n Favor colors : \u0026lt;s:property value=\"yourColor\"/\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \t\r\n\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"checkBoxListAction\" \r\n class=\"com.yiibai.common.action.CheckBoxListAction\" method=\"display\"\u0026gt;\r\n\t\u0026lt;result name=\"none\"\u0026gt;/pages/checkBoxlist.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"resultAction\" class=\"com.yiibai.common.action.CheckBoxListAction\"\u0026gt;\r\n\t\u0026lt;result name=\"success\"\u0026gt;/pages/result.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. 實例 \u003c/h2\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/struts2checkboxlist/checkBoxListAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/checkboxlist-2.png\" alt=\"Struts2 \u003cs:checkboxlist\u003e多個複選框例子\"\u003e \n \u003cbr\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/struts2checkboxlist/resultAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cp\u003e \u003cem\u003e\u003cimg src=\"https://asset.1ju.org/cmsstatic/checkboxlist-3.png\" alt=\"Struts2 \u003cs:checkboxlist\u003e多個複選框例子\"\u003e\u003cbr\u003e \u003c/em\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/checkboxlist.html\"\u003eStruts 2 checkboxlist 文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv class=\"download\"\u003e\n 下載代碼 –\u0026nbsp; \n \u003ca href=\"http://pan.baidu.com/s/1dDCxAiH\"\u003ehttp://pan.baidu.com/s/1dDCxAiH\u003c/a\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"cf:T17ad,"])</script><script>self.__next_f.push([1,"\u003cp\u003e \u003cspan\u003e這裏創建一個Web工程:strut2selectdropdown,來演示\u003c/span\u003e\u003cspan\u003e在多個複選框\u003c/span\u003e\u003cspan\u003e如何設置的默認值,整個項目的結構如下圖所示:\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/select-1.png\" alt=\"Struts2 \u003cs:select\u003e下拉框例子\"\u003e \u003c/p\u003e \n\u003cp\u003e 在Struts2,可以使用 \u0026lt;s:select\u0026gt; 標籤來創建一個HTML下拉框。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:select label=\"What's your favor search engine\" \r\n\t\theaderKey=\"-1\" headerValue=\"Select Search Engines\"\r\n\t\tlist=\"searchEngine\" \r\n\t\tname=\"yourSearchEngine\" /\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 產生下面的HTML代碼... \u003c/p\u003e \n\u003cpre\u003e\u0026lt;td class=\"tdLabel\"\u0026gt;\r\n \u0026lt;label for=\"resultAction_yourSearchEngine\" class=\"label\"\u0026gt;\r\n What's your favor search engine:\r\n \u0026lt;/label\u0026gt;\r\n\u0026lt;/td\u0026gt; \r\n\u0026lt;td\u0026gt;\r\n\u0026lt;select name=\"yourSearchEngine\" id=\"resultAction_yourSearchEngine\"\u0026gt; \r\n \u0026lt;option value=\"-1\"\u0026gt;Select Search Engines\u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"google.com\"\u0026gt;google.com\u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"bing.com\"\u0026gt;bing.com\u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"yahoo.com\"\u0026gt;yahoo.com\u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"baidu.com\"\u0026gt;baidu.com\u0026lt;/option\u0026gt; \r\n\u0026lt;/select\u0026gt; \r\n\u0026lt;/td\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 其語法不需要太多解釋,只不過是「headerKey」和「headerValue」。「headerKey」是一個在下拉列表中項用來表示鍵,而「headerValue」是在下拉列表中的項目表示值。 \u003c/p\u003e \n\u003cdiv class=\"note\"\u003e\n 要自動選擇下拉框中的默認值,看看這篇文章:自動選擇Struts2下拉框的值 \n\u003c/div\u003e \n\u003ch2\u003e Struts 2\u0026nbsp;\u0026lt;s:select\u0026gt;\u0026nbsp;示例 \u003c/h2\u003e \n\u003cp\u003e 一個通過\u0026lt;s:select\u0026gt;創建下拉框完整的Struts2的例子,和填充通過Java列表,OGNL列表中選擇選項,保存所選的值,並在另一頁顯示。 \u003c/p\u003e \n\u003ch2\u003e 1. 動作 - Action \u003c/h2\u003e \n\u003cp\u003e Action類來生成並按住選定的下拉框中選項。\u003cbr\u003e \u003cstrong\u003eSelectAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class SelectAction extends ActionSupport{\r\n\r\n\tprivate List\u0026lt;String\u0026gt; searchEngine;\r\n\r\n\tprivate String yourSearchEngine;\r\n\tprivate String yourMonth;\r\n\t\r\n\tpublic String getYourMonth() {\r\n\t\treturn yourMonth;\r\n\t}\r\n\r\n\tpublic void setYourMonth(String yourMonth) {\r\n\t\tthis.yourMonth = yourMonth;\r\n\t}\r\n\r\n\tpublic List\u0026lt;String\u0026gt; getSearchEngine() {\r\n\t\treturn searchEngine;\r\n\t}\r\n\r\n\tpublic void setSearchEngine(List\u0026lt;String\u0026gt; searchEngine) {\r\n\t\tthis.searchEngine = searchEngine;\r\n\t}\r\n\r\n\tpublic String getYourSearchEngine() {\r\n\t\treturn yourSearchEngine;\r\n\t}\r\n\r\n\tpublic void setYourSearchEngine(String yourSearchEngine) {\r\n\t\tthis.yourSearchEngine = yourSearchEngine;\r\n\t}\r\n\r\n\tpublic String getDefaultSearchEngine() {\r\n\t\treturn \"yahoo.com\";\r\n\t}\r\n\t\r\n\tpublic SelectAction(){\r\n\t\t\r\n\t\tsearchEngine = new ArrayList\u0026lt;String\u0026gt;();\r\n\t\tsearchEngine.add(\"google.com\");\r\n\t\tsearchEngine.add(\"bing.com\");\r\n\t\tsearchEngine.add(\"yahoo.com\");\r\n\t\tsearchEngine.add(\"baidu.com\");\r\n\t}\r\n\r\n\tpublic String execute() {\r\n\t\treturn SUCCESS;\r\n\t}\r\n\t\r\n\tpublic String display() {\r\n\t\treturn NONE;\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. 結果頁面 \u003c/h2\u003e \n\u003cp\u003e 渲染下拉框中通過「\u0026lt;s:select\u0026gt;」標籤,並填充通過Java列表,OGNL列表中的選擇選項 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eselect.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 drop down box example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:form action=\"resultAction\" namespace=\"/\"\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n\t\u0026lt;s:select label=\"What's your favor search engine\" \r\n\t\theaderKey=\"-1\" headerValue=\"Select Search Engines\"\r\n\t\tlist=\"searchEngine\" \r\n\t\tname=\"yourSearchEngine\" \r\n\t\tvalue=\"defaultSearchEngine\" /\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;h2\u0026gt;\r\n\t\u0026lt;s:select label=\"Select a month\" \r\n\t\theaderKey=\"-1\" headerValue=\"Select Month\"\r\n\t\tlist=\"#{'1':'Jan', '2':'Feb', '3':'Mar', '4':'Apr'}\" \r\n\t\tname=\"yourMonth\" \r\n\t\tvalue=\"2\" /\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;s:submit value=\"submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eresult.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 drop down box example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n Favor search engine : \u0026lt;s:property value=\"yourSearchEngine\"/\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;h2\u0026gt;\r\n Selected month : \u0026lt;s:property value=\"yourMonth\"/\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \t\r\n\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"selectAction\" \r\n class=\"com.yiibai.common.action.SelectAction\" method=\"display\"\u0026gt;\r\n\t\u0026lt;result name=\"none\"\u0026gt;/pages/select.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"resultAction\" class=\"com.yiibai.common.action.SelectAction\"\u0026gt;\r\n\t\u0026lt;result name=\"success\"\u0026gt;/pages/result.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. 運行實例 \u003c/h2\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/strut2selectdropdown/selectAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/select-2.png\" alt=\"Struts2 \u003cs:select\u003e下拉框例子\"\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/strut2selectdropdown/resultAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/select-3.png\" alt=\"Struts2 \u003cs:select\u003e下拉框例子\"\u003e \n\u003c/div\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.x/docs/select.html\"\u003eStruts 2 select 文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cdiv class=\"download\"\u003e\n 下載代碼 –\u0026nbsp; \n \u003ca href=\"http://pan.baidu.com/s/1eQGzqHO\"\u003ehttp://pan.baidu.com/s/1eQGzqHO\u003c/a\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"d0:T817,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 在Struts2中,HTML下拉框可以通過\u0026lt;s:select\u0026gt;標籤呈現。要自動選擇一個下拉框的默認值,只是聲明\u0026lt;s:select\u0026gt;值」屬性標記,並設置相應的默認值。 \u003c/p\u003e \n\u003cp\u003e 這裏創建一個Web工程:strut2autoselectdropdown,來演示在多個複選框如何設置的默認值,整個項目的結構如下圖所示: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-11.png\" alt=\"Struts2自動選擇下拉框的值\"\u003e \u003c/p\u003e \n\u003ch2\u003e 1. Java List 示例 \u003c/h2\u003e \n\u003cp\u003e Java列表生成選擇選項的下拉框。 \u003c/p\u003e \n\u003cpre\u003e//...\r\npublic class SelectAction extends ActionSupport{\r\n\r\n\tprivate List\u0026lt;String\u0026gt; searchEngine;\r\n\tprivate String yourSearchEngine;\r\n\t\r\n\t//set default value\r\n\tpublic String getDefaultSearchEngine() {\r\n\t\treturn \"yahoo.com\";\r\n\t}\r\n\tpublic SelectAction(){\t\r\n\t\tsearchEngine = new ArrayList\u0026lt;String\u0026gt;();\r\n\t\tsearchEngine.add(\"google.com\");\r\n\t\tsearchEngine.add(\"bing.com\");\r\n\t\tsearchEngine.add(\"yahoo.com\");\r\n\t\tsearchEngine.add(\"baidu.com\");\r\n\t}\r\n\t//...\r\n}\u003c/pre\u003e \n\u003cp\u003e \u0026lt;s:select\u0026gt;標記呈現HTML下拉框。value=「defaultSearchEngine」將調用對應動作類的getDefaultSearchEngine()方法返回一個默認搜索引擎的值。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:select label=\"What's your favor search engine\" \r\n\t\theaderKey=\"-1\" headerValue=\"Select Search Engines\"\r\n\t\tlist=\"searchEngine\" \r\n\t\tname=\"yourSearchEngine\" \r\n\t\tvalue=\"defaultSearchEngine\" /\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 在這個例子中,下拉框將自動選擇「yahoo.com」作爲默認選項。 \u003c/p\u003e \n\u003ch2\u003e 2. OGNL List 實例 \u003c/h2\u003e \n\u003cp\u003e 通過創建OGNL表達式一個下拉框,並直接在「value」屬性設置的默認值。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:select label=\"Select a month\" \r\n\t\theaderKey=\"-1\" headerValue=\"Select Month\"\r\n\t\tlist=\"#{'1':'Jan', '2':'Feb', '3':'Mar', '4':'Apr'}\" \r\n\t\tname=\"yourMonth\" \r\n\t\tvalue=\"2\" /\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 在這個例子中,下拉框將自動選擇「2」 (Feb)爲默認選項。 \u003c/p\u003e \n\u003cdiv class=\"download\"\u003e\n 下載代碼 –\u0026nbsp; \n \u003ca href=\"http://pan.baidu.com/s/1mgq49nU\"\u003ehttp://pan.baidu.com/s/1mgq49nU\u003c/a\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"d1:T1984,"])</script><script>self.__next_f.push([1,"\u003cp\u003e \u003cspan\u003e這裏創建一個Web工程:strut2\u003cspan\u003ecombobox\u003c/span\u003e,來演示\u003c/span\u003e\u003cspan\u003e在多個複選框\u003c/span\u003e\u003cspan\u003e如何設置的默認值,整個項目的結構如下圖所示:\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/combobox-1.png\" alt=\"Struts2 \u003cs:combobox\u003e組合框的例子\"\u003e \u003c/p\u003e \n\u003cp\u003e 在Struts2, \u0026lt;s:combobox\u0026gt;標籤是一個下拉列表單文本框組合在一起,允許用戶直接輸入一個值在文本框中,或選擇從下拉列表中選擇值,並選定值將自動填充到文本框中。 \u003c/p\u003e \n\u003cdiv class=\"note\"\u003e\n 如果下拉列表和組合框列表,請閱讀 \n \u003ca href=\"http://en.wikipedia.org/wiki/Combo_box\"\u003e維基組合框\u003cspan\u003e定義\u003c/span\u003e\u003c/a\u003e以免混淆。 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;s:combobox label=\"What's your favor fruit\" \r\n\t\theaderKey=\"-1\" headerValue=\"--- Select ---\"\r\n\t\tlist=\"fruits\" \r\n\t\tname=\"yourFruits\" /\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 產生下面的HTML代碼... \u003c/p\u003e \n\u003cpre\u003e\u0026lt;td class=\"tdLabel\"\u0026gt;\r\n \u0026lt;label for=\"resultAction_yourFruits\" class=\"label\"\u0026gt;\r\n What's your favor fruit:\r\n \u0026lt;/label\u0026gt;\r\n\u0026lt;/td\u0026gt; \r\n\u0026lt;td\u0026gt; \r\n\u0026lt;script type=\"text/javascript\"\u0026gt; \r\nfunction autoPopulate_resultAction_yourFruits(targetElement) {\r\n\tif (targetElement.options[targetElement.selectedIndex].value == '-1') {\r\n\t\treturn;\r\n\t}\r\n\ttargetElement.form.elements['yourFruits'].value=\r\n targetElement.options[targetElement.selectedIndex].value;\r\n}\r\n\u0026lt;/script\u0026gt; \r\n\u0026lt;input type=\"text\" name=\"yourFruits\" value=\"\" id=\"resultAction_yourFruits\"/\u0026gt;\r\n\u0026lt;br /\u0026gt; \r\n\u0026lt;select onChange=\"autoPopulate_resultAction_yourFruits(this);\"\u0026gt; \r\n \u0026lt;option value=\"-1\"\u0026gt;--- Select ---\u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"Apple\"\u0026gt;Apple\u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"Banana\"\u0026gt;Banana\u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"Orange\"\u0026gt;Orange\u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"Watermelon\"\u0026gt;Watermelon\u0026lt;/option\u0026gt; \r\n\u0026lt;/select\u0026gt; \r\n\u0026lt;/td\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u0026lt;s:combobox\u0026gt; 標記將產生輸入文本框,下拉列表中有「onChange()」方法調用來生成的JavaScript 來從下拉列表中選擇的值到\u003cspan\u003e自動填充\u003c/span\u003e生成的文本框中。 \u003c/p\u003e \n\u003cdiv class=\"note\"\u003e\n 如要創建一個下拉列表,應該使用\u0026nbsp;\u0026lt;s:select\u0026gt;標籤來代替。 \n\u003c/div\u003e \n\u003ch2\u003e Struts 2\u0026nbsp;\u0026lt;s:combobox\u0026gt;\u0026nbsp;示例 \u003c/h2\u003e \n\u003cp\u003e 一個完整的Struts2示例,通過利用\u0026lt;s:combobox\u0026gt;說明組合框。 \u003c/p\u003e \n\u003ch2\u003e 1. 動作 -\u0026nbsp;Action \u003c/h2\u003e \n\u003cp\u003e Action類來生成並按住選定的組合框的選項。\u003cbr\u003e \u003cstrong\u003eComboBoxAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class ComboBoxAction extends ActionSupport{\r\n\r\n\tprivate List\u0026lt;String\u0026gt; fruits;\r\n\r\n\tprivate String yourFruits;\r\n\tprivate String yourMonth;\r\n\t\r\n\tpublic String getYourMonth() {\r\n\t\treturn yourMonth;\r\n\t}\r\n\r\n\tpublic void setYourMonth(String yourMonth) {\r\n\t\tthis.yourMonth = yourMonth;\r\n\t}\r\n\r\n\tpublic List\u0026lt;String\u0026gt; getFruits() {\r\n\t\treturn fruits;\r\n\t}\r\n\r\n\tpublic void setFruits(List\u0026lt;String\u0026gt; fruits) {\r\n\t\tthis.fruits = fruits;\r\n\t}\r\n\r\n\tpublic String getYourFruits() {\r\n\t\treturn yourFruits;\r\n\t}\r\n\r\n\tpublic void setYourFruits(String yourFruits) {\r\n\t\tthis.yourFruits = yourFruits;\r\n\t}\r\n\r\n\tpublic ComboBoxAction(){\r\n\t\t\r\n\t\tfruits = new ArrayList\u0026lt;String\u0026gt;();\r\n\t\tfruits.add(\"Apple\");\r\n\t\tfruits.add(\"Banana\");\r\n\t\tfruits.add(\"Orange\");\r\n\t\tfruits.add(\"Watermelon\");\r\n\t}\r\n\r\n\tpublic String execute() {\r\n\t\treturn SUCCESS;\r\n\t}\r\n\t\r\n\tpublic String display() {\r\n\t\treturn NONE;\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. 結果頁面 \u003c/h2\u003e \n\u003cp\u003e 通過「\u0026lt;s:combobox\u0026gt;」標籤渲染組合框,並填充通過Java列表,OGNL列表中選擇選項 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003ecombobox.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 \u0026lt;s:combobox\u0026gt; example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:form action=\"resultAction\" namespace=\"/\"\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n\t\u0026lt;s:combobox label=\"What's your favor fruit\" \r\n\t\theaderKey=\"-1\" headerValue=\"--- Select ---\"\r\n\t\tlist=\"fruits\" \r\n\t\tname=\"yourFruits\" /\u0026gt;\r\n\u0026lt;/h2\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n\t\u0026lt;s:combobox label=\"Select a month\" \r\n\t\theaderKey=\"-1\" headerValue=\"--- Select ---\"\r\n\t\tlist=\"#{'1':'Jan', '2':'Feb', '3':'Mar', '4':'Apr'}\" \r\n\t\tname=\"yourMonth\" /\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;s:submit value=\"submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eresult.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 \u0026lt;s:combobox\u0026gt; example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n Favor fruit : \u0026lt;s:property value=\"yourFruits\"/\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;h2\u0026gt;\r\n Selected month : \u0026lt;s:property value=\"yourMonth\"/\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \t\r\n\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"comboBoxAction\" \r\n class=\"com.yiibai.common.action.ComboBoxAction\" method=\"display\"\u0026gt;\r\n\t\u0026lt;result name=\"none\"\u0026gt;pages/combobox.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"resultAction\" class=\"com.yiibai.common.action.ComboBoxAction\"\u0026gt;\r\n\t\u0026lt;result name=\"success\"\u0026gt;pages/result.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\r\n\u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. 示例 \u003c/h2\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/strut2combobox/comboBoxAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cspan\u003e\u003c/span\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/combobox-2.png\" alt=\"Struts2 \u003cs:combobox\u003e組合框的例子\"\u003e \n \u003cbr\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/strut2combobox/resultAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/combobox-3.png\" alt=\"Struts2 \u003cs:combobox\u003e組合框的例子\"\u003e \n \u003cbr\u003e \n\u003c/div\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.x/docs/combobox.html\"\u003eStruts 2 combobox文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e \u003c/p\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://en.wikipedia.org/wiki/Combo_box\"\u003eWiki combo box 定義\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e \u003cspan\u003e下載代碼:\u003ca href=\"http://pan.baidu.com/s/1qW8Ds5Y\"\u003ehttp://pan.baidu.com/s/1qW8Ds5Y\u003c/a\u003e\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"d2:T68e,"])</script><script>self.__next_f.push([1,"\u003cp\u003e \u0026lt;s:head\u0026gt;標籤是用來輸出如編碼,CSS或JavaScript文件的HTML頭信息。請參見下面的代碼片段: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;s:head /\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n..\u003c/pre\u003e \n\u003cp\u003e 假設使用的是默認XHTML主題,它會根據「template\\xhtml\\head.ftl」文件渲染輸出: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;link rel=\"stylesheet\" href=\"/your_project/struts/xhtml/styles.css\" type=\"text/css\"/\u0026gt; \r\n\u0026lt;script src=\"/your_project/struts/utils.js\" type=\"text/javascript\"\u0026gt;\u0026lt;/script\u0026gt; \r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n..\u003c/pre\u003e \n\u003cp\u003e 要包括新的JS和CSS文件,只需將其添加到「template\\xhtml\\head.ftl」模板文件,並通過\u0026lt;s:head\u0026gt;標籤輸出。其實,這個\u0026lt;S:head\u0026gt;標籤並不需要HTML \u0026lt;head\u0026gt;標籤, \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003e\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;head\u0026gt;\r\n\u0026lt;s:head /\u0026gt;\r\n\u0026lt;/head\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 可以把它放在任何地方,它只是輸出 CSS 和 JS 文件路徑(默認情況下,XHTML的主題)。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;s:head /\u0026gt;\r\n...\u003c/pre\u003e \n\u003cdiv class=\"note\"\u003e \n \u003cstrong\u003e良好實踐\u003c/strong\u003e \n \u003cp\u003e 爲了提高網站的性能,良好的做法是把CSS文件在頁面頂部;\u0026nbsp;而JS文件在頁面底部。 So, the\u0026nbsp;因此,\u0026lt;s:head\u0026gt;標籤可能不適合,一個很好的做法應該是創創建新的標籤將CSS和JS文件輸出分開。例如,\u0026lt;s:css\u0026gt;\u0026nbsp;和\u0026nbsp;\u0026lt;s:javascript\u0026gt;。 \u003c/p\u003e \n\u003c/div\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.x/docs/head.html\"\u003eStruts 2 \u0026lt;s:head\u0026gt; 示例\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"d3:T202f,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 在Struts2, \u0026lt;s:file\u0026gt; 標籤用於創建一個HTML文件上傳組件,允許用戶從本地磁盤選擇文件,並將其上傳到服務器。在本教程中,您將創建與文件上傳組件JSP頁面,設置最大大小和允許上傳文件的內容類型,並顯示上傳文件的詳細信息。 \u003c/p\u003e \n\u003cp\u003e \u003cspan\u003e這裏創建一個Web工程:strut2uploadfile,來演示\u003c/span\u003e\u003cspan\u003e在多個複選框\u003c/span\u003e\u003cspan\u003e如何設置的默認值,整個項目的結構如下圖所示:\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-12.png\" alt=\"Struts2文件上傳例子\"\u003e \u003c/p\u003e \n\u003ch2\u003e 1. 動作類 \u003c/h2\u003e \n\u003cp\u003e Action類的文件上傳,聲明「File」變量來存儲用戶上傳的文件,兩個字符串變量以存儲文件名和內容類型。「文件上傳攔截器」通過設置「X」的ContentType(),並設置「X」FileName()會自動注入上傳的文件細節,確保方法名拼寫正確。 \u003c/p\u003e \n\u003cp\u003e P.S X是以存儲上傳的文件中的變量。 \u003c/p\u003e \n\u003cdiv class=\"note\"\u003e\n 文件上傳功能是依賴於「文件上傳攔截器」,確保將其納入行動的堆棧。幸運的是,默認的堆棧已經包含了「文件上傳攔截器」。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eFileUploadAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.io.File;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class FileUploadAction extends ActionSupport{\r\n\r\n\tprivate File fileUpload;\r\n\tprivate String fileUploadContentType;\r\n\tprivate String fileUploadFileName;\r\n\r\n\tpublic String getFileUploadContentType() {\r\n\t\treturn fileUploadContentType;\r\n\t}\r\n\r\n\tpublic void setFileUploadContentType(String fileUploadContentType) {\r\n\t\tthis.fileUploadContentType = fileUploadContentType;\r\n\t}\r\n\r\n\tpublic String getFileUploadFileName() {\r\n\t\treturn fileUploadFileName;\r\n\t}\r\n\r\n\tpublic void setFileUploadFileName(String fileUploadFileName) {\r\n\t\tthis.fileUploadFileName = fileUploadFileName;\r\n\t}\r\n\r\n\tpublic File getFileUpload() {\r\n\t\treturn fileUpload;\r\n\t}\r\n\r\n\tpublic void setFileUpload(File fileUpload) {\r\n\t\tthis.fileUpload = fileUpload;\r\n\t}\r\n\r\n\tpublic String execute() throws Exception{\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t\t\r\n\t}\r\n\t\r\n\tpublic String display() {\r\n\t\treturn NONE;\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. 結果頁面 \u003c/h2\u003e \n\u003cp\u003e 使用\u0026lt;s:file\u0026gt;標籤來渲染一個文件上傳組件,並設置表單的enctype類型爲:「multipart/form-data」。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003efileupload.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;s:head /\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 \u0026lt;s:file\u0026gt; file upload example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:form action=\"resultAction\" namespace=\"/\" \r\nmethod=\"POST\" enctype=\"multipart/form-data\"\u0026gt;\r\n\r\n\u0026lt;s:file name=\"fileUpload\" label=\"Select a File to upload\" size=\"40\" /\u0026gt;\r\n\r\n\u0026lt;s:submit value=\"submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eresult.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 \u0026lt;s:file\u0026gt; file upload example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;div\u0026gt;\u0026lt;div class=\"ads-in-post hide_if_width_less_800\"\u0026gt;\r\n\u0026lt;script async src=\"//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\"\u0026gt;\u0026lt;/script\u0026gt;\r\n\u0026lt;!-- 728x90 - After2ndH4 --\u0026gt;\r\n\u0026lt;ins class=\"adsbygoogle hide_if_width_less_800\" \r\n style=\"display:inline-block;width:728px;height:90px\"\r\n data-ad-client=\"ca-pub-2836379775501347\"\r\n data-ad-slot=\"3642936086\"\r\n\t data-ad-region=\"yiibairegion\"\u0026gt;\u0026lt;/ins\u0026gt;\r\n\u0026lt;script\u0026gt;\r\n(adsbygoogle = window.adsbygoogle || []).push({});\r\n\u0026lt;/script\u0026gt;\r\n\u0026lt;/div\u0026gt;\u0026lt;/div\u0026gt;\u0026lt;h2\u0026gt;\r\n File Name : \u0026lt;s:property value=\"fileUploadFileName\"/\u0026gt; \r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;h2\u0026gt;\r\n Content Type : \u0026lt;s:property value=\"fileUploadContentType\"/\u0026gt; \r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;h2\u0026gt;\r\n File : \u0026lt;s:property value=\"fileUpload\"/\u0026gt; \r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \t\u0026lt;constant name=\"struts.custom.i18n.resources\" value=\"global\" /\u0026gt;\r\n \t\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\r\n\t\u0026lt;action name=\"fileUploadAction\" \r\n\t class=\"com.yiibai.common.action.FileUploadAction\" method=\"display\"\u0026gt;\r\n\t \u0026lt;result name=\"none\"\u0026gt;/pages/fileupload.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;action name=\"resultAction\" class=\"com.yiibai.common.action.FileUploadAction\"\u0026gt;\r\n\t \u0026lt;interceptor-ref name=\"exception\"/\u0026gt;\r\n \u0026lt;interceptor-ref name=\"i18n\"/\u0026gt;\r\n \u0026lt;interceptor-ref name=\"fileUpload\"\u0026gt;\r\n \t\t\u0026lt;param name=\"allowedTypes\"\u0026gt;text/plain\u0026lt;/param\u0026gt;\r\n \t\t\u0026lt;param name=\"maximumSize\"\u0026gt;10240\u0026lt;/param\u0026gt;\r\n \t \u0026lt;/interceptor-ref\u0026gt; \r\n \u0026lt;interceptor-ref name=\"params\"\u0026gt;\r\n \u0026lt;param name=\"excludeParams\"\u0026gt;dojo\\..*,^struts\\..*\u0026lt;/param\u0026gt;\r\n \u0026lt;/interceptor-ref\u0026gt;\r\n \u0026lt;interceptor-ref name=\"validation\"\u0026gt;\r\n \u0026lt;param name=\"excludeMethods\"\u0026gt;input,back,cancel,browse\u0026lt;/param\u0026gt;\r\n \u0026lt;/interceptor-ref\u0026gt;\r\n \u0026lt;interceptor-ref name=\"workflow\"\u0026gt;\r\n \u0026lt;param name=\"excludeMethods\"\u0026gt;input,back,cancel,browse\u0026lt;/param\u0026gt;\r\n \u0026lt;/interceptor-ref\u0026gt;\r\n \r\n\t \u0026lt;result name=\"success\"\u0026gt;/pages/result.jsp\u0026lt;/result\u0026gt;\r\n\t \u0026lt;result name=\"input\"\u0026gt;/pages/fileupload.jsp\u0026lt;/result\u0026gt;\r\n\t\t\t\r\n\t\u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003e文件大小限制\u003c/strong\u003e\u003cbr\u003e 在這個例子中,您將通過「文件上傳攔截」上傳文件大小的限制,\u0026nbsp;該值以字節爲單位計數。在本實例中,上載文件的最大尺寸是10KB。 \u003c/p\u003e \n\u003cdiv class=\"note\"\u003e\n 注:上傳文件的默認最大文件大小爲2MB \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003e文件類型\u003c/strong\u003e\u003cbr\u003e 可以通過設置「文件上傳攔截器」允許的文件類型。在這種情況下,上傳文件只接受「text/plain」\u003cspan\u003e的\u003c/span\u003e類型。\u003cspan\u003e\u003c/span\u003e \u003c/p\u003e \n\u003cdiv class=\"note\"\u003e\n 在Struts2中,有好幾種方面做到這一點,查看 \n \u003ca href=\"http://struts.apache.org/2.0.14/docs/file-upload.html\"\u003eStruts2的文件上傳文檔\u003c/a\u003e。 \n\u003c/div\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/Struts2Example/fileUploadAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-13.png\" alt=\"Struts2文件上傳例子\"\u003e \n \u003cbr\u003e \n\u003c/div\u003e \n\u003cp\u003e 錯誤信息提示,如果您上傳一個文件,該文件超過10KB,或者未選文本文件。 \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-14.png\" alt=\"Struts2文件上傳例子\"\u003e \n \u003cbr\u003e \n\u003c/div\u003e \n\u003cp\u003e 上傳名爲「yiibai.com.txt」\u003cspan\u003e的文本文件\u003c/span\u003e, 文件大小 : 5kb. \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-15.png\" alt=\"Struts2文件上傳例子\"\u003e \n \u003cbr\u003e \n\u003c/div\u003e \n\u003cp\u003e 上傳的文件將被視爲一個臨時文件,具有長的隨機文件名,如:upload__376584a7_12981122379__8000_00000010.tmp. 請確保這個臨時文件複製到其他地方。 閱讀\u003ca href=\"http://commons.apache.org/io/api-1.4/org/apache/commons/io/FileUtils.html\"\u003e文件實用文檔\u003c/a\u003e複製文件。 \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.x/docs/file.html\"\u003eStruts 2 文件文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/file-upload.html\"\u003ehttp://struts.apache.org/2.0.14/docs/file-upload.html\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/how-do-we-upload-files.html\"\u003ehttp://struts.apache.org/2.0.14/docs/how-do-we-upload-files.html\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://commons.apache.org/io/api-1.4/org/apache/commons/io/FileUtils.html\"\u003ehttp://commons.apache.org/io/api-1.4/org/apache/commons/io/FileUtils.html\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cp\u003e 下載代碼 –\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1eQDH07S\"\u003ehttp://pan.baidu.com/s/1eQDH07S\u003c/a\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"d4:T16b2,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 在上章節Struts2 文件上傳示例, 用戶允許選擇一個文件並上傳到服務器。在本教程中,您將學習如何允許用戶將多個文件上傳到服務器。 \u003c/p\u003e \n\u003cp\u003e \u003cspan\u003e這裏創建一個Web工程:strut2uploadfiles,來演示\u003c/span\u003e\u003cspan\u003e在多個複選框\u003c/span\u003e\u003cspan\u003e如何設置的默認值,整個項目的結構如下圖所示:\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-16.png\" alt=\"Struts2上傳多個文件例子\"\u003e \u003c/p\u003e \n\u003ch2\u003e 1. 動作類 \u003c/h2\u003e \n\u003cp\u003e 在Action類,可以使用列表或數組以存儲上傳的文件。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eFileUploadAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.io.File;\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class MultipleFileUploadAction extends ActionSupport{\r\n\r\n\tprivate List\u0026lt;File\u0026gt; fileUpload = new ArrayList\u0026lt;File\u0026gt;();\r\n\tprivate List\u0026lt;String\u0026gt; fileUploadContentType = new ArrayList\u0026lt;String\u0026gt;();\r\n\tprivate List\u0026lt;String\u0026gt; fileUploadFileName = new ArrayList\u0026lt;String\u0026gt;();\r\n\r\n\tpublic List\u0026lt;File\u0026gt; getFileUpload() {\r\n\t\treturn fileUpload;\r\n\t}\r\n\r\n\tpublic void setFileUpload(List\u0026lt;File\u0026gt; fileUpload) {\r\n\t\tthis.fileUpload = fileUpload;\r\n\t}\r\n\r\n\tpublic List\u0026lt;String\u0026gt; getFileUploadContentType() {\r\n\t\treturn fileUploadContentType;\r\n\t}\r\n\r\n\tpublic void setFileUploadContentType(List\u0026lt;String\u0026gt; fileUploadContentType) {\r\n\t\tthis.fileUploadContentType = fileUploadContentType;\r\n\t}\r\n\r\n\tpublic List\u0026lt;String\u0026gt; getFileUploadFileName() {\r\n\t\treturn fileUploadFileName;\r\n\t}\r\n\r\n\tpublic void setFileUploadFileName(List\u0026lt;String\u0026gt; fileUploadFileName) {\r\n\t\tthis.fileUploadFileName = fileUploadFileName;\r\n\t}\r\n\t\r\n\tpublic String upload() throws Exception{\r\n\t\t\r\n\t for (File file: fileUpload) {\r\n\t System.out.println(\"File :\" + file);\r\n\t }\r\n\t \r\n\t for (String fileName: fileUploadFileName) {\r\n\t System.out.println(\"Filename : \" + fileName);\r\n\t }\r\n\r\n\t for (String fileContentType: fileUploadContentType) {\r\n\t System.out.println(\"File type : \" + fileContentType);\r\n\t }\r\n\t \r\n\t return SUCCESS;\r\n\t\t\r\n\t}\r\n\r\n\tpublic String display() {\r\n\t\treturn NONE;\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. 結果頁面 \u003c/h2\u003e \n\u003cp\u003e 使用\u0026lt;s:file\u0026gt;標籤來渲染多文件上傳組件,並設置表單 enctype類型爲「multipart/form-data」. \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003efileupload.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;s:head /\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2上傳多個文件示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:form action=\"resultAction\" namespace=\"/\" \r\nmethod=\"POST\" enctype=\"multipart/form-data\"\u0026gt;\r\n\r\n\u0026lt;s:file label=\"File 1\" name=\"fileUpload\" size=\"40\" /\u0026gt;\r\n\u0026lt;s:file label=\"File 2\" name=\"fileUpload\" size=\"40\" /\u0026gt;\r\n\u0026lt;s:file label=\"FIle 2\" name=\"fileUpload\" size=\"40\" /\u0026gt;\r\n\r\n\u0026lt;s:submit value=\"submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eresult.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2上傳多個文件示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;div\u0026gt;\u0026lt;div class=\"ads-in-post hide_if_width_less_800\"\u0026gt;\r\n\u0026lt;script async src=\"//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\"\u0026gt;\u0026lt;/script\u0026gt;\r\n\u0026lt;!-- 728x90 - After2ndH4 --\u0026gt;\r\n\u0026lt;ins class=\"adsbygoogle hide_if_width_less_800\" \r\n style=\"display:inline-block;width:728px;height:90px\"\r\n data-ad-client=\"ca-pub-2836379775501347\"\r\n data-ad-slot=\"3642936086\"\r\n\t data-ad-region=\"yiibairegion\"\u0026gt;\u0026lt;/ins\u0026gt;\r\n\u0026lt;script\u0026gt;\r\n(adsbygoogle = window.adsbygoogle || []).push({});\r\n\u0026lt;/script\u0026gt;\r\n\u0026lt;/div\u0026gt;\u0026lt;/div\u0026gt;\u0026lt;h2\u0026gt;\r\n File Name : \u0026lt;s:property value=\"fileUploadFileName\"/\u0026gt; \r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;h2\u0026gt;\r\n Content Type : \u0026lt;s:property value=\"fileUploadContentType\"/\u0026gt; \r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;h2\u0026gt;\r\n File : \u0026lt;s:property value=\"fileUpload\"/\u0026gt; \r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\r\n\t\u0026lt;action name=\"multipleFileUploadAction\" \r\n\t class=\"com.yiibai.common.action.MultipleFileUploadAction\" \r\n method=\"display\"\u0026gt;\r\n\t\t\u0026lt;result name=\"none\"\u0026gt;pages/multiplefileupload.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;action name=\"resultAction\" \r\n\t class=\"com.yiibai.common.action.MultipleFileUploadAction\" \r\n method=\"upload\"\u0026gt;\r\n\t\t \u0026lt;result name=\"success\"\u0026gt;pages/result.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/struts2uploafiles/multipleFileUploadAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-17.png\" alt=\"Struts2上傳多個文件例子\"\u003e \n\u003c/div\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-18.png\" alt=\"Struts2上傳多個文件例子\"\u003e \n\u003c/div\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e Struts2文件上傳示例 \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.x/docs/file.html\"\u003eStruts2文件上傳文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/file-upload.html\"\u003ehttp://struts.apache.org/2.0.14/docs/file-upload.html\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/how-do-we-upload-files.html\"\u003ehttp://struts.apache.org/2.0.14/docs/how-do-we-upload-files.html\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e \u003cspan\u003e\u003c/span\u003e下載代碼 -\u0026nbsp; \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"d5:T2393,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 在Struts2,\u0026lt;s:doubleselect\u0026gt;標籤用於創建兩個HTML下拉框,第一個下拉列表中選擇後,第二個下拉列表將根據第一個選擇發生相應的變化。一個非常典型的例子是「國家」,「國家」下拉選項,不同的「狀態」列表是根據所選擇的「國家」。 \u003c/p\u003e \n\u003cp\u003e 這裏創建一個Web工程:strut2sdoubleselect,來演示在多個複選框如何設置的默認值,整個項目的結構如下圖所示: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/doubleselect-1.png\" alt=\"Struts2 \u003cs:doubleselect\u003e示例\"\u003e \u003c/p\u003e \n\u003cp\u003e \u0026nbsp;\u0026lt;s:doubleselect\u0026gt; 標籤示例 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:doubleselect label=\"Fruits (OGNL) \" \r\nname=\"fruit1\" list=\"{'fruit','meat'}\" \r\ndoubleName=\"fruit2\" \r\ndoubleList=\"top == 'fruit' ? {'apple', 'orange','banana'} : {'chicken', 'pig'}\" /\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 產生下面的HTML代碼... \u003c/p\u003e \n\u003cpre\u003e\u0026lt;tr\u0026gt; \r\n\u0026lt;td class=\"tdLabel\"\u0026gt;\r\n \u0026lt;label for=\"resultAction_fruit1\" class=\"label\"\u0026gt;\r\n Fruits (OGNL) :\r\n \u0026lt;/label\u0026gt;\r\n\u0026lt;/td\u0026gt; \r\n\u0026lt;td\u0026gt; \r\n\u0026lt;select name=\"fruit1\" id=\"resultAction_fruit1\" \r\n onchange=\"resultAction_fruit1Redirect(this.options.selectedIndex)\"\u0026gt; \r\n \u0026lt;option value=\"fruit\"\u0026gt;fruit\u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"meat\"\u0026gt;meat\u0026lt;/option\u0026gt; \r\n\u0026lt;/select\u0026gt; \r\n\u0026lt;br /\u0026gt; \r\n\u0026lt;select name=\"fruit2\" id=\"resultAction_fruit2\"\u0026gt; \r\n\u0026lt;/select\u0026gt; \r\n\u0026lt;script type=\"text/javascript\"\u0026gt; \r\n var resultAction_fruit1Group = new Array(2 + 0);\r\n for (i = 0; i \u0026lt; (2 + 0); i++)\r\n resultAction_fruit1Group[i] = new Array();\r\n \r\n resultAction_fruit1Group[0][0] = new Option(\"apple\", \"apple\");\r\n \r\n resultAction_fruit1Group[0][1] = new Option(\"orange\", \"orange\");\r\n \r\n resultAction_fruit1Group[0][2] = new Option(\"banana\", \"banana\");\r\n \r\n resultAction_fruit1Group[1][0] = new Option(\"chicken\", \"chicken\");\r\n \r\n resultAction_fruit1Group[1][1] = new Option(\"pig\", \"pig\");\r\n \r\n \r\n var resultAction_fruit1Temp = document.resultAction.resultAction_fruit2;\r\n resultAction_fruit1Redirect(0);\r\n function resultAction_fruit1Redirect(x) {\r\n \tvar selected = false;\r\n for (m = resultAction_fruit1Temp.options.length - 1; m \u0026gt;= 0; m--) {\r\n resultAction_fruit1Temp.options[m] = null;\r\n }\r\n \r\n for (i = 0; i \u0026lt; resultAction_fruit1Group[x].length; i++) {\r\n resultAction_fruit1Temp.options[i] = \r\n\t new Option(\r\n resultAction_fruit1Group[x][i].text, resultAction_fruit1Group[x][i].value\r\n );\r\n }\r\n \r\n if ((resultAction_fruit1Temp.options.length \u0026gt; 0) \u0026amp;\u0026amp; (! selected)) {\r\n \tresultAction_fruit1Temp.options[0].selected = true;\r\n }\r\n }\r\n\u0026lt;/script\u0026gt; \r\n\u0026lt;/td\u0026gt; \r\n\u0026lt;/tr\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 好了,\u0026lt;s:doubleselect\u0026gt;標籤是真正產生大量的代碼。它會創建兩個下拉列表, 很多JavaScript代碼背後做魔術(第一選擇,第二個變化),並且還附上了「onchange()」行爲,以第一個下拉框。 \u003c/p\u003e \n\u003cdiv class=\"note\"\u003e \n \u003cstrong\u003e看起來比較複雜,但簡單!\u003c/strong\u003e \n \u003cbr\u003e 這只是兩個\u0026lt;s:select\u0026gt;標記結合在一個標籤,看得很清楚了。 \n \u003cpre\u003e\u0026lt;s:doubleselect\r\nname=\"\" list=\"\" \r\ndoubleName=\"\" doubleList=\"\" /\u0026gt;\u003c/pre\u003e \n \u003cp\u003e 「\u003cstrong\u003ename\u003c/strong\u003e」和「\u003cstrong\u003elist\u003c/strong\u003e」是指第一個下拉列表。「doubleName」和「doubleList」是指所述第二下拉列表。數據羣和「\u0026lt;s:select\u0026gt;」標籤是一樣的。\u0026nbsp; \u003c/p\u003e \n\u003c/div\u003e \n\u003ch2\u003e Struts2\u0026nbsp;\u0026lt;s:doubleselect\u0026gt;\u0026nbsp;示例 \u003c/h2\u003e \n\u003cp\u003e 在一個完整的例子,例如\u0026lt;S:doubleselect\u0026gt;標籤,表示使用OGNL或Java列出數據來填充到下拉列表中。 \u003c/p\u003e \n\u003ch2\u003e 1. Action \u003c/h2\u003e \n\u003cp\u003e Action類來生成兩個下拉列表。\u003cbr\u003e \u003cstrong\u003eDoubleSelectAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.Arrays;\r\nimport java.util.HashMap;\r\nimport java.util.Map;\r\nimport java.util.Set;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class DoubleSelectAction extends ActionSupport{\r\n\r\n\tprivate String fruit1;\r\n\tprivate String fruit2;\r\n\t\r\n\tprivate String server1;\r\n\tprivate String server2;\r\n\t\r\n\tprivate String language1;\r\n\tprivate String language2;\r\n\t\r\n\tMap languageMap;\r\n\r\n\tpublic String getFruit1() {\r\n\t\treturn fruit1;\r\n\t}\r\n\r\n\tpublic void setFruit1(String fruit1) {\r\n\t\tthis.fruit1 = fruit1;\r\n\t}\r\n\r\n\tpublic String getFruit2() {\r\n\t\treturn fruit2;\r\n\t}\r\n\r\n\tpublic void setFruit2(String fruit2) {\r\n\t\tthis.fruit2 = fruit2;\r\n\t}\r\n\r\n\tpublic String getServer1() {\r\n\t\treturn server1;\r\n\t}\r\n\r\n\tpublic void setServer1(String server1) {\r\n\t\tthis.server1 = server1;\r\n\t}\r\n\r\n\tpublic String getServer2() {\r\n\t\treturn server2;\r\n\t}\r\n\r\n\tpublic void setServer2(String server2) {\r\n\t\tthis.server2 = server2;\r\n\t}\r\n\r\n\tpublic String getLanguage1() {\r\n\t\treturn language1;\r\n\t}\r\n\r\n\tpublic void setLanguage1(String language1) {\r\n\t\tthis.language1 = language1;\r\n\t}\r\n\r\n\tpublic String getLanguage2() {\r\n\t\treturn language2;\r\n\t}\r\n\r\n\tpublic void setLanguage2(String language2) {\r\n\t\tthis.language2 = language2;\r\n\t}\r\n\r\n\tpublic Map getLanguageMap() {\r\n\t\treturn languageMap;\r\n\t}\r\n\r\n\tpublic void setLanguageMap(Map languageMap) {\r\n\t\tthis.languageMap = languageMap;\r\n\t}\r\n\r\n\tpublic DoubleSelectAction(){\r\n\t languageMap =new HashMap();\t\t\r\n\t\t\r\n languageMap.put(\"Java\", \r\n new ArrayList\u0026lt;String\u0026gt;(Arrays.asList(\"Spring\", \"Hibernate\", \"Struts 2\")));\r\n languageMap.put(\".Net\", new ArrayList\u0026lt;String\u0026gt;(Arrays.asList(\"VB.Net\", \"C#\")));\r\n languageMap.put(\"JavaScript\", new ArrayList\u0026lt;String\u0026gt;(Arrays.asList(\"jQuery\")));\r\n\t}\r\n\r\n\tpublic String execute() {\r\n\t\treturn SUCCESS;\r\n\t}\r\n\t\r\n\tpublic String display() {\r\n\t\treturn NONE;\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. 結果頁面 \u003c/h2\u003e \n\u003cp\u003e 渲染兩個下拉下拉框,通過「\u0026lt;s:doubleselect\u0026gt;」標籤,並通過Java列表,OGNL列表填充 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003edoubleselect.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2 \u0026lt;s:doubleselect\u0026gt; 示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:form action=\"resultAction\" namespace=\"/\"\u0026gt;\r\n\r\n\u0026lt;s:doubleselect label=\"Fruits (OGNL) \" \r\nname=\"fruit1\" list=\"{'fruit','meat'}\" \r\ndoubleName=\"fruit2\" \r\ndoubleList=\"top == 'fruit' ? {'apple', 'orange','banana'} : {'chicken', 'pig'}\" /\u0026gt;\r\n\r\n\u0026lt;s:set name=\"serverList\" \r\n value=\"#{\r\n 'AppServer': {'Apache', 'Tomcat', 'JBoss'},\r\n 'Database': {'Oracle', 'MySQL'}\r\n }\" /\u0026gt;\r\n\u0026lt;s:doubleselect label=\"Server (OGNL) \" \r\nname=\"server1\" list=\"#serverList.keySet()\" \r\ndoubleName=\"server2\" doubleList=\"#serverList[top]\" /\u0026gt;\r\n\r\n\u0026lt;s:doubleselect label=\"Language (Java List) \" \r\nname=\"language1\" list=\"languageMap.keySet()\" \r\ndoubleName=\"language2\" doubleList=\"languageMap.get(top)\" /\u0026gt;\r\n\r\n\u0026lt;s:submit value=\"submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eresult.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2 \u0026lt;s:doubleselect\u0026gt; 示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n Test #1 : \u0026lt;s:property value=\"fruit1\"/\u0026gt; , \u0026lt;s:property value=\"fruit2\"/\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;h2\u0026gt;\r\n Test #2 : \u0026lt;s:property value=\"server1\"/\u0026gt; , \u0026lt;s:property value=\"server2\"/\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;h2\u0026gt;\r\n Test #2 : \u0026lt;s:property value=\"language1\"/\u0026gt; , \u0026lt;s:property value=\"language2\"/\u0026gt;\r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \t\r\n\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"doubleSelectAction\" \r\n class=\"com.yiibai.common.action.DoubleSelectAction\" method=\"display\"\u0026gt;\r\n\t\u0026lt;result name=\"none\"\u0026gt;/pages/doubleselect.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"resultAction\" class=\"com.yiibai.common.action.DoubleSelectAction\"\u0026gt;\r\n\t\u0026lt;result name=\"success\"\u0026gt;/pages/result.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. 示例 \u003c/h2\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/strut2sdoubleselect/doubleSelectAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/doubleselect-2.png\" alt=\"Struts2 \u003cs:doubleselect\u003e示例\"\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/strut2sdoubleselect/resultAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/doubleselect-3.png\" alt=\"Struts2 \u003cs:doubleselect\u003e示例\"\u003e \n\u003c/div\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/doubleselect.html\"\u003eStruts 2 關聯選擇框文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e Struts 2 \u0026lt;s:select\u0026gt; 示例 \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e 代碼下載: \n\u003ca href=\"http://pan.baidu.com/s/1hqm8Zje\"\u003ehttp://pan.baidu.com/s/1hqm8Zje\u003c/a\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"d6:T1c6c,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 在Struts2,\u0026lt;s:updownselect\u0026gt;標籤用於創建一個帶有按鈕的HTML選擇組件向上或向下移動在選擇組件的選項。當提交表單時,所有的選擇方案將提交在它們的排列順序。 \u003c/p\u003e \n\u003cp\u003e \u003cspan\u003e這裏創建一個Web工程:strut2\u003cspan\u003eupdownselect\u003c/span\u003e,來演示\u003c/span\u003e\u003cspan\u003e在多個複選框\u003c/span\u003e\u003cspan\u003e如何設置的默認值,整個項目的結構如下圖所示:\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/updownselect-1.png\" alt=\"Struts2 \u003cs:updownselect\u003e示例\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003e\u0026lt;s:updownselect\u0026gt; 示例\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:updownselect\r\nlist=\"#{'KFC':'KFC', 'McDonald':'McDonald', 'Burger King':'Burger King',\r\n'Pizza Hut':'Pizza Hut', 'Fat Boy King':'Fat Boy King'}\"\r\nname=\"favFastFood\"\r\nheaderKey=\"-1\"\r\nheaderValue=\"--- Please Order ---\" \r\nsize=\"7\"\r\n/\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 產生下面的HTML代碼,選擇組件,按鈕和JavaScript在選擇組件向下移動的選項。 (默認的XHTML主題) \u003c/p\u003e \n\u003cpre\u003e\u0026lt;tr\u0026gt; \r\n\u0026lt;td class=\"tdLabel\"\u0026gt;\u0026lt;/td\u0026gt; \r\n\u0026lt;td\u0026gt;\u0026lt;script type=\"text/javascript\" src=\"/Struts2Example/struts/optiontransferselect.js\"\u0026gt;\r\n\u0026lt;/script\u0026gt; \r\n\u0026lt;table\u0026gt; \r\n\u0026lt;tr\u0026gt;\u0026lt;td\u0026gt; \r\n\u0026lt;select name=\"favFastFood\" size=\"7\" \r\nid=\"resultAction_favFastFood\" multiple=\"multiple\"\u0026gt; \r\n \u0026lt;option value=\"-1\"\u0026gt;--- Please Order ---\u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"KFC\"\u0026gt;KFC\u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"McDonald\"\u0026gt;McDonald\u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"Burger King\"\u0026gt;Burger King\u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"Pizza Hut\"\u0026gt;Pizza Hut\u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"Fat Boy King\"\u0026gt;Fat Boy King\u0026lt;/option\u0026gt; \r\n\u0026lt;/select\u0026gt; \r\n\u0026lt;input type=\"hidden\" id=\"__multiselect_resultAction_favFastFood\" \r\nname=\"__multiselect_favFastFood\" value=\"\" /\u0026gt; \r\n\u0026lt;/td\u0026gt;\u0026lt;/tr\u0026gt; \r\n\u0026lt;tr\u0026gt;\u0026lt;td\u0026gt; \r\n\u0026nbsp;\u0026lt;input type=\"button\" value=\"^\" onclick=\"\r\nmoveOptionUp(document.getElementById('resultAction_favFastFood'), 'key', '-1');\" /\u0026gt;\r\n\r\n\u0026nbsp;\u0026lt;input type=\"button\" value=\"v\" onclick=\"\r\nmoveOptionDown(document.getElementById('resultAction_favFastFood'), 'key', '-1');\" /\u0026gt;\r\n\r\n\u0026nbsp;\u0026lt;input type=\"button\" value=\"*\" onclick=\"selectAllOptionsExceptSome(\r\ndocument.getElementById('resultAction_favFastFood'), 'key', '-1');\" /\u0026gt;\r\n\u0026lt;/td\u0026gt;\u0026lt;/tr\u0026gt; \r\n\u0026lt;/table\u0026gt;\u0026lt;/td\u0026gt; \r\n\u0026lt;/tr\u0026gt; \r\n\u0026lt;script type=\"text/javascript\"\u0026gt; \r\n \r\nvar containingForm = document.getElementById(\"resultAction\");\r\nStrutsUtils.addEventListener(containingForm, \"submit\", \r\n function(evt) {\r\n var updownselectObj = document.getElementById(\"resultAction_favFastFood\");\r\n selectAllOptionsExceptSome(updownselectObj, \"key\", \"-1\");\r\n }, true);\r\n\u0026lt;/script\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e Struts2 \u0026lt;s:updownselect\u0026gt; 示例 \u003c/h2\u003e \n\u003cp\u003e 在一個完整的全面\u0026lt;s:updownselect\u0026gt;標籤例子來說明如何使用OGNL和Java列出的數據填充到上下按鈕選擇列表。 \u003c/p\u003e \n\u003ch2\u003e 1. 動作類 - Action \u003c/h2\u003e \n\u003cp\u003e Action類來生成和存儲選擇選項。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eUpDownSelectAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class UpDownSelectAction extends ActionSupport{\r\n\r\n\tprivate List\u0026lt;String\u0026gt; moviesList = new ArrayList\u0026lt;String\u0026gt;();\r\n\r\n\tprivate String favMovie;\r\n\tprivate String favFastFood;\r\n\r\n\tpublic UpDownSelectAction(){\r\n\t\t\r\n\t\tmoviesList.add(\"Spider Man\");\r\n\t\tmoviesList.add(\"Matrix\");\r\n\t\tmoviesList.add(\"Super Man\");\r\n\t\tmoviesList.add(\"Dark Knight\");\r\n\t\tmoviesList.add(\"BraveHeart\");\r\n\t\tmoviesList.add(\"Ultraman\");\r\n\t\t\r\n\t}\r\n\t\r\n\tpublic String getFavFastFood() {\r\n\t\treturn favFastFood;\r\n\t}\r\n\r\n\tpublic void setFavFastFood(String favFastFood) {\r\n\t\tthis.favFastFood = favFastFood;\r\n\t}\r\n\r\n\tpublic List\u0026lt;String\u0026gt; getMoviesList() {\r\n\t\treturn moviesList;\r\n\t}\r\n\r\n\tpublic void setMoviesList(List\u0026lt;String\u0026gt; moviesList) {\r\n\t\tthis.moviesList = moviesList;\r\n\t}\r\n\r\n\tpublic String getFavMovie() {\r\n\t\treturn favMovie;\r\n\t}\r\n\r\n\tpublic void setFavMovie(String favMovie) {\r\n\t\tthis.favMovie = favMovie;\r\n\t}\r\n\r\n\tpublic String execute() throws Exception{\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t}\r\n\r\n\tpublic String display() {\r\n\t\treturn NONE;\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. 結果頁面 \u003c/h2\u003e \n\u003cp\u003e 通過「\u0026lt;s:updownselect\u0026gt;」渲染上下按鈕選擇組件標籤。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eupdownselect.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;s:head /\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 updownselect example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:form action=\"resultAction\" namespace=\"/\" method=\"POST\" \u0026gt;\r\n\r\n\u0026lt;s:updownselect\r\nlist=\"#{'KFC':'KFC', 'McDonald':'McDonald', 'Burger King':'Burger King',\r\n'Pizza Hut':'Pizza Hut', 'Fat Boy King':'Fat Boy King'}\"\r\nname=\"favFastFood\"\r\nheaderKey=\"-1\"\r\nheaderValue=\"--- Please Order ---\" \r\nsize=\"7\"\r\n/\u0026gt;\r\n\r\n\u0026lt;s:updownselect\r\nlist=\"moviesList\"\r\nname=\"favMovie\"\r\nheaderKey=\"-1\"\r\nheaderValue=\"--- Please Order ---\"\r\nsize=\"10\"\r\nmoveUpLabel=\"Move Up\"\r\nmoveDownLabel=\"Move Down\"\r\nselectAllLabel=\"Select All\" /\u0026gt;\r\n\r\n\u0026lt;s:submit value=\"submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eresult.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 updownselect example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n Favor fast food : \u0026lt;s:property value=\"favFastFood\"/\u0026gt; \r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;h2\u0026gt;\r\n Favor movies : \u0026lt;s:property value=\"favMovie\"/\u0026gt; \r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\r\n \u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"updownSelectAction\" \r\n class=\"com.yiibai.common.action.UpDownSelectAction\" method=\"display\"\u0026gt;\r\n \u0026lt;result name=\"none\"\u0026gt;pages/updownselect.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"resultAction\" class=\"com.yiibai.common.action.UpDownSelectAction\" \u0026gt;\r\n \u0026lt;result name=\"success\"\u0026gt;pages/result.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/Struts2Example/updownSelectAction.action\u003c/em\u003e\u003cbr\u003e 選擇選項,將其向上或向下。 \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/updownselect-2.png\" alt=\"Struts2 \u003cs:updownselect\u003e示例\"\u003e \n\u003c/div\u003e \n\u003cp\u003e 當提交後,所有的選項都將在它們的排列順序\u003cspan\u003e提交\u003c/span\u003e。 \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/updownselect-3.png\" alt=\"Struts2 \u003cs:updownselect\u003e示例\"\u003e \n\u003c/div\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/updownselect.html\"\u003eStruts 2 updownselect example\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e http://www.yiibai.com/struts_2/struts-2-sdoubleselect-example.html \u003c/li\u003e \n\u003c/ol\u003e \n\u003cbr\u003e 代碼下載: \n\u003ca href=\"http://pan.baidu.com/s/1hqtuAdY\"\u003ehttp://pan.baidu.com/s/1hqtuAdY\u003c/a\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"d7:T2b98,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 在Struts2中,選項選擇組件是兩個「updownselect」選擇部件在左,右側對齊,在它們中間,包含按鈕來移動自己的選擇選項。通過\u0026lt;s:optiontransferselect\u0026gt;標籤這可以創建。 \u003c/p\u003e \n\u003cp\u003e 這裏創建一個Web工程:strut2updownselect,來演示在多個複選框如何設置的默認值,整個項目的結構如下圖所示: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/optiontransferselect-1.png\" alt=\"Struts2 \u003cs:optiontransferselect\u003e示例\"\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:optiontransferselect\r\n label=\"Lucky Numbers\"\r\n name=\"leftNumber\"\r\n list=\"{'1 - One ', '2 - Two', '3 - Three', '4 - Four', '5 - Five'}\"\r\n doubleName=\"rightNumber\"\r\n doubleList=\"{'10 - Ten','20 - Twenty','30 - Thirty','40 - Forty','50 - Fifty'}\"\r\n /\u0026gt;\u003c/pre\u003e \n\u003cdiv class=\"note\"\u003e\n 「name」和「list」是指向左選擇組件;而「doubleName」和「doubleList」是指在正確的選擇組。 \n\u003c/div\u003e \n\u003cp\u003e 產生下面的HTML,兩個「updownselect」組件,按鈕和JavaScript來自己動(默認的XHTML主題)之間的選擇選項。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;tr\u0026gt; \r\n\u0026lt;td class=\"tdLabel\"\u0026gt;\r\n\u0026lt;label for=\"resultAction_leftNumber\" class=\"label\"\u0026gt;Lucky Numbers:\u0026lt;/label\u0026gt;\r\n\u0026lt;/td\u0026gt; \r\n\u0026lt;td\u0026gt;\r\n\u0026lt;script type=\"text/javascript\" src=\"/Struts2Example/struts/optiontransferselect.js\"\u0026gt;\r\n\u0026lt;/script\u0026gt; \r\n\u0026lt;table border=\"0\"\u0026gt; \r\n\u0026lt;tr\u0026gt; \r\n\u0026lt;td\u0026gt; \r\n\u0026lt;select name=\"leftNumber\" size=\"15\" \r\nid=\"resultAction_leftNumber\" multiple=\"multiple\"\u0026gt; \r\n \u0026lt;option value=\"1 - One \"\u0026gt;1 - One \u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"2 - Two\"\u0026gt;2 - Two\u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"3 - Three\"\u0026gt;3 - Three\u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"4 - Four\"\u0026gt;4 - Four\u0026lt;/option\u0026gt; \r\n \u0026lt;option value=\"5 - Five\"\u0026gt;5 - Five\u0026lt;/option\u0026gt; \r\n\u0026lt;/select\u0026gt; \r\n\u0026lt;input type=\"hidden\" id=\"__multiselect_resultAction_leftNumber\" \r\nname=\"__multiselect_leftNumber\" value=\"\" /\u0026gt; \r\n\u0026lt;input type=\"button\"\r\n\tonclick=\"moveOptionDown(\r\n document.getElementById('resultAction_leftNumber'), 'key', '');\"\r\n\tvalue=\"v\"\r\n/\u0026gt; \r\n\u0026lt;input type=\"button\"\r\n\tonclick=\"moveOptionUp(\r\n document.getElementById('resultAction_leftNumber'), 'key', '');\"\r\n\tvalue=\"^\"\r\n/\u0026gt; \r\n\u0026lt;/td\u0026gt; \r\n\u0026lt;td valign=\"middle\" align=\"center\"\u0026gt; \r\n\u0026lt;input type=\"button\"\r\n value=\"\u0026lt;-\" onclick=\"moveSelectedOptions(\r\n document.getElementById('resultAction_rightNumber'), \r\n document.getElementById('resultAction_leftNumber'), false, '');\" /\u0026gt;\r\n\u0026lt;input type=\"button\"\r\n value=\"-\u0026gt;\" onclick=\"moveSelectedOptions(\r\n document.getElementById('resultAction_leftNumber'), \r\n document.getElementById('resultAction_rightNumber'), false, '');\" /\u0026gt; \r\n\u0026lt;input type=\"button\"\r\n value=\"\u0026lt;\u0026lt;--\" onclick=\"moveAllOptions(\r\n document.getElementById('resultAction_rightNumber'), \r\n document.getElementById('resultAction_leftNumber'), false, '');\" /\u0026gt;\r\n\u0026lt;input type=\"button\"\r\n value=\"--\u0026gt;\u0026gt;\" onclick=\"moveAllOptions(\r\n document.getElementById('resultAction_leftNumber'), \r\n document.getElementById('resultAction_rightNumber'), false, '');\" /\u0026gt;\r\n\u0026lt;input type=\"button\"\r\n value=\"\u0026lt;*\u0026gt;\" onclick=\"selectAllOptions(\r\n document.getElementById('resultAction_leftNumber'));\r\n selectAllOptions(document.getElementById('resultAction_rightNumber'));\" /\u0026gt;\r\n\u0026lt;/td\u0026gt; \r\n\u0026lt;td\u0026gt; \r\n\u0026lt;select \r\n\tname=\"rightNumber\"\r\n\tsize=\"15\"\r\n\tmultiple=\"multiple\"\r\n\tid=\"resultAction_rightNumber\"\r\n\u0026gt; \r\n \t\u0026lt;option value=\"10 - Ten\"\u0026gt;10 - Ten\u0026lt;/option\u0026gt; \r\n \t\u0026lt;option value=\"20 - Twenty\"\u0026gt;20 - Twenty\u0026lt;/option\u0026gt; \r\n \t\u0026lt;option value=\"30 - Thirty\"\u0026gt;30 - Thirty\u0026lt;/option\u0026gt; \r\n \t\u0026lt;option value=\"40 - Forty\"\u0026gt;40 - Forty\u0026lt;/option\u0026gt; \r\n \t\u0026lt;option value=\"50 - Fifty\"\u0026gt;50 - Fifty\u0026lt;/option\u0026gt; \r\n\u0026lt;/select\u0026gt; \r\n\u0026lt;input type=\"hidden\" id=\"__multiselect_resultAction_rightNumber\" \r\nname=\"__multiselect_rightNumber\" value=\"\" /\u0026gt; \r\n\u0026lt;input type=\"button\"\r\n onclick=\"moveOptionDown(\r\n document.getElementById('resultAction_rightNumber'), 'key', '');\"\r\n value=\"v\"\r\n/\u0026gt; \r\n\u0026lt;input type=\"button\"\r\n onclick=\"moveOptionUp(\r\n document.getElementById('resultAction_rightNumber'), 'key', '');\"\r\n value=\"^\"\r\n/\u0026gt; \r\n\u0026lt;/td\u0026gt; \r\n\u0026lt;/tr\u0026gt; \r\n\u0026lt;/table\u0026gt; \r\n\r\n\u0026lt;script type=\"text/javascript\"\u0026gt; \r\nvar containingForm = document.getElementById(\"resultAction\");\r\nStrutsUtils.addEventListener(containingForm, \"submit\", \r\n function(evt) {\r\n\tvar selectObj = document.getElementById(\"resultAction_leftNumber\");\r\n\t\tselectAllOptionsExceptSome(selectObj, \"key\", \"\");\r\n }, true);\r\nvar containingForm = document.getElementById(\"resultAction\");\r\nStrutsUtils.addEventListener(containingForm, \"submit\", \r\n function(evt) {\r\n\tvar selectObj = document.getElementById(\"resultAction_rightNumber\");\r\n\t\tselectAllOptionsExceptSome(selectObj, \"key\", \"\");\r\n\t}, true);\r\n\u0026lt;/script\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e Struts2 \u0026lt;s:optiontransferselect\u0026gt; 示例 \u003c/h2\u003e \n\u003cp\u003e 一個完整的全面的 \u0026lt;s:optiontransferselect\u0026gt; 標籤例子,表明使用OGNL和Java列出來填充數據到「選項中選擇轉移」的組件。 \u003c/p\u003e \n\u003ch2\u003e 1. 動作類 \u003c/h2\u003e \n\u003cp\u003e Action類來生成並存儲左右選擇選項。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eOptionTransferSelectAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class OptionTransferSelectAction extends ActionSupport{\r\n\r\n\tprivate List\u0026lt;String\u0026gt; leftAntivirusList = new ArrayList\u0026lt;String\u0026gt;();\r\n\tprivate List\u0026lt;String\u0026gt; rightAntivirusList = new ArrayList\u0026lt;String\u0026gt;();\r\n\r\n\tprivate String leftAntivirus;\r\n\tprivate String rightAntivirus;\r\n\r\n\tprivate String leftNumber;\r\n\tprivate String rightNumber;\r\n\t\r\n\tpublic OptionTransferSelectAction(){\r\n\t\t\r\n\t\tleftAntivirusList.add(\"Norton 360 Version 4.0\");\r\n\t\tleftAntivirusList.add(\"McAfee Total Protection 2010\");\r\n\t\tleftAntivirusList.add(\"Trend Micro IS Pro 2010\");\r\n\t\tleftAntivirusList.add(\"BitDefender Total Security 2010\");\r\n\r\n\t\trightAntivirusList.add(\"Norton Internet Security 2010\");\r\n\t\trightAntivirusList.add(\"Kaspersky Internet Security 2010\");\r\n\t\trightAntivirusList.add(\"McAfee Internet Security 2010\");\r\n\t\trightAntivirusList.add(\"AVG Internet Security 2010\");\r\n\t\trightAntivirusList.add(\"Trend Micro Internet Security 2010\");\r\n\t\trightAntivirusList.add(\"F-Secure Internet Security 2010\");\r\n\t\t\r\n\t}\r\n\t\r\n\tpublic String getLeftNumber() {\r\n\t\treturn leftNumber;\r\n\t}\r\n\r\n\tpublic void setLeftNumber(String leftNumber) {\r\n\t\tthis.leftNumber = leftNumber;\r\n\t}\r\n\r\n\tpublic String getRightNumber() {\r\n\t\treturn rightNumber;\r\n\t}\r\n\r\n\tpublic void setRightNumber(String rightNumber) {\r\n\t\tthis.rightNumber = rightNumber;\r\n\t}\r\n\r\n\tpublic List\u0026lt;String\u0026gt; getLeftAntivirusList() {\r\n\t\treturn leftAntivirusList;\r\n\t}\r\n\r\n\tpublic void setLeftAntivirusList(List\u0026lt;String\u0026gt; leftAntivirusList) {\r\n\t\tthis.leftAntivirusList = leftAntivirusList;\r\n\t}\r\n\r\n\tpublic List\u0026lt;String\u0026gt; getRightAntivirusList() {\r\n\t\treturn rightAntivirusList;\r\n\t}\r\n\r\n\tpublic void setRightAntivirusList(List\u0026lt;String\u0026gt; rightAntivirusList) {\r\n\t\tthis.rightAntivirusList = rightAntivirusList;\r\n\t}\r\n\r\n\tpublic String getLeftAntivirus() {\r\n\t\treturn leftAntivirus;\r\n\t}\r\n\r\n\tpublic void setLeftAntivirus(String leftAntivirus) {\r\n\t\tthis.leftAntivirus = leftAntivirus;\r\n\t}\r\n\r\n\tpublic String getRightAntivirus() {\r\n\t\treturn rightAntivirus;\r\n\t}\r\n\r\n\tpublic void setRightAntivirus(String rightAntivirus) {\r\n\t\tthis.rightAntivirus = rightAntivirus;\r\n\t}\r\n\r\n\tpublic String execute() throws Exception{\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t}\r\n\r\n\tpublic String display() {\r\n\t\treturn NONE;\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. 結果頁面 \u003c/h2\u003e \n\u003cp\u003e 通過「\u0026lt;s:optiontransferselect\u0026gt;」選項轉移選擇組件標籤渲染,並通過Java和OGNL列表產生左側和右側選擇選項。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eoptiontransferselect.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;s:head /\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 optiontransferselect 示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:form action=\"resultAction\" namespace=\"/\" method=\"POST\" \u0026gt;\r\n\r\n\u0026lt;s:optiontransferselect\r\n label=\"Lucky Numbers\"\r\n name=\"leftNumber\"\r\n list=\"{'1 - One ', '2 - Two', '3 - Three', '4 - Four', '5 - Five'}\"\r\n doubleName=\"rightNumber\"\r\n doubleList=\"{'10 - Ten','20 - Twenty','30 - Thirty','40 - Forty','50 - Fifty'}\"\r\n /\u0026gt;\r\n\t\r\n\u0026lt;s:optiontransferselect\r\n label=\"Favourite Antivirus\"\r\n name=\"leftAntivirus\"\r\n leftTitle=\"Left Antivirus Title\"\r\n rightTitle=\"Right Antivirus Title\"\r\n list=\"leftAntivirusList\"\r\n multiple=\"true\"\r\n headerKey=\"-1\"\r\n headerValue=\"--- Please Select ---\"\r\n doubleList=\"rightAntivirusList\"\r\n doubleName=\"rightAntivirus\"\r\n doubleHeaderKey=\"-1\"\r\n doubleHeaderValue=\"--- Please Select ---\"\r\n /\u0026gt;\r\n \r\n\u0026lt;s:submit value=\"submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eresult.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 optiontransferselect example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n Left AntiVirus : \u0026lt;s:property value=\"leftAntivirus\"/\u0026gt; \r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;h2\u0026gt;\r\n Right AntiVirus : \u0026lt;s:property value=\"rightAntivirus\"/\u0026gt; \r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;h2\u0026gt;\r\n Left Numbers : \u0026lt;s:property value=\"leftNumber\"/\u0026gt; \r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;h2\u0026gt;\r\n Right Numbers : \u0026lt;s:property value=\"rightNumber\"/\u0026gt; \r\n\u0026lt;/h2\u0026gt; \r\n\t\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\r\n\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"optionTransferSelectAction\" \r\n\tclass=\"com.yiibai.common.action.OptionTransferSelectAction\" \r\n method=\"display\"\u0026gt;\r\n\t\u0026lt;result name=\"none\"\u0026gt;/pages/optiontransferselect.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"resultAction\" \r\n class=\"com.yiibai.common.action.OptionTransferSelectAction\" \u0026gt;\r\n\t\u0026lt;result name=\"success\"\u0026gt;/pages/result.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 實例 \u003c/h2\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/struts2optiontransferselect/optionTransferSelectAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/optiontransferselect-2.png\" alt=\"Struts2 \u003cs:optiontransferselect\u003e示例\"\u003e \n\u003c/div\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/optiontransferselect-3.png\" alt=\"Struts2 \u003cs:optiontransferselect\u003e示例\"\u003e \n\u003c/div\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/updownselect.html\"\u003eStruts 2 updownselect 文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e Struts 2 updownselect 示例 \u003c/li\u003e \n \u003cli\u003e Struts 2 doubleselect 示例 \u003c/li\u003e \n\u003c/ol\u003e \n\u003cbr\u003e 代碼下載: \n\u003ca href=\"http://pan.baidu.com/s/1qW5p8lu\"\u003ehttp://pan.baidu.com/s/1qW5p8lu\u003c/a\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"d8:T1cbd,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 在Struts2,dojo ajax標籤「\u0026lt;sx:datetimepicker\u0026gt;」將呈現一個文本框和追加後面的日曆圖標,點擊日曆圖標會提示的日期時間選擇器組件。 \u003c/p\u003e \n\u003cp\u003e \u003cspan\u003e這裏創建一個Web工程:strut2\u003cspan\u003edatetimepicker\u003c/span\u003e,來演示\u003c/span\u003e\u003cspan\u003e在多個複選框\u003c/span\u003e\u003cspan\u003e如何設置的默認值,整個項目的結構如下圖所示:\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/datetimepicker-1.png\" alt=\"Struts2 \u003csx:datetimepicker\u003e示例\"\u003e \u003c/p\u003e \n\u003cp\u003e 要創建一個日期時間接組成部分,確保:\u003cbr\u003e 1. 下載 struts2-dojo-plugin.jar 庫(myeclipse中在增加struts2時,打上這個選項就可以了)\u003cbr\u003e 2. 包括「struts-dojo-tags」標籤,並輸出它的頭。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"sx\" uri=\"/struts-dojo-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;sx:head /\u0026gt;\r\n\u0026lt;/head\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 例如: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"sx\" uri=\"/struts-dojo-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;sx:head /\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;sx:datetimepicker name=\"date2\" label=\"Format (dd-MMM-yyyy)\" \r\ndisplayFormat=\"dd-MMM-yyyy\" value=\"%{'2010-01-01'}\"/\u0026gt;\r\n...\u003c/pre\u003e \n\u003cp\u003e 產生下面的HTML,一些Dojo和JavaScript庫創建日期和時間接組件。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;html\u0026gt; \r\n\u0026lt;head\u0026gt; \r\n\u0026lt;script language=\"JavaScript\" type=\"text/javascript\"\u0026gt; \r\n // Dojo configuration\r\n djConfig = {\r\n isDebug: false,\r\n bindEncoding: \"UTF-8\"\r\n ,baseRelativePath: \"/Struts2Example/struts/dojo/\"\r\n ,baseScriptUri: \"/Struts2Example/struts/dojo/\"\r\n ,parseWidgets : false\r\n };\r\n\u0026lt;/script\u0026gt; \r\n\u0026lt;script language=\"JavaScript\" type=\"text/javascript\"\r\n src=\"/Struts2Example/struts/dojo/struts_dojo.js\"\u0026gt;\u0026lt;/script\u0026gt; \r\n\r\n\u0026lt;script language=\"JavaScript\" type=\"text/javascript\"\r\n src=\"/Struts2Example/struts/ajax/dojoRequire.js\"\u0026gt;\u0026lt;/script\u0026gt; \r\n\r\n\u0026lt;link rel=\"stylesheet\" href=\"/Struts2Example/struts/xhtml/styles.css\" type=\"text/css\"/\u0026gt; \r\n\r\n\u0026lt;script language=\"JavaScript\" src=\"/Struts2Example/struts/utils.js\" \r\ntype=\"text/javascript\"\u0026gt;\u0026lt;/script\u0026gt; \r\n\r\n\u0026lt;script language=\"JavaScript\" src=\"/Struts2Example/struts/xhtml/validation.js\" \r\ntype=\"text/javascript\"\u0026gt;\u0026lt;/script\u0026gt; \r\n\r\n\u0026lt;script language=\"JavaScript\" src=\"/Struts2Example/struts/css_xhtml/validation.js\" \r\ntype=\"text/javascript\"\u0026gt;\u0026lt;/script\u0026gt; \r\n\u0026lt;/head\u0026gt; \r\n...\r\n\u0026lt;td class=\"tdLabel\"\u0026gt;\r\n\u0026lt;label for=\"widget_1291193434\" class=\"label\"\u0026gt;Format (dd-MMM-yyyy):\r\n\u0026lt;/label\u0026gt;\u0026lt;/td\u0026gt; \r\n\u0026lt;td\u0026gt;\r\n\u0026lt;div dojoType=\"struts:StrutsDatePicker\" id=\"widget_1291193434\" \r\nvalue=\"2010-01-01\" name=\"date2\" inputName=\"dojo.date2\" \r\ndisplayFormat=\"dd-MMM-yyyy\" saveFormat=\"rfc\"\u0026gt;\u0026lt;/div\u0026gt; \r\n\u0026lt;/td\u0026gt; \r\n\u0026lt;/tr\u0026gt; \r\n\u0026lt;script language=\"JavaScript\" type=\"text/javascript\"\u0026gt;\r\ndjConfig.searchIds.push(\"widget_1291193434\");\u0026lt;/script\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e Struts2 \u0026lt;s:datetimepicker\u0026gt; 示例 \u003c/h2\u003e \n\u003cp\u003e 在一個完整的全面\u0026lt;s:datetimepicker\u0026gt;標籤例子來生成一個DateTimePicker控件,並展示了使用OGNL和Java屬性的默認日期設置爲「DateTimePicker」組件。 \u003c/p\u003e \n\u003ch2\u003e 2. 動作類 \u003c/h2\u003e \n\u003cp\u003e Action類存儲選擇的日期。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eDateTimePickerAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.util.Date;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class DateTimePickerAction extends ActionSupport{\r\n\r\n\tprivate Date date1;\r\n\tprivate Date date2;\r\n\tprivate Date date3;\r\n\t\r\n\t//return today date\r\n\tpublic Date getTodayDate(){\r\n\t\t\r\n\t\treturn new Date();\r\n\t}\r\n\r\n\t//getter and setter methods\r\n\tpublic String execute() throws Exception{\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t}\r\n\r\n\tpublic String display() {\r\n\t\treturn NONE;\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 3. 結果頁面 \u003c/h2\u003e \n\u003cp\u003e 通過「\u0026lt;s:datetimepicker\u0026gt;」日期時間選擇器組件標籤渲染,通過Java屬性和OGNL設置默認日期。 \u003c/p\u003e \n\u003cdiv class=\"note\"\u003e\n 確保把「struts-dojo-tags」標籤,並渲染到\u0026lt;sx:head /\u0026gt; \n \u003cpre\u003e\u0026lt;%@ taglib prefix=\"sx\" uri=\"/struts-dojo-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;sx:head /\u0026gt;\r\n\u0026lt;/head\u0026gt;\u003c/pre\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003edatetimepicker.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"sx\" uri=\"/struts-dojo-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;sx:head /\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 datetimepicker example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:form action=\"resultAction\" namespace=\"/\" method=\"POST\" \u0026gt;\r\n\r\n\u0026lt;sx:datetimepicker name=\"date1\" label=\"Format (dd-MMM-yyyy)\" \r\ndisplayFormat=\"dd-MMM-yyyy\" value=\"todayDate\" /\u0026gt;\r\n\r\n\u0026lt;sx:datetimepicker name=\"date2\" label=\"Format (dd-MMM-yyyy)\" \r\ndisplayFormat=\"dd-MMM-yyyy\" value=\"%{'2010-01-01'}\"/\u0026gt;\r\n\r\n\u0026lt;sx:datetimepicker name=\"date3\" label=\"Format (dd-MMM-yyyy)\" \r\ndisplayFormat=\"dd-MMM-yyyy\" value=\"%{'today'}\"/\u0026gt;\r\n\r\n\u0026lt;s:submit value=\"submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eresult.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 datetimepicker example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n Date1 : \u0026lt;s:property value=\"date1\"/\u0026gt; \r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;h2\u0026gt;\r\n Date 2 : \u0026lt;s:property value=\"date2\"/\u0026gt; \r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;h2\u0026gt;\r\n Date 3 : \u0026lt;s:property value=\"date3\"/\u0026gt; \r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\r\n\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"dateTimePickerAction\" \r\n\tclass=\"com.yiibai.common.action.DateTimePickerAction\" \r\n method=\"display\"\u0026gt;\r\n\t\u0026lt;result name=\"none\"\u0026gt;/pages/datetimepicker.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"resultAction\" \r\n class=\"com.yiibai.common.action.DateTimePickerAction\" \u0026gt;\r\n\t\u0026lt;result name=\"success\"\u0026gt;/pages/result.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/strut2datetimepicker/dateTimePickerAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/datetimepicker-2.png\" alt=\"Struts2 \u003csx:datetimepicker\u003e示例\"\u003e \n\u003c/div\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/datetimepicker-3.png\" alt=\"Struts2 \u003csx:datetimepicker\u003e示例\"\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cspan\u003e注意:如果靜態文件未找到,或是不能打日期選擇,請下載代碼並參考其中的web.xml配置。\u003c/span\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/datetimepicker.html\"\u003eStruts 2 datetimepicker文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/ajax-and-javascript-recipes.html\"\u003eStruts 2 ajax and javascript recipes\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://www.unicode.org/reports/tr35/tr35-4.html#Date_Format_Patterns\"\u003eDate Format Pattern\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cbr\u003e 代碼下載: \n\u003ca href=\"http://pan.baidu.com/s/1c0ym4nu\"\u003ehttp://pan.baidu.com/s/1c0ym4nu\u003c/a\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"d9:T2067,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 在Struts2,\u0026lt;sx:autocompleter\u0026gt;標記是一個組合框,當在用戶輸入文本框會自動提示下拉的提示菜單。 \u003c/p\u003e \n\u003cp\u003e \u003cspan\u003e這裏創建一個Web工程:strut2\u003cspan\u003eautocompleter\u003c/span\u003e,來演示\u003c/span\u003e\u003cspan\u003e在多個複選框\u003c/span\u003e\u003cspan\u003e如何設置的默認值,整個項目的結構如下圖所示:\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/autocompleter-1.png\" alt=\"Struts2 \u003csx:autocompleter\u003e自動提示例子\"\u003e \u003c/p\u003e \n\u003cdiv class=\"note\"\u003e\n 這個功能是通過Dojo庫實現的,所以,一定要包含「struts2-dojo-plugin.jar」這個依賴庫,把「struts-dojo-tags」標籤上的頁面,並通過 \u0026lt;sx:head /\u0026gt;輸出其標題信息前。 \n\u003c/div\u003e \n\u003cp\u003e 例如, \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"sx\" uri=\"/struts-dojo-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;sx:head /\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;sx:autocompleter label=\"What's your lucky number?\" \r\nname=\"yourLuckyNumber\" autoComplete=\"false\"\r\nlist=\"{'1','12','13','14'}\" /\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 產生下面的HTML \u003c/p\u003e \n\u003cpre\u003e\u0026lt;html\u0026gt; \r\n\u0026lt;head\u0026gt; \r\n\u0026lt;script language=\"JavaScript\" type=\"text/javascript\"\u0026gt; \r\n // Dojo configuration\r\n djConfig = {\r\n isDebug: false,\r\n bindEncoding: \"UTF-8\"\r\n ,baseRelativePath: \"/Struts2Example/struts/dojo/\"\r\n ,baseScriptUri: \"/Struts2Example/struts/dojo/\"\r\n ,parseWidgets : false\r\n \r\n };\r\n\u0026lt;/script\u0026gt; \r\n\u0026lt;script language=\"JavaScript\" type=\"text/javascript\"\r\n src=\"/Struts2Example/struts/dojo/struts_dojo.js\"\u0026gt;\u0026lt;/script\u0026gt; \r\n\t\t\r\n\u0026lt;script language=\"JavaScript\" type=\"text/javascript\"\r\n src=\"/Struts2Example/struts/ajax/dojoRequire.js\"\u0026gt;\u0026lt;/script\u0026gt; \r\n\t\t\r\n\u0026lt;link rel=\"stylesheet\" href=\"/Struts2Example/struts/xhtml/styles.css\" \r\ntype=\"text/css\"/\u0026gt; \r\n\r\n\u0026lt;script language=\"JavaScript\" src=\"/Struts2Example/struts/utils.js\" \r\ntype=\"text/javascript\"\u0026gt;\u0026lt;/script\u0026gt; \r\n\r\n\u0026lt;script language=\"JavaScript\" src=\"/Struts2Example/struts/xhtml/validation.js\" \r\ntype=\"text/javascript\"\u0026gt;\u0026lt;/script\u0026gt; \r\n\r\n\u0026lt;script language=\"JavaScript\" src=\"/Struts2Example/struts/css_xhtml/validation.js\" \r\ntype=\"text/javascript\"\u0026gt;\u0026lt;/script\u0026gt; \r\n\u0026lt;/head\u0026gt; \r\n...\r\n\u0026lt;tr\u0026gt;\r\n\u0026lt;td class=\"tdLabel\"\u0026gt;\r\n\u0026lt;label for=\"resultAction_yourLuckyNumber\" class=\"label\"\u0026gt;\r\nWhat's your lucky number?:\u0026lt;/label\u0026gt;\u0026lt;/td\u0026gt;\r\n\u0026lt;td\u0026gt; \r\n\u0026lt;select dojoType=\"struts:ComboBox\" id=\"resultAction_yourLuckyNumber\" \r\nautoComplete=\"false\" name=\"yourLuckyNumber\" \r\nkeyName=\"yourLuckyNumberKey\" visibleDownArrow=\"true\" \u0026gt;\r\n \u0026lt;option value=\"1\"\u0026gt;1\u0026lt;/option\u0026gt;\r\n \u0026lt;option value=\"12\"\u0026gt;12\u0026lt;/option\u0026gt;\r\n \u0026lt;option value=\"13\"\u0026gt;13\u0026lt;/option\u0026gt;\r\n \u0026lt;option value=\"14\"\u0026gt;14\u0026lt;/option\u0026gt;\r\n\u0026lt;/select\u0026gt;\r\n\u0026lt;/td\u0026gt;\r\n\u0026lt;/tr\u0026gt;\r\n\u0026lt;script language=\"JavaScript\" type=\"text/javascript\"\u0026gt;\r\ndjConfig.searchIds.push(\"resultAction_yourLuckyNumber\");\u0026lt;/script\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e Struts2 \u0026lt;s:autocompleter\u0026gt; 示例 \u003c/h2\u003e \n\u003cp\u003e 在一個\u0026lt;s:autocompleter\u0026gt;標籤的完整的例子,產生下拉的提示菜單,同時在相應的文本框的用戶輸入。 \u003c/p\u003e \n\u003ch2\u003e 2. 動作類 \u003c/h2\u003e \n\u003cp\u003e Action類生成的Web框架的選項列表的「autocompleter」組成部分。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eAutoCompleterAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class AutoCompleterAction extends ActionSupport{\r\n\r\n\tprivate List\u0026lt;String\u0026gt; webframeworks = new ArrayList\u0026lt;String\u0026gt;();\r\n\t\r\n\tprivate String yourFavWebFramework;\r\n\tprivate String yourLuckyNumber;\r\n\t\r\n\tpublic AutoCompleterAction(){\r\n\t\twebframeworks.add(\"Spring MVC\");\r\n\t\twebframeworks.add(\"Struts 1.x\");\r\n\t\twebframeworks.add(\"Struts 2.x\");\r\n\t\twebframeworks.add(\"JavaServer Faces (JSF)\");\r\n\t\twebframeworks.add(\"Google Web Toolkit (GWT)\");\r\n\t\twebframeworks.add(\"Apache Wicket\");\r\n\t\twebframeworks.add(\"Apache Click\");\r\n\t\twebframeworks.add(\"Apache Cocoon\");\r\n\t\twebframeworks.add(\"JBoss Seam\");\r\n\t\twebframeworks.add(\"Stripes\");\r\n\t\twebframeworks.add(\"Apache Tapestry\");\r\n\t\twebframeworks.add(\"Others\");\r\n\t}\r\n\t\r\n\tpublic String getYourLuckyNumber() {\r\n\t\treturn yourLuckyNumber;\r\n\t}\r\n\r\n\tpublic void setYourLuckyNumber(String yourLuckyNumber) {\r\n\t\tthis.yourLuckyNumber = yourLuckyNumber;\r\n\t}\r\n\r\n\tpublic String getYourFavWebFramework() {\r\n\t\treturn yourFavWebFramework;\r\n\t}\r\n\r\n\tpublic void setYourFavWebFramework(String yourFavWebFramework) {\r\n\t\tthis.yourFavWebFramework = yourFavWebFramework;\r\n\t}\r\n\r\n\tpublic List\u0026lt;String\u0026gt; getWebframeworks() {\r\n\t\treturn webframeworks;\r\n\t}\r\n\r\n\tpublic void setWebframeworks(List\u0026lt;String\u0026gt; webframeworks) {\r\n\t\tthis.webframeworks = webframeworks;\r\n\t}\r\n\r\n\tpublic String display() {\r\n\t\treturn NONE;\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 3. 結果頁面 \u003c/h2\u003e \n\u003cp\u003e 通過「\u0026lt;s:autocompleter\u0026gt;」渲染「autocompleter」組件標籤,併產生通過Java列表和OGNL自動下拉提示菜單。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eautocompleter.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"sx\" uri=\"/struts-dojo-tags\" %\u0026gt;\r\n\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;sx:head /\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 autocompleter example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:form action=\"resultAction\" namespace=\"/\" method=\"POST\" \u0026gt;\r\n\r\n\u0026lt;sx:autocompleter label=\"What's your lucky number?\" \r\nname=\"yourLuckyNumber\" autoComplete=\"false\"\r\nlist=\"{'1','12','13','14','21','22','23','24',\r\n'31','32','33','34','41','42','43','44'}\" /\u0026gt;\r\n\r\n\u0026lt;sx:autocompleter label=\"What's your favorite web framework?\" \r\nlist=\"webframeworks\" name=\"yourFavWebFramework\" /\u0026gt;\r\n\r\n\u0026lt;s:submit value=\"submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eresult.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 autocompleter example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;\r\n Lucky Number : \u0026lt;s:property value=\"yourLuckyNumber\"/\u0026gt; \r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;h2\u0026gt;\r\n Web Appication Frameworks : \u0026lt;s:property value=\"yourFavWebFramework\"/\u0026gt; \r\n\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\r\n\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"autoCompleterAction\" \r\n\tclass=\"com.yiibai.common.action.AutoCompleterAction\" \r\n method=\"display\"\u0026gt;\r\n\t\u0026lt;result name=\"none\"\u0026gt;/pages/autocompleter.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"resultAction\" \r\n class=\"com.yiibai.common.action.AutoCompleterAction\" \u0026gt;\r\n\t\u0026lt;result name=\"success\"\u0026gt;/pages/result.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cspan\u003e注意:如果靜態文件未找到,或是不能打日期選擇,請下載代碼並參考其中的web.xml配置。\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cspan\u003e \u003c/span\u003e \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-xml\"\u003e \u0026lt;filter-mapping\u0026gt; \r\n \u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt; \r\n \u0026lt;url-pattern\u0026gt;/struts/*\u0026lt;/url-pattern\u0026gt; \r\n \u0026lt;/filter-mapping\u0026gt; \u003c/pre\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/Struts2Example/autoCompleterAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/autocompleter-2.png\" alt=\"Struts2 \u003csx:autocompleter\u003e自動提示例子\"\u003e \n\u003c/div\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/autocompleter-3.png\" alt=\"Struts2 \u003csx:autocompleter\u003e自動提示例子\"\u003e \n\u003c/div\u003e \n\u003cdiv class=\"note\"\u003e\n 下面是另一個例子,說明使用JSON數據,提供選擇選項列表中的autocompleter組件 –\u0026nbsp;Struts2 autocompleter + JSON 示例 \n\u003c/div\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/autocompleter.html\"\u003eStruts 2 autocompleter文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/ajax-and-javascript-recipes.html\"\u003eStruts 2 ajax and javascript recipes\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e Struts2 combobox示例 \u003c/li\u003e \n\u003c/ol\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"da:T16b5,"])</script><script>self.__next_f.push([1,"\u003cp\u003e 在上一章\u0026nbsp;Struts2 autocompleter 例子,已經瞭解如何通過Java列表,ONGL表達生成 autocompleter 選擇選項組件列表。另外,也有可能產生通過JSON數據選擇的選擇也是如此。 \u003c/p\u003e \n\u003cp\u003e \u003cspan\u003e這裏創建一個Web工程:strut2\u003cspan\u003eautocompleterjson\u003c/span\u003e,來演示\u003c/span\u003e\u003cspan\u003e在多個複選框\u003c/span\u003e\u003cspan\u003e如何設置的默認值,整個項目的結構如下圖所示:\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-autocompleter+json-1.png\" alt=\"Struts2 autocompleter+JSON例子\"\u003e \u003c/p\u003e 在開始之前,請確保您瞭解autocompleter組件和JSON插件的基本用法。閱讀下面的文章。 \n\u003col\u003e \n \u003cli\u003e Struts2 AutoCompleter示例 \u003c/li\u003e \n \u003cli\u003e Struts2 JSON示例 \u003c/li\u003e \n\u003c/ol\u003e \n\u003ch2\u003e Struts2 autocompleter + JSON 示例 \u003c/h2\u003e \n\u003cp\u003e 在本教程中,將使用Struts2的JSON插件將對象轉換成JSON格式,並把它傳遞給autocompleter組件。 \u003c/p\u003e \n\u003ch2\u003e 1. 動作 \u003c/h2\u003e \n\u003cp\u003e 一個類用來轉換成JSON格式,提供autocompleter組件列表的\u003cspan\u003e選擇選項\u003c/span\u003e。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eDatabaseJSON.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.util.HashMap;\r\nimport java.util.Map;\r\n\r\nimport com.opensymphony.xwork2.Action;\r\n\r\npublic class DatabaseJSON{\r\n\t\r\n\tprivate Map\u0026lt;String, String\u0026gt; databases = new HashMap\u0026lt;String, String\u0026gt;();\r\n\t\r\n\tpublic DatabaseJSON(){\r\n\t\tdatabases.put(\"MySQL\", \"MySQL\");\r\n\t\tdatabases.put(\"Oracle\", \"Oracle\");\r\n\t\tdatabases.put(\"PostgreSQL\", \"PostgreSQL\");\r\n\t\tdatabases.put(\"Microsoft SQL Server\", \"Microsoft SQL Server\");\r\n\t\tdatabases.put(\"DB2\", \"DB2\");\r\n\t\tdatabases.put(\"Others\", \"Others\");\r\n\t}\r\n\r\n\tpublic String execute() {\r\n return Action.SUCCESS;\r\n\t}\r\n\t\r\n\tpublic Map\u0026lt;String, String\u0026gt; getDatabases() {\r\n\t\treturn databases;\r\n\t}\r\n\r\n\tpublic void setDatabases(Map\u0026lt;String, String\u0026gt; databases) {\r\n\t\tthis.databases = databases;\r\n\t}\r\n}\u003c/pre\u003e \n\u003cp\u003e 一個正常的Action類,只是在做重定向工作和存儲autocompleter值。\u003cbr\u003e \u003cstrong\u003eAutoCompleterAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n \r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class AutoCompleterAction extends ActionSupport{\r\n \r\n\tprivate String yourDatabase;\r\n\t\r\n\tpublic String display() {\r\n\t\treturn NONE;\r\n\t}\r\n\r\n\tpublic String getYourDatabase() {\r\n\t\treturn yourDatabase;\r\n\t}\r\n\r\n\tpublic void setYourDatabase(String yourDatabase) {\r\n\t\tthis.yourDatabase = yourDatabase;\r\n\t}\r\n\r\n}\u003c/pre\u003e \n\u003ch2\u003e 3. 結果 \u003c/h2\u003e \n\u003cp\u003e 有點棘手在這裏,用「s:url」標籤指向一個「databaseJSON」的動作,這將返回JSON格式的選項的列表。並經由href=」%{databaseList}」鏈接到autocompleter組件。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"sx\" uri=\"/struts-dojo-tags\" %\u0026gt;\r\n \r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;sx:head /\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 autocompleter + JSON example\u0026lt;/h1\u0026gt;\r\n \r\n\u0026lt;s:form action=\"resultAction\" namespace=\"/\" method=\"POST\" \u0026gt;\r\n\r\n\u0026lt;s:url id=\"databaseList\" action=\"databaseJSON\" /\u0026gt;\r\n\r\n\u0026lt;sx:autocompleter label=\"What's your favorite Database Server?\" \r\nhref=\"%{databaseList}\" name=\"yourFavDatabase\" /\u0026gt;\r\n \r\n\u0026lt;s:submit value=\"submit\" name=\"submit\" /\u0026gt;\r\n \r\n\u0026lt;/s:form\u0026gt;\r\n \r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. struts.xml \u003c/h2\u003e \n\u003cp\u003e 配置操作和JSON提供如下: \u003c/p\u003e \n\u003cdiv class=\"note\"\u003e \n \u003cstrong\u003e\u0026lt;param name=」root」\u0026gt;databases\u0026lt;/param\u0026gt;\u003c/strong\u003e \n \u003cbr\u003e 這意味着,轉換DatabaseJSON的數據庫屬性成JSON格式,而是整個對象。 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\r\n\t\u0026lt;package name=\"json\" namespace=\"/\" extends=\"json-default\"\u0026gt;\r\n \t \u0026lt;action name=\"databaseJSON\" \r\n \t\tclass=\"com.yiibai.common.action.DatabaseJSON\"\u0026gt;\r\n \t \t\u0026lt;result type=\"json\" \u0026gt;\r\n \t \t\t\u0026lt;param name=\"root\"\u0026gt;databases\u0026lt;/param\u0026gt;\r\n \t \t\u0026lt;/result\u0026gt;\r\n \t \u0026lt;/action\u0026gt;\r\n \t\u0026lt;/package\u0026gt;\r\n\t\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t \u0026lt;action name=\"autoCompleterAction\" \r\n\t\tclass=\"com.yiibai.common.action.AutoCompleterAction\" \r\n\t method=\"display\"\u0026gt;\r\n\t\t\u0026lt;result name=\"none\"\u0026gt;/pages/autocompleter-json.jsp\u0026lt;/result\u0026gt;\r\n\t \u0026lt;/action\u0026gt;\r\n\t\t \r\n\t \u0026lt;action name=\"resultAction\" \r\n\t class=\"com.yiibai.common.action.AutoCompleterAction\" \u0026gt;\r\n\t\t\u0026lt;result name=\"success\"\u0026gt;/pages/result.jsp\u0026lt;/result\u0026gt;\r\n\t \u0026lt;/action\u0026gt;\r\n\t\u0026lt;/package\u0026gt;\r\n\t\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 例子 \u003c/h2\u003e \n\u003cp\u003e 訪問URL的動作,現在 autocompleter 選擇選項是由JSON數據提供。 \u003c/p\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/strut2autocompleterjson/autoCompleterAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cdiv class=\"pic\"\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-autocompleter+json-2.png\" alt=\"Struts2 autocompleter+JSON例子\"\u003e \n\u003c/div\u003e \n\u003cp\u003e 或者,可以通過以下網址直接訪問JSON數據\u003cbr\u003e \u003cem\u003ehttp://localhost:8080/strut2autocompleterjson/databaseJSON.action\u003c/em\u003e \u003c/p\u003e \n\u003cpre\u003e{\r\n \"PostgreSQL\":\"PostgreSQL\",\r\n \"MySQL\":\"MySQL\",\r\n \"Others\":\"Others\",\r\n \"Oracle\":\"Oracle\",\r\n \"Microsoft SQL Server\":\"Microsoft SQL Server\",\r\n \"DB2\":\"DB2\"\r\n}\u003c/pre\u003e \n\u003ch2\u003e 參數 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8.1/docs/json-plugin.html\"\u003eStruts 2 JSON 插件\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://www.json.org/\"\u003eJSON 官方文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e Struts 2 autocompleter示例 \u003c/li\u003e \n \u003cli\u003e Struts 2 JSON 示例 \u003c/li\u003e \n\u003c/ol\u003e \n\u003cbr\u003e 代碼下載: \n\u003ca href=\"http://pan.baidu.com/s/1i3o8QzF\"\u003ehttp://pan.baidu.com/s/1i3o8QzF\u003c/a\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"db:T1270,"])</script><script>self.__next_f.push([1,"\u003cp\u003e Struts2迭代器標籤用來迭代一個值,它可以是任何\u0026nbsp;java.util.Collection\u0026nbsp;或\u0026nbsp;java.util.Iterator的值。在本教程中,您將創建一個列表變量,使用迭代器標籤來遍歷,並得到使用IteratorStatus迭代狀態。 \u003c/p\u003e \n\u003cp\u003e \u003cspan\u003e這裏創建一個Web工程:strut2\u003cspan\u003eiterator\u003c/span\u003e,來演示\u003c/span\u003e\u003cspan\u003e在多個複選框\u003c/span\u003e\u003cspan\u003e如何設置的默認值,整個項目的結構如下圖所示:\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/iterator-1.png\" alt=\"Struts2 \u003cs:iterator\u003e迭代器標籤示例\"\u003e \u003c/p\u003e \n\u003ch2\u003e 1. 動作 \u003c/h2\u003e \n\u003cp\u003e Action類有列表屬性,它包含多種美味\u0026nbsp;「KFC combo meals」. \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eIteratorKFCAction\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n \r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class IteratorKFCAction extends ActionSupport{\r\n \r\n\tprivate List\u0026lt;String\u0026gt; comboMeals;\r\n\t\r\n\tpublic List\u0026lt;String\u0026gt; getComboMeals() {\r\n\t\treturn comboMeals;\r\n\t}\r\n\r\n\tpublic void setComboMeals(List\u0026lt;String\u0026gt; comboMeals) {\r\n\t\tthis.comboMeals = comboMeals;\r\n\t}\r\n\r\n\tpublic String execute() {\r\n\t\t\r\n\t\tcomboMeals = new ArrayList\u0026lt;String\u0026gt;();\r\n\t\tcomboMeals.add(\"Snack Plate\");\r\n\t\tcomboMeals.add(\"Dinner Plate\");\r\n\t\tcomboMeals.add(\"Colonel Chicken Rice Combo\");\r\n\t\tcomboMeals.add(\"Colonel Burger\");\r\n\t\tcomboMeals.add(\"O.R. Fillet Burger\");\r\n\t\tcomboMeals.add(\"Zinger Burger\");\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. 迭代器 - Iterator示例 \u003c/h2\u003e \n\u003cp\u003e 下面的JSP頁面使用iterator標籤來遍歷顯示所有的「肯德基組合餐」名單。\u0026nbsp;在迭代器標籤,它包含了一個「status」的屬性,它用於在IteratorStatus類中聲明名稱。 \u003c/p\u003e \n\u003cdiv\u003e\n IteratorStatus類用於獲取有關迭代的狀態信息。支持屬性索引,計數,第一個,最後,奇,偶和等。 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n \r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2 \u0026lt;s:iterator\u0026gt;標籤示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;div\u0026gt;\u0026lt;div class=\"ads-in-post hide_if_width_less_800\"\u0026gt;\r\n\u0026lt;script async src=\"//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\"\u0026gt;\u0026lt;/script\u0026gt;\r\n\u0026lt;!-- 728x90 - After2ndH4 --\u0026gt;\r\n\u0026lt;ins class=\"adsbygoogle hide_if_width_less_800\" \r\n style=\"display:inline-block;width:728px;height:90px\"\r\n data-ad-client=\"ca-pub-2836379775501347\"\r\n data-ad-slot=\"3642936086\"\r\n\t data-ad-region=\"yiibairegion\"\u0026gt;\u0026lt;/ins\u0026gt;\r\n\u0026lt;script\u0026gt;\r\n(adsbygoogle = window.adsbygoogle || []).push({});\r\n\u0026lt;/script\u0026gt;\r\n\u0026lt;/div\u0026gt;\u0026lt;/div\u0026gt;\u0026lt;h2\u0026gt;Simple Iterator\u0026lt;/h2\u0026gt;\r\n\u0026lt;ol\u0026gt;\r\n\u0026lt;s:iterator value=\"comboMeals\"\u0026gt;\r\n \u0026lt;li\u0026gt;\u0026lt;s:property /\u0026gt;\u0026lt;/li\u0026gt;\r\n\u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/ol\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;Iterator with IteratorStatus\u0026lt;/h2\u0026gt;\r\n\u0026lt;table\u0026gt;\r\n\u0026lt;s:iterator value=\"comboMeals\" status=\"comboMealsStatus\"\u0026gt;\r\n \u0026lt;tr\u0026gt;\r\n \t\u0026lt;s:if test=\"#comboMealsStatus.even == true\"\u0026gt;\r\n \u0026lt;td style=\"background: #CCCCCC\"\u0026gt;\u0026lt;s:property/\u0026gt;\u0026lt;/td\u0026gt;\r\n \u0026lt;/s:if\u0026gt;\r\n \u0026lt;s:elseif test=\"#comboMealsStatus.first == true\"\u0026gt;\r\n \u0026lt;td\u0026gt;\u0026lt;s:property/\u0026gt; (This is first value) \u0026lt;/td\u0026gt;\r\n \u0026lt;/s:elseif\u0026gt;\r\n \u0026lt;s:else\u0026gt;\r\n \u0026lt;td\u0026gt;\u0026lt;s:property/\u0026gt;\u0026lt;/td\u0026gt;\r\n \u0026lt;/s:else\u0026gt;\r\n \u0026lt;/tr\u0026gt;\r\n\u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/table\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\t\u0026lt;action name=\"iteratorKFCAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.IteratorKFCAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;/pages/iterator.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\t\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e \u003cem\u003ehttp://localhost:8080/struts2iterator/iteratorKFCAction.action\u003c/em\u003e \u003c/p\u003e \n\u003cp\u003e \u003cem\u003e\u003cimg src=\"https://asset.1ju.org/cmsstatic/iterator-2.png\" alt=\"Struts2 \u003cs:iterator\u003e迭代器標籤示例\"\u003e\u003cbr\u003e \u003c/em\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/iterator.html\"\u003eStruts2 \u0026lt;s:Iterator\u0026gt;標籤示例\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/struts2-core/apidocs/org/apache/struts2/views/jsp/IteratorStatus.html\"\u003eIteratorStatus文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cbr\u003e 下載代碼 -\u0026nbsp; \n\u003ca href=\"http://pan.baidu.com/s/1gdx02fp\"\u003ehttp://pan.baidu.com/s/1gdx02fp\u003c/a\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"dc:Tf19,"])</script><script>self.__next_f.push([1,"\u003cdiv class=\"__kindeditor_paste__\"\u003e \n \u003cp\u003e \u003cspan\u003eStruts2 \u0026lt;s:if\u0026gt;, \u0026lt;s:elseif\u0026gt;, \u0026lt;s:else\u0026gt;標籤示例用於執行基本的條件檢查。這裏創建一個Web工程:strut2iftag,來演示在多個複選框如何設置的默認值,整個項目的結構如下圖所示:\u003c/span\u003e \u003c/p\u003e \n \u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-if-elseif-else-1.png\" alt=\"Struts2 if,elseif,else標籤示例\"\u003e \u003c/p\u003e \n \u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n \u003cdiv\u003e \n \u003cp\u003e \u003c/p\u003e \n \u003cdiv\u003e\n \u0026lt;s:if\u0026gt; 標籤可以單獨使用。 \n \u003c/div\u003e \n \u003cpre\u003e\u0026lt;s:if test=\"%{#variable=='String 1'}\"\u0026gt;\r\n\tThis is String 1\r\n\u0026lt;/s:if\u0026gt;\u003c/pre\u003e \n \u003cp\u003e 或使用 \u0026lt;s:elseif\u0026gt;\u0026nbsp;標籤 \u003c/p\u003e \n \u003cpre\u003e\u0026lt;s:if test=\"%{#variable=='String 1'}\"\u0026gt;\r\n\tThis is String 1\r\n\u0026lt;/s:if\u0026gt;\r\n\u0026lt;s:elseif test=\"%{#variable=='String 2'}\"\u0026gt;\r\n This is String 2\r\n\u0026lt;/s:elseif\u0026gt;\u003c/pre\u003e \n \u003cdiv\u003e\n 和/或單/多\u0026lt;s:else\u0026gt;標籤。 \n \u003c/div\u003e \n \u003cpre\u003e\u0026lt;s:if test=\"%{#variable=='String 1'}\"\u0026gt;\r\n\tThis is String 1\r\n\u0026lt;/s:if\u0026gt;\r\n\u0026lt;s:elseif test=\"%{#variable=='String 2'}\"\u0026gt;\r\n This is String 2\r\n\u0026lt;/s:elseif\u0026gt;\r\n\u0026lt;s:else\u0026gt;\r\n Other Strings\r\n\u0026lt;/s:else\u0026gt;\u003c/pre\u003e \n \u003cdiv\u003e\n 以上所有的陳述是正確的。讓我們看一個例子來說明使用 Struts2 的「If,\u0026nbsp;elseIf\u0026nbsp;和\u0026nbsp;else\" 標籤。 \n \u003c/div\u003e \n \u003ch2\u003e 1. 動作 \u003c/h2\u003e \n \u003cdiv\u003e\n 一個Action類的字符串屬性,其中包含了「Struts\u0026nbsp;2」的值。 \n \u003c/div\u003e \n \u003cp\u003e \u003cstrong\u003eIfTagAction\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class IfTagAction extends ActionSupport{\r\n \r\n\tprivate String framework = \"Struts 2\";\r\n\r\n\tpublic String getFramework() {\r\n\t\treturn framework;\r\n\t}\r\n\r\n\tpublic void setFramework(String framework) {\r\n\t\tthis.framework = framework;\r\n\t}\r\n\r\n\tpublic String execute() {\r\n\t\treturn SUCCESS;\r\n\t}\r\n}\u003c/pre\u003e \n \u003ch2\u003e 2. If, elseIf 和 else 標籤示例 \u003c/h2\u003e \n \u003cdiv\u003e\n JSP頁面來顯示使用 if,\u0026nbsp;elseif\u0026nbsp;和\u0026nbsp;else 標籤的執行檢查「framework」變量。 \n \u003c/div\u003e \n \u003cp\u003e \u003cstrong\u003eif.jsp\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n \u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 If, Else, ElseIf tag example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:set name=\"webFramework\" value=\"framework\"/\u0026gt;\r\n\r\n\u0026lt;s:if test=\"%{#webFramework=='Struts 2'}\"\u0026gt;\r\n\tThis is Struts 2\r\n\u0026lt;/s:if\u0026gt;\r\n\u0026lt;s:elseif test=\"%{#webFramework=='Struts 1'}\"\u0026gt;\r\n This is Struts 1\r\n\u0026lt;/s:elseif\u0026gt;\r\n\u0026lt;s:else\u0026gt;\r\n Other framework\r\n\u0026lt;/s:else\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n \u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n \u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\t\u0026lt;action name=\"ifTagAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.IfTagAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;pages/if.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\t\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n \u003ch2\u003e 4. 示例 \u003c/h2\u003e \n \u003cp\u003e http://localhost:8080/struts2iftag/ifTagAction.action \u003c/p\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-if-elseif-else-2.png\" alt=\"Struts2 if,elseif,else標籤示例\"\u003e \n \u003cbr\u003e \n \u003ch2\u003e 參考 \u003c/h2\u003e \n \u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/if.html\"\u003eStruts2 If 標籤文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/elseif.html\"\u003eStruts2 elseIf 標籤文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/else.html\"\u003eStruts2 else 文檔\u003c/a\u003e \u003c/li\u003e \n \u003c/ol\u003e \n \u003c/div\u003e \n\u003c/div\u003e 代碼下載 - \n\u003ca href=\"http://pan.baidu.com/s/1gdpYY7D\"\u003ehttp://pan.baidu.com/s/1gdpYY7D\u003c/a\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"dd:T1935,"])</script><script>self.__next_f.push([1,"\u003cp\u003e Struts2 的\u0026nbsp;append(追加)標籤被用來組合幾個迭代器(以列表或映射創建)成一個單一的迭代器。這裏創建一個Web工程:struts2appendtag,來演示在多個複選框如何設置的默認值,整個項目的結構如下圖所示: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/append-1.png\" alt=\"struts2 \u003cs:append\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cp\u003e \u003c/p\u003e \n\u003cp\u003e 在本教程中,將使用Struts2 \u0026lt;s:append\u0026gt;標籤執行以下任務: \u003c/p\u003e \n\u003col\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 組合三個ArrayList 到一個迭代器。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 組合三個HashMap到一個迭代器。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 合併ArrayList和HashMap到一個迭代器。 \n \u003c/div\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv\u003e\n 假設2個迭代器,每個都有兩個項,用後追加標籤結合成一個迭代器,這些條目的順序將類似於以下內容: \n \u003col\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 第一迭代器的第一項 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 第一個迭代器的第二項 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 第二個迭代器的第一項 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 第二個迭代器的第二項 \n \u003c/div\u003e \u003c/li\u003e \n \u003c/ol\u003e \n \u003cdiv\u003e\n 這僅適用於列表迭代器;映射迭代器,順序是隨機的。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003ch2\u003e 1. 動作 \u003c/h2\u003e \n\u003cdiv\u003e\n Action類有3個\u0026nbsp;ArrayList\u0026nbsp;和\u0026nbsp;3\u0026nbsp;個\u0026nbsp;HashMap屬性。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eAppendTagAction\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.HashMap;\r\nimport java.util.List;\r\nimport java.util.Map;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class AppendTagAction extends ActionSupport{\r\n \r\n\tprivate List\u0026lt;String\u0026gt; list1 = new ArrayList\u0026lt;String\u0026gt;();\r\n\tprivate List\u0026lt;String\u0026gt; list2 = new ArrayList\u0026lt;String\u0026gt;();\r\n\tprivate List\u0026lt;String\u0026gt; list3 = new ArrayList\u0026lt;String\u0026gt;();\r\n\r\n\tprivate Map\u0026lt;String,String\u0026gt; map1 = new HashMap\u0026lt;String,String\u0026gt;();\r\n\tprivate Map\u0026lt;String,String\u0026gt; map2 = new HashMap\u0026lt;String,String\u0026gt;();\r\n\tprivate Map\u0026lt;String,String\u0026gt; map3 = new HashMap\u0026lt;String,String\u0026gt;();\r\n\t\r\n\tpublic String execute() {\r\n\t\t\r\n\t\tlist1.add(\"List1 - 1\");\r\n\t\tlist1.add(\"List1 - 2\");\r\n\t\tlist1.add(\"List1 - 3\");\r\n\t\t\r\n\t\tlist2.add(\"List2 - 1\");\r\n\t\tlist2.add(\"List2 - 2\");\r\n\t\tlist2.add(\"List2 - 3\");\r\n\t\t\r\n\t\tlist3.add(\"List3 - 1\");\r\n\t\tlist3.add(\"List3 - 2\");\r\n\t\tlist3.add(\"List3 - 3\");\r\n\t\t\r\n\t\tmap1.put(\"map1-key1\", \"map1-value1\");\r\n\t\tmap1.put(\"map1-key2\", \"map1-value2\");\r\n\t\tmap1.put(\"map1-key3\", \"map1-value3\");\r\n\t\t\r\n\t\tmap2.put(\"map2-key1\", \"map2-value1\");\r\n\t\tmap2.put(\"map2-key2\", \"map2-value2\");\r\n\t\tmap2.put(\"map2-key3\", \"map2-value3\");\r\n\t\t\r\n\t\tmap3.put(\"map3-key1\", \"map3-value1\");\r\n\t\tmap3.put(\"map3-key2\", \"map3-value2\");\r\n\t\tmap3.put(\"map3-key3\", \"map3-value3\");\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t}\r\n\r\n\t//getter methods...\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. Append 標籤文檔 \u003c/h2\u003e \n\u003cdiv\u003e\n JSP頁面使用\u0026lt;s:append\u0026gt;標籤將3個ArrayList/3個HashMap/1個ArrayList+1個HashMap合併成一個迭代器,並遍歷它的值,並打印出來。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eappendIterator.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n \u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\u0026lt;title\u0026gt;Struts2 append 標籤示例 - by www.yiibai.com\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2 Append 標籤示例\u0026lt;/h1\u0026gt;\r\n\r\n1. Combine 3 ArrayList into a single iterator.\r\n\u0026lt;s:append var=\"customListIterator\"\u0026gt;\r\n \u0026lt;s:param value=\"%{list1}\" /\u0026gt;\r\n \u0026lt;s:param value=\"%{list2}\" /\u0026gt;\r\n \u0026lt;s:param value=\"%{list3}\" /\u0026gt;\r\n\u0026lt;/s:append\u0026gt;\r\n\u0026lt;ol\u0026gt;\r\n\u0026lt;s:iterator value=\"%{#customListIterator}\"\u0026gt;\r\n \u0026lt;li\u0026gt;\u0026lt;s:property /\u0026gt;\u0026lt;/li\u0026gt;\r\n\u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/ol\u0026gt;\r\n\r\n2. Combine 3 HashMap into a single iterator.\r\n\u0026lt;s:append var=\"customMapIterator\"\u0026gt;\r\n \u0026lt;s:param value=\"%{map1}\" /\u0026gt;\r\n \u0026lt;s:param value=\"%{map2}\" /\u0026gt;\r\n \u0026lt;s:param value=\"%{map3}\" /\u0026gt;\r\n\u0026lt;/s:append\u0026gt;\r\n\u0026lt;ol\u0026gt;\r\n\u0026lt;s:iterator value=\"%{#customMapIterator}\"\u0026gt;\r\n \u0026lt;li\u0026gt;\u0026lt;s:property /\u0026gt;\u0026lt;/li\u0026gt;\r\n\u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/ol\u0026gt;\r\n\r\n3. Combine ArrayList and HashMap into a single iterator.\r\n\u0026lt;s:append var=\"customMixedIterator\"\u0026gt;\r\n \u0026lt;s:param value=\"%{list1}\" /\u0026gt;\r\n \u0026lt;s:param value=\"%{map1}\" /\u0026gt;\r\n\u0026lt;/s:append\u0026gt;\r\n\u0026lt;ol\u0026gt;\r\n\u0026lt;s:iterator value=\"%{#customMixedIterator}\"\u0026gt;\r\n \u0026lt;li\u0026gt;\u0026lt;s:property /\u0026gt;\u0026lt;/li\u0026gt;\r\n\u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/ol\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\t\u0026lt;action name=\"appendTagAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.AppendTagAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;/pages/appendIterator.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\t\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e \u003ca href=\"http://localhost:8080/struts2appendtag/appendTagAction.action\"\u003ehttp://localhost:8080/struts2appendtag/appendTagAction.action\u003c/a\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/append-2.png\" alt=\"struts2 \u003cs:append\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003c/p\u003e \n\u003cp\u003e 在瀏覽器中打開,顯示結果如下: \u003c/p\u003e \n\u003cpre\u003eStruts 2 Append tag example\r\n\r\n1. Combine 3 ArrayList into a single iterator.\r\n\r\n 1. List1 - 1\r\n 2. List1 - 2\r\n 3. List1 - 3\r\n 4. List2 - 1\r\n 5. List2 - 2\r\n 6. List2 - 3\r\n 7. List3 - 1\r\n 8. List3 - 2\r\n 9. List3 - 3\r\n\r\n2. Combine 3 HashMap into a single iterator.\r\n\r\n 1. map1-key3=map1-value3\r\n 2. map1-key1=map1-value1\r\n 3. map1-key2=map1-value2\r\n 4. map2-key2=map2-value2\r\n 5. map2-key3=map2-value3\r\n 6. map2-key1=map2-value1\r\n 7. map3-key3=map3-value3\r\n 8. map3-key1=map3-value1\r\n 9. map3-key2=map3-value2\r\n\r\n3. Combine ArrayList and HashMap into a single iterator.\r\n\r\n 1. List1 - 1\r\n 2. List1 - 2\r\n 3. List1 - 3\r\n 4. map1-key3=map1-value3\r\n 5. map1-key1=map1-value1\r\n 6. map1-key2=map1-value2\u003c/pre\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/append.html\"\u003eStruts 2 Append 標籤文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e 下載代碼 - \n\u003ca href=\"http://pan.baidu.com/s/1ntOs9Zj\"\u003ehttp://pan.baidu.com/s/1ntOs9Zj\u003c/a\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"de:T1007,"])</script><script>self.__next_f.push([1,"\u003cp\u003e \u003cspan\u003eStruts2 \u0026lt;s:generator\u0026gt;標記用於基於在頁中提供「val」屬性,以產生一個迭代。這裏創建一個Web工程:struts2generatortag,來演示在多個複選框如何設置的默認值,整個項目的結構如下圖所示:\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/generator-1.png\" alt=\"Struts2 \u003cs:generator\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cdiv\u003e \n \u003cp\u003e \u003c/p\u003e \n \u003cdiv\u003e\n 在本教程中,將使用Struts2 \u0026lt;s:generator\u0026gt;標籤來執行以下任務: \n \u003c/div\u003e \n \u003col\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 使用generator標籤來創建生成迭代器。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 使用\u0026lt;s:generator\u0026gt;創建生成迭代器,並使用「Converter」對象修改迭代器值。 \n \u003c/div\u003e \u003c/li\u003e \n \u003c/ol\u003e \n \u003ch2\u003e 1. 動作 \u003c/h2\u003e \n \u003cdiv\u003e\n 有一個方法,Action類返回一個「Converter對象。 \n \u003c/div\u003e \n \u003cp\u003e \u003cstrong\u003eGeneratorTagAction\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport org.apache.struts2.util.IteratorGenerator.Converter;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class GeneratorTagAction extends ActionSupport{\r\n\t\r\n\tpublic String execute() {\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t}\r\n\r\n\tpublic Converter getLanguageConverter(){\r\n\t\treturn new Converter() {\r\n\t public Object convert(String value) throws Exception {\r\n\t \t \r\n\t \t if(\"java\".equals(value)){\r\n\t \t\t return \"[java value in converter] - \" + value;\r\n\t \t }else{\r\n\t \t\t return value;\r\n\t \t }\r\n\t \r\n\t }\r\n\t };\r\n\t}\r\n}\u003c/pre\u003e \n \u003ch2\u003e 2. Generator 標籤示例 \u003c/h2\u003e \n \u003cp\u003e 下面的JSP頁面使用generator標籤演示動態創建一個迭代器。「separator」屬性是必需的,其分離val到迭代器的條目中。 \u003c/p\u003e \n \u003cp\u003e 「converter」屬性是可選的,它允許修改值。在這種情況下,它會調用GeneratorTagAction的getLanguageConverter()方法,如果值等於「Java」字符串並修改值。 \u003c/p\u003e \n \u003cp\u003e \u003cstrong\u003egenerator.jsp\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n \u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 Generator tag example\u0026lt;/h1\u0026gt;\r\n\r\n1. Generator tag example.\r\n\u0026lt;s:generator val=\"%{'java|.net|c|python|shell'}\" separator=\"|\"\u0026gt;\r\n\u0026lt;ol\u0026gt;\r\n\u0026lt;s:iterator\u0026gt;\r\n \u0026lt;li\u0026gt;\u0026lt;s:property /\u0026gt;\u0026lt;/li\u0026gt;\r\n\u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/s:generator\u0026gt;\r\n\u0026lt;/ol\u0026gt; \r\n\r\n2. Generator tag with converter example\r\n\u0026lt;s:generator val=\"%{'java|.net|c|python|shell'}\" separator=\"|\" \r\nconverter=\"%{languageConverter}\"\u0026gt;\r\n\u0026lt;ol\u0026gt;\r\n\u0026lt;s:iterator\u0026gt;\r\n \u0026lt;li\u0026gt;\u0026lt;s:property /\u0026gt;\u0026lt;/li\u0026gt;\r\n\u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/s:generator\u0026gt;\r\n\u0026lt;/ol\u0026gt; \r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n \u003cdiv\u003e \n \u003cdiv\u003e\n 找不到任何使用generator標籤示例,因爲不建議在頁面迭代值。 \n \u003c/div\u003e \n \u003c/div\u003e \n \u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n \u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\t\u0026lt;action name=\"appendTagAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.AppendTagAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;pages/appendIterator.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\t\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n \u003ch2\u003e 4. 示例 \u003c/h2\u003e \n \u003cp\u003e http://localhost:8080/struts2generator/generatorTagAction.action \u003c/p\u003e \n \u003cdiv\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/generator-2.png\" alt=\"Struts2 \u003cs:generator\u003e標籤示例\"\u003e \n \u003cbr\u003e \n \u003c/div\u003e \n \u003ch2\u003e 參考 \u003c/h2\u003e \n \u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/generator.html\"\u003eStruts2 generator 文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/struts2-core/apidocs/org/apache/struts2/util/IteratorGenerator.Converter.html\"\u003eStruts2 Converter 文檔\u003c/a\u003e \u003c/li\u003e \n \u003c/ol\u003e \n\u003c/div\u003e 代碼下載 -\u0026nbsp; \n\u003ca href=\"http://pan.baidu.com/s/1mgm0W1E\"\u003ehttp://pan.baidu.com/s/1mgm0W1E\u003c/a\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"df:T1933,"])</script><script>self.__next_f.push([1,"\u003cp\u003e \u003cspan\u003eStruts2\u0026nbsp;merge標籤用來合併幾個迭代器(由列表或映射創建)成一個迭代器。這裏創建一個Web工程:struts2mergetag,來演示在多個複選框如何設置的默認值,整個項目的結構如下圖所示:\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/merge-1.png\" alt=\"Struts2 \u003cs:merge\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003cdiv\u003e\n 在本教程中,將使用Struts2 \u0026lt;s:merge\u0026gt;標籤執行以下任務: \n\u003c/div\u003e \n\u003col\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 合併三個ArrayList到一個迭代器 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 合併三個HashMap到一個迭代器 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 合併ArrayList和HashMap到一個迭代器 \n \u003c/div\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv\u003e\n 假設有2個迭代器,每個有兩個條目,使用merge標記合併成一個迭代後,這些條目的順序將類似於以下內容: \n \u003col\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 第一個迭代的第一個條目。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 第二個迭代器的第一項 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 第一個迭代器的第二項 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 第二個迭代器的第二項。 \n \u003c/div\u003e \u003c/li\u003e \n \u003c/ol\u003e \n \u003cdiv\u003e\n 這僅適用於列表迭代器;映射迭代器,順序將是隨機的。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003ch2\u003e 1. 動作 \u003c/h2\u003e \n\u003cdiv\u003e\n Action類有3個ArrayList\u0026nbsp;和\u0026nbsp;3\u0026nbsp;個\u0026nbsp;HashMap屬性。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eMergeTagAction\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.HashMap;\r\nimport java.util.List;\r\nimport java.util.Map;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class MergeTagAction extends ActionSupport{\r\n \r\n\tprivate List\u0026lt;String\u0026gt; list1 = new ArrayList\u0026lt;String\u0026gt;();\r\n\tprivate List\u0026lt;String\u0026gt; list2 = new ArrayList\u0026lt;String\u0026gt;();\r\n\tprivate List\u0026lt;String\u0026gt; list3 = new ArrayList\u0026lt;String\u0026gt;();\r\n\r\n\tprivate Map\u0026lt;String,String\u0026gt; map1 = new HashMap\u0026lt;String,String\u0026gt;();\r\n\tprivate Map\u0026lt;String,String\u0026gt; map2 = new HashMap\u0026lt;String,String\u0026gt;();\r\n\tprivate Map\u0026lt;String,String\u0026gt; map3 = new HashMap\u0026lt;String,String\u0026gt;();\r\n\t\r\n\tpublic String execute() {\r\n\t\t\r\n\t\tlist1.add(\"List1 - 1\");\r\n\t\tlist1.add(\"List1 - 2\");\r\n\t\tlist1.add(\"List1 - 3\");\r\n\t\t\r\n\t\tlist2.add(\"List2 - 1\");\r\n\t\tlist2.add(\"List2 - 2\");\r\n\t\tlist2.add(\"List2 - 3\");\r\n\t\t\r\n\t\tlist3.add(\"List3 - 1\");\r\n\t\tlist3.add(\"List3 - 2\");\r\n\t\tlist3.add(\"List3 - 3\");\r\n\t\t\r\n\t\tmap1.put(\"map1-key1\", \"map1-value1\");\r\n\t\tmap1.put(\"map1-key2\", \"map1-value2\");\r\n\t\tmap1.put(\"map1-key3\", \"map1-value3\");\r\n\t\t\r\n\t\tmap2.put(\"map2-key1\", \"map2-value1\");\r\n\t\tmap2.put(\"map2-key2\", \"map2-value2\");\r\n\t\tmap2.put(\"map2-key3\", \"map2-value3\");\r\n\t\t\r\n\t\tmap3.put(\"map3-key1\", \"map3-value1\");\r\n\t\tmap3.put(\"map3-key2\", \"map3-value2\");\r\n\t\tmap3.put(\"map3-key3\", \"map3-value3\");\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t}\r\n\r\n\t//getter methods...\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. Merge 標籤示例 \u003c/h2\u003e \n\u003cp\u003e JSP頁面使用merge標記爲3個ArrayList/3個HashMap/1個ArrayList+1個HashMap合併成一個迭代器,循環它的值,並把打印出來。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003emerge.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n \u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\u003cspan\u003e\u0026lt;title\u0026gt;Generator\u0026nbsp;標籤示例\u0026nbsp;-\u0026nbsp;\u0026nbsp;\u003c/span\u003ewww.yiibai.com\u003cspan\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e \u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 Merge tag example\u0026lt;/h1\u0026gt;\r\n\r\n1. Merge 3 ArrayList into a single iterator.\r\n\u0026lt;s:merge var=\"customListIterator\"\u0026gt;\r\n \u0026lt;s:param value=\"%{list1}\" /\u0026gt;\r\n \u0026lt;s:param value=\"%{list2}\" /\u0026gt;\r\n \u0026lt;s:param value=\"%{list3}\" /\u0026gt;\r\n\u0026lt;/s:merge\u0026gt;\r\n\u0026lt;ol\u0026gt;\r\n\u0026lt;s:iterator value=\"%{#customListIterator}\"\u0026gt;\r\n \u0026lt;li\u0026gt;\u0026lt;s:property /\u0026gt;\u0026lt;/li\u0026gt;\r\n\u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/ol\u0026gt;\r\n\r\n2. Merge 3 HashMap into a single iterator.\r\n\u0026lt;s:merge var=\"customMapIterator\"\u0026gt;\r\n \u0026lt;s:param value=\"%{map1}\" /\u0026gt;\r\n \u0026lt;s:param value=\"%{map2}\" /\u0026gt;\r\n \u0026lt;s:param value=\"%{map3}\" /\u0026gt;\r\n\u0026lt;/s:merge\u0026gt;\r\n\u0026lt;ol\u0026gt;\r\n\u0026lt;s:iterator value=\"%{#customMapIterator}\"\u0026gt;\r\n \u0026lt;li\u0026gt;\u0026lt;s:property /\u0026gt;\u0026lt;/li\u0026gt;\r\n\u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/ol\u0026gt;\r\n\r\n3. Merge ArrayList and HashMap into a single iterator.\r\n\u0026lt;s:merge var=\"customMixedIterator\"\u0026gt;\r\n \u0026lt;s:param value=\"%{list1}\" /\u0026gt;\r\n \u0026lt;s:param value=\"%{map1}\" /\u0026gt;\r\n\u0026lt;/s:merge\u0026gt;\r\n\u0026lt;ol\u0026gt;\r\n\u0026lt;s:iterator value=\"%{#customMixedIterator}\"\u0026gt;\r\n \u0026lt;li\u0026gt;\u0026lt;s:property /\u0026gt;\u0026lt;/li\u0026gt;\r\n\u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/ol\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\t\u0026lt;action name=\"mergeTagAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.MergeTagAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;pages/merge.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\t\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e \u003ca href=\"http://localhost:8080/struts2mergetag/mergeTagAction.action\"\u003ehttp://localhost:8080/struts2mergetag/mergeTagAction.action\u003c/a\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/merge-2.png\" alt=\"Struts2 \u003cs:merge\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003c/p\u003e \n\u003cp\u003e 在瀏覽器打開上面的網址,輸出以下結果: \u003c/p\u003e \n\u003cpre\u003eStruts 2 Merge tag example\r\n\r\n1. Merge 3 ArrayList into a single iterator.\r\n\r\n 1. List1 - 1\r\n 2. List2 - 1\r\n 3. List3 - 1\r\n 4. List1 - 2\r\n 5. List2 - 2\r\n 6. List3 - 2\r\n 7. List1 - 3\r\n 8. List2 - 3\r\n 9. List3 - 3\r\n\r\n2. Merge 3 HashMap into a single iterator.\r\n\r\n 1. map1-key3=map1-value3\r\n 2. map2-key2=map2-value2\r\n 3. map3-key3=map3-value3\r\n 4. map1-key1=map1-value1\r\n 5. map2-key3=map2-value3\r\n 6. map3-key1=map3-value1\r\n 7. map1-key2=map1-value2\r\n 8. map2-key1=map2-value1\r\n 9. map3-key2=map3-value2\r\n\r\n3. Merge ArrayList and HashMap into a single iterator.\r\n\r\n 1. List1 - 1\r\n 2. map1-key3=map1-value3\r\n 3. List1 - 2\r\n 4. map1-key1=map1-value1\r\n 5. List1 - 3\r\n 6. map1-key2=map1-value2\u003c/pre\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/merge.html\"\u003eStruts 2 Merge 標籤文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e 代碼下載 -\u0026nbsp; \n\u003ca href=\"http://pan.baidu.com/s/1c0dnNcW\"\u003ehttp://pan.baidu.com/s/1c0dnNcW\u003c/a\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"e0:T19c2,"])</script><script>self.__next_f.push([1,"\u003cp\u003e \u003cspan\u003eStruts2的\u0026lt;s:sort\u0026gt;標籤使用\u0026nbsp;java.util.Comparator\u0026nbsp;來排序列表,這裏創建一個Web工程:struts2sorttag,來演示在多個複選框如何設置的默認值,整個項目的結構如下圖所示:\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/sort-1.png\" alt=\"Struts2 \u003cs:sort\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cp\u003e \u003c/p\u003e \n\u003cp\u003e 在本教程中,將創建6個\u0026nbsp;Person對象並添加到一個ArrayList,並使用排序標籤基於Person屬性的ArrayList進行排序。 \u003c/p\u003e \n\u003cdiv\u003e\n 要使用這個Struts2的\u0026lt;s:sort\u0026gt;標籤,\u0026nbsp;必須瞭解了java.util.Comparator 是如何工作的 \n\u003c/div\u003e \n\u003ch2\u003e 1. Person 對象 \u003c/h2\u003e \n\u003cdiv\u003e\n 創建一個有\"firstName」,\u0026nbsp;「lastName」\u0026nbsp;和\u0026nbsp;「age」屬性的Person對象。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003ePerson.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common;\r\n\r\npublic class Person{\r\n\t\r\n\tprivate String firstName;\r\n\tprivate String lastName;\r\n\tprivate int age;\r\n\t\r\n\tpublic Person(String firstName, String lastName, int age) {\r\n\t\tsuper();\r\n\t\tthis.firstName = firstName;\r\n\t\tthis.lastName = lastName;\r\n\t\tthis.age = age;\r\n\t}\r\n\t\r\n\tpublic String getFirstName() {\r\n\t\treturn firstName;\r\n\t}\r\n\tpublic void setFirstName(String firstName) {\r\n\t\tthis.firstName = firstName;\r\n\t}\r\n\tpublic String getLastName() {\r\n\t\treturn lastName;\r\n\t}\r\n\tpublic void setLastName(String lastName) {\r\n\t\tthis.lastName = lastName;\r\n\t}\r\n\tpublic int getAge() {\r\n\t\treturn age;\r\n\t}\r\n\tpublic void setAge(int age) {\r\n\t\tthis.age = age;\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. Comparator \u003c/h2\u003e \n\u003cdiv\u003e\n 創建2個Comparator類,對Person的「firstName」\u0026nbsp;和\u0026nbsp;「age」\u0026nbsp;屬性進行排序。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eFirstNameComparator.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common;\r\n\r\nimport java.util.Comparator;\r\nimport com.yiibai.common.Person;\r\n\r\npublic class FirstNameComparator implements Comparator\u0026lt;Person\u0026gt; {\r\n\r\n\tpublic int compare(Person p1, Person p2) {\r\n\t\t\r\n\t\tString firstName1 = p1.getFirstName().toUpperCase();\r\n\t\tString firstName2 = p2.getFirstName().toUpperCase();\r\n\t\t\r\n\t\treturn firstName1.compareTo(firstName2);\r\n\t}\r\n}\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eAgeComparator.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common;\r\n\r\nimport java.util.Comparator;\r\nimport com.yiibai.common.Person;\r\n\r\npublic class AgeComparator implements Comparator\u0026lt;Person\u0026gt; {\r\n\r\n\tpublic int compare(Person p1, Person p2) {\r\n\t\t\r\n\t\treturn p1.getAge() - p2.getAge();\r\n\t\t\r\n\t}\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 3. 動作-Action \u003c/h2\u003e \n\u003cdiv\u003e\n Action類,初始化6個\u0026nbsp;Person\u0026nbsp;對象,並把它添加到一個ArrayList。 \n\u003c/div\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\n\r\nimport com.yiibai.common.Person;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class SortTagAction extends ActionSupport{\r\n\t\r\n\tprivate List\u0026lt;Person\u0026gt; persons = new ArrayList\u0026lt;Person\u0026gt;();\r\n\t\r\n\tpublic String execute() {\r\n\t\t\r\n\t\tPerson p1 = new Person(\"C-First\", \"C-Last\", 40);\r\n\t\tPerson p2 = new Person(\"A-First\", \"A-Last\", 20);\r\n\t\tPerson p3 = new Person(\"B-First\", \"B-Last\", 10);\r\n\t\tPerson p4 = new Person(\"F-First\", \"F-Last\", 33);\r\n\t\tPerson p5 = new Person(\"E-First\", \"E-Last\", 22);\r\n\t\tPerson p6 = new Person(\"D-First\", \"D-Last\", 11);\r\n\t\t\r\n\t\tpersons.add(p1);\r\n\t\tpersons.add(p2);\r\n\t\tpersons.add(p3);\r\n\t\tpersons.add(p4);\r\n\t\tpersons.add(p5);\r\n\t\tpersons.add(p6);\r\n \r\n\t\treturn SUCCESS;\r\n\t}\r\n\r\n\tpublic List\u0026lt;Person\u0026gt; getPersons() {\r\n\t\treturn persons;\r\n\t}\r\n\tpublic void setPersons(List\u0026lt;Person\u0026gt; persons) {\r\n\t\tthis.persons = persons;\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 4. \u0026lt;s:sort\u0026gt;標籤示例 \u003c/h2\u003e \n\u003cdiv\u003e\n JSP頁面使用sort標籤與「FirstNameComparator」和「AgeComparator」對列表進行排序。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003esort.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n \u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\u0026lt;title\u0026gt;struts2 sort標籤示例 - www.yiibai.com\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 Sort標籤示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:bean name=\"com.yiibai.common.FirstNameComparator\" var=\"firstNameComparator\" /\u0026gt;\r\n\u0026lt;s:bean name=\"com.yiibai.common.AgeComparator\" var=\"ageComparator\" /\u0026gt;\r\n\r\n\u0026lt;table\u0026gt;\r\n\u0026lt;tr\u0026gt;\r\n\u0026lt;td\u0026gt;\r\n1. Display all persons (unsort).\r\n\u0026lt;ol\u0026gt;\r\n\u0026lt;s:iterator value=\"persons\"\u0026gt;\r\n \u0026lt;li\u0026gt;\u0026lt;s:property value=\"firstName\" /\u0026gt;, \r\n \u0026lt;s:property value=\"lastName\" /\u0026gt;, \r\n \u0026lt;s:property value=\"age\" /\u0026gt;\r\n \u0026lt;/li\u0026gt;\r\n\u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/ol\u0026gt;\r\n\u0026lt;/td\u0026gt;\r\n\r\n\u0026lt;td\u0026gt;\r\n2. Display all persons (sort with firstName).\r\n\u0026lt;s:sort comparator=\"#firstNameComparator\" source=\"persons\"\u0026gt;\r\n\u0026lt;ol\u0026gt;\r\n\u0026lt;s:iterator\u0026gt;\r\n \u0026lt;li\u0026gt;\u0026lt;s:property value=\"firstName\" /\u0026gt;, \r\n \u0026lt;s:property value=\"lastName\" /\u0026gt;, \r\n \u0026lt;s:property value=\"age\" /\u0026gt;\r\n \u0026lt;/li\u0026gt;\r\n\u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/ol\u0026gt;\r\n\u0026lt;/s:sort\u0026gt;\r\n\u0026lt;/td\u0026gt;\r\n\u0026lt;/tr\u0026gt;\r\n\r\n\u0026lt;tr\u0026gt;\r\n\u0026lt;td colspan=\"2\"\u0026gt;\r\n3. Display all persons (sort with age).\r\n\u0026lt;s:sort comparator=\"#ageComparator\" source=\"persons\"\u0026gt;\r\n\u0026lt;ol\u0026gt;\r\n\u0026lt;s:iterator\u0026gt;\r\n \u0026lt;li\u0026gt;\u0026lt;s:property value=\"firstName\" /\u0026gt;, \r\n \u0026lt;s:property value=\"lastName\" /\u0026gt;, \r\n \u0026lt;s:property value=\"age\" /\u0026gt;\r\n \u0026lt;/li\u0026gt;\r\n\u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/ol\u0026gt;\r\n\u0026lt;/s:sort\u0026gt;\r\n\u0026lt;/td\u0026gt;\r\n\u0026lt;/tr\u0026gt;\r\n\u0026lt;/table\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\u0026lt;action name=\"sortTagAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.SortTagAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;pages/sort.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e http://localhost:8080/strut2sorttag/sortTagAction.action \u003c/p\u003e \n\u003cp\u003e 在瀏覽器打開上面的URL,顯示結果如下: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/sort-2.png\" alt=\"Struts2 \u003cs:sort\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/sort.html\"\u003eStruts 2 Sort 標籤文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/bean.html\"\u003eStruts 2 Bean 標籤文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e Java object sorting 示例 \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e 下載代碼 -\u0026nbsp; \n\u003ca href=\"http://pan.baidu.com/s/1pJy6dth\"\u003ehttp://pan.baidu.com/s/1pJy6dth\u003c/a\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"e1:T1308,"])</script><script>self.__next_f.push([1,"\u003cp\u003e \u003cspan\u003eStruts2\u0026nbsp;\u0026lt;s:subset\u0026nbsp;\u0026gt;標籤用來輸出一個iterator元素的子集或部分。在本教程中,將創建一個「數字」列表中,包含了10個元素(從 1 - 10),\u0026nbsp;並使用\u0026lt;s:subset\u0026nbsp;\u0026gt;標記\u0026nbsp;「start \u0026amp; count」\u0026nbsp;屬性和判定方法,以輸出一個迭代(列表)的子集。這裏創建一個Web工程:struts2subsettag,來演示在多個複選框如何設置的默認值,整個項目的結構如下圖所示:\u003c/span\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/subset-1.png\" alt=\"Struts2 \u003cs:subset\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cp\u003e \u003c/p\u003e \n\u003ch2\u003e 1. 動作 - Action \u003c/h2\u003e \n\u003cdiv\u003e\n Action類填充元素到一個列表,以及一個判定方法進行篩選,以顯示元素。 \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 如果判定方法返回一個「true」是指顯示該值;\u0026nbsp;否則,忽略它。可以在這裏實現過濾器的邏輯。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eSubsetTagAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\n\r\nimport org.apache.struts2.util.SubsetIteratorFilter.Decider;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class SubsetTagAction extends ActionSupport{\r\n\t\r\n\tprivate List\u0026lt;String\u0026gt; numbers = new ArrayList\u0026lt;String\u0026gt;();\r\n\t\r\n\tpublic String execute() {\r\n\t\t\r\n\t\tnumbers.add(\"Number 1\");\r\n\t\tnumbers.add(\"Number 2\");\r\n\t\tnumbers.add(\"Number 3\");\r\n\t\tnumbers.add(\"Number 4\");\r\n\t\tnumbers.add(\"Number 5\");\r\n\t\tnumbers.add(\"Number 6\");\r\n\t\tnumbers.add(\"Number 7\");\r\n\t\tnumbers.add(\"Number 8\");\r\n\t\tnumbers.add(\"Number 9\");\r\n\t\tnumbers.add(\"Number 10\");\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t}\r\n\r\n\tpublic List\u0026lt;String\u0026gt; getNumbers() {\r\n\t\treturn numbers;\r\n\t}\r\n\r\n\tpublic void setNumbers(List\u0026lt;String\u0026gt; numbers) {\r\n\t\tthis.numbers = numbers;\r\n\t}\r\n\r\n\tpublic Decider getNumberDecider() {\r\n\t return new Decider() {\r\n\t public boolean decide(Object obj) throws Exception {\r\n\t String number = ((String)obj).toString();\r\n\t \r\n\t if((\"Number 7\").equals(number)){\r\n\t \t return true;//display it\r\n\t }else{\r\n\t \t return false;//ignore\r\n\t }\r\n\t }\r\n\t };\r\n\t}\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. \u0026lt;s:subset\u0026gt;標籤示例 \u003c/h2\u003e \n\u003cdiv\u003e\n JSP頁面使用\u0026lt;s:subset\u0026gt;標籤迭代器輸出一個子集。 \n\u003c/div\u003e \n\u003cdiv\u003e\n 「start」以及「count」在\u0026lt;s:subset\u0026gt;標籤屬性是從0開始,這意味着\u0026nbsp;\u0026lt;s:subset source=」numbers」 start=」1″ count=」5″\u0026gt;\u0026nbsp;將提取元素\u0026nbsp;#2 到 #6. \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003esubset.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n \u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\u0026lt;title\u0026gt;Struts2 subset標籤示例 - www.yiibai.com\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 Subset tag example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;table border=\"1px\" cellpadding=\"8px\"\u0026gt;\r\n\u0026lt;tr valign=\"top\"\u0026gt;\r\n\u0026lt;td\u0026gt;\r\n1. Display all numbers.\r\n\u0026lt;ol\u0026gt;\r\n\u0026lt;s:subset source=\"numbers\"\u0026gt;\r\n \u0026lt;s:iterator\u0026gt;\r\n \t\u0026lt;li\u0026gt;\u0026lt;s:property /\u0026gt;\u0026lt;/li\u0026gt;\r\n \u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/s:subset\u0026gt;\r\n\u0026lt;/ol\u0026gt;\r\n\u0026lt;/td\u0026gt;\r\n\r\n\u0026lt;td\u0026gt;\r\n2. Display numbers , from #2 to #6\r\n\u0026lt;ol\u0026gt;\r\n\u0026lt;s:subset source=\"numbers\" start=\"1\" count=\"5\"\u0026gt;\r\n \u0026lt;s:iterator\u0026gt;\r\n \t\u0026lt;li\u0026gt;\u0026lt;s:property /\u0026gt;\u0026lt;/li\u0026gt;\r\n \u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/s:subset\u0026gt;\r\n\u0026lt;/ol\u0026gt;\r\n\u0026lt;/td\u0026gt;\r\n\r\n\u0026lt;td\u0026gt;\r\n3. Display numbers 7 only, with decider\r\n\u0026lt;ol\u0026gt;\r\n\u0026lt;s:subset source=\"numbers\" decider=\"numberDecider\"\u0026gt;\r\n \u0026lt;s:iterator\u0026gt;\r\n \t\u0026lt;li\u0026gt;\u0026lt;s:property /\u0026gt;\u0026lt;/li\u0026gt;\r\n \u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/s:subset\u0026gt;\r\n\u0026lt;/ol\u0026gt;\r\n\u0026lt;/td\u0026gt;\r\n\u0026lt;/tr\u0026gt;\r\n\u0026lt;/table\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\u0026lt;action name=\"subsetTagAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.SubsetTagAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;/pages/subset.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e http://localhost:8080/struts2subsettag/subsetTagAction.action \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/subset-2.png\" alt=\"Struts2 \u003cs:subset\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003cp\u003e 在瀏覽器中輸出以上網址訪問,顯示如下結果: \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/subset.htmll\"\u003eStruts 2 Subset 標籤文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e 代碼下載 -\u0026nbsp; \n\u003ca href=\"http://pan.baidu.com/s/1eQjpyIQ\"\u003ehttp://pan.baidu.com/s/1eQjpyIQ\u003c/a\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"e2:Td03,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n Struts2 \u0026lt;s:a\u0026gt;標籤用於渲染一個 HTML 的「\u0026lt;a\u0026gt;」 標籤。最好的做法是使用\u0026lt;s:url\u0026gt;標籤來創建URL,並將其嵌入到\u0026lt;a\u0026gt;標籤。\u0026nbsp;例如, \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:url value=\"http://www.google.com\" var=\"googleURL\" /\u0026gt;\r\n\u0026lt;s:a href=\"%{googleURL}\"\u0026gt;Google\u0026lt;/s:a\u0026gt;\u003c/pre\u003e \n\u003cdiv\u003e\n 在本教程中,它顯示了3種方式來使用Struts2\u0026nbsp;\u0026lt;s:a\u0026gt;標籤。 \n\u003c/div\u003e \n\u003ch2\u003e 1. 動作 \u003c/h2\u003e \n\u003cdiv\u003e\n Action類轉發請求。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eATagAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class ATagAction extends ActionSupport{\r\n\t\r\n\tpublic String execute() {\r\n\t\treturn SUCCESS;\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. \u0026lt;s:a\u0026gt;標籤示例 \u003c/h2\u003e \n\u003cdiv\u003e\n JSP頁面顯示使用「\u0026lt;s:a\u0026gt;」標籤,以不同的方式呈現 URL \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003ea.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n \u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\u0026lt;title\u0026gt;Struts2 \u0026lt;s:a\u0026gt;標籤示例\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2 a tag example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;ol\u0026gt;\r\n\r\n\u0026lt;li\u0026gt;\r\n\u0026lt;s:url value=\"http://www.yiibai.com\" var=\"yiibaiURL\" /\u0026gt;\r\n\u0026lt;s:a href=\"%{yiibaiURL}\"\u0026gt;J2EE web development tutorials\u0026lt;/s:a\u0026gt;\r\n\u0026lt;/li\u0026gt;\r\n\r\n\u0026lt;li\u0026gt;\r\n\u0026lt;s:a href=\"http://www.google.com\"\u0026gt;Google search engine\u0026lt;/s:a\u0026gt;\r\n\u0026lt;/li\u0026gt;\r\n\r\n\u0026lt;li\u0026gt;\r\n\u0026lt;s:url action=\"aTagAction.action\" var=\"aURL\" /\u0026gt;\r\n\u0026lt;s:a href=\"%{aURL}\"\u0026gt;aTagAction\u0026lt;/s:a\u0026gt;\r\n\u0026lt;/li\u0026gt;\r\n\r\n\u0026lt;/ol\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\t\u0026lt;action name=\"aTagAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.aTagAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;pages/a.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cdiv\u003e \n \u003ca href=\"http://localhost:8080/struts2atag/aTagAction.action\"\u003ehttp://localhost:8080/struts2atag/aTagAction.action\u003c/a\u003e \n\u003c/div\u003e \n\u003cp\u003e 在瀏覽器中打開上述標籤,將顯示結果如下: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/a-1.png\" alt=\"Struts2 \u003cs:a\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003cp\u003e 輸出HTML源碼如下: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;html\u0026gt; \r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt; \r\n\u0026lt;body\u0026gt; \r\n\u0026lt;h1\u0026gt;Struts2 \u0026lt;s:a\u0026gt;標籤示例\u0026lt;/h1\u0026gt; \r\n \r\n\u0026lt;ol\u0026gt; \r\n\u0026lt;li\u0026gt; \r\n\u0026lt;a href=\"http://www.yiibai.com\"\u0026gt;J2EE web development tutorials\u0026lt;/a\u0026gt; \r\n\u0026lt;/li\u0026gt; \r\n \r\n\u0026lt;li\u0026gt; \r\n\u0026lt;a href=\"http://www.google.com\"\u0026gt;Google search engine\u0026lt;/a\u0026gt; \r\n\u0026lt;/li\u0026gt; \r\n \r\n\u0026lt;li\u0026gt; \r\n\u0026lt;a href=\"/struts2atag/aTagAction.action\"\u0026gt;aTagAction\u0026lt;/a\u0026gt; \r\n\u0026lt;/li\u0026gt; \r\n\u0026lt;/ol\u0026gt; \r\n \r\n\u0026lt;/body\u0026gt; \r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/a.html\"\u003eStruts2 \u0026lt;s:a\u0026gt;標籤文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e 代碼下載 -\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1sjzOkYL\"\u003ehttp://pan.baidu.com/s/1sjzOkYL\u003c/a\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"e3:T1293,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e\n Struts2 的「action」標籤是用來直接從JSP頁面中調用Action類。如果「executeResult」屬性設置爲true,則結果頁的內容將直接在當前網頁渲染。 \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cdiv\u003e\n 這是用一個完整的例子很好地說明: \n\u003c/div\u003e \n\u003ch2\u003e 1. 動作 \u003c/h2\u003e \n\u003cdiv\u003e\n Action類有幾個方法用來轉發不同結果的結果頁面。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eParamTagAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class ActionTagAction extends ActionSupport{\r\n\t\r\n\tpublic String execute() {\r\n\t\treturn SUCCESS;\r\n\t}\r\n\t\r\n\tpublic String sayHello(){\r\n\t\treturn \"sayHello\";\r\n\t}\r\n\t\r\n\tpublic String sayStruts2(){\r\n\t\treturn \"sayStruts2\";\r\n\t}\r\n\t\r\n\tpublic String saySysOut(){\r\n\t\tSystem.out.println(\"SysOut SysOut SysOut\");\r\n\t\treturn \"saySysOut\";\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. \u0026lt;s:action\u0026gt;標籤示例 \u003c/h2\u003e \n\u003cp\u003e 下面的JSP頁面顯示如何使用「action」標籤。如果\u0026nbsp;executeResult=」true」,動作標籤被指定方法執行且結果頁面將直接顯示;\u0026nbsp;否則,它只是執行的方法,結果頁面不會顯示出來。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eaction.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\u0026lt;title\u0026gt;struts2 action標籤示例\u0026lt;title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2 action標籤示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;ol\u0026gt;\r\n\r\n\u0026lt;li\u0026gt;\r\nExecute the action's result, render the page here. \r\n\u0026lt;s:action name=\"sayHelloAction\" executeResult=\"true\"/\u0026gt;\r\n\u0026lt;/li\u0026gt;\r\n\r\n\u0026lt;li\u0026gt;\r\nDoing the same as above, but call action's sayStruts2() method. \r\n\u0026lt;s:action name=\"sayHelloAction!sayStruts2\" executeResult=\"true\"/\u0026gt;\r\n\u0026lt;/li\u0026gt;\r\n\r\n\u0026lt;li\u0026gt;\r\nCall the action's saySysOut() method only, no result will be rendered,\r\nBy defautlt, executeResult=\"false\". \r\n\u0026lt;s:action name=\"sayHelloAction!saySysOut\" /\u0026gt;\r\n\u0026lt;/li\u0026gt;\r\n\r\n\u0026lt;/ol\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003esayHello.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;div\u0026gt;\u0026lt;div class=\"ads-in-post hide_if_width_less_800\"\u0026gt;\r\n\u0026lt;script async src=\"//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\"\u0026gt;\u0026lt;/script\u0026gt;\r\n\u0026lt;!-- 728x90 - After2ndH4 --\u0026gt;\r\n\u0026lt;ins class=\"adsbygoogle hide_if_width_less_800\" \r\n style=\"display:inline-block;width:728px;height:90px\"\r\n data-ad-client=\"ca-pub-2836379775501347\"\r\n data-ad-slot=\"3642936086\"\r\n\t data-ad-region=\"yiibairegion\"\u0026gt;\u0026lt;/ins\u0026gt;\r\n\u0026lt;script\u0026gt;\r\n(adsbygoogle = window.adsbygoogle || []).push({});\r\n\u0026lt;/script\u0026gt;\r\n\u0026lt;/div\u0026gt;\u0026lt;/div\u0026gt;\u0026lt;h2\u0026gt;Hello Hello Hello ~ from sayHello.jsp\u0026lt;/h2\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003esayStruts2.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h2\u0026gt;Struts 2 Struts 2 Struts 2 ~ from sayStruts2.jsp\u0026lt;/h2\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003esaySysOut.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h2\u0026gt;SysOut SysOut SysOut ~ from saySysOut.jsp\u0026lt;/h2\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cdiv\u003e\n 聲明一些結果名稱來演示\u0026nbsp;ExecuteReuslt\u0026nbsp;的效果。 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\u0026lt;action name=\"actionTagAction\" \r\n\t\tclass=\"com.yiibai.common.action.ActionTagAction\" \u0026gt;\r\n\t\t\u0026lt;result name=\"success\"\u0026gt;pages/action.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;action name=\"sayHelloAction\" \r\n\t\tclass=\"com.yiibai.common.action.ActionTagAction\" \r\n method=\"sayHello\"\u0026gt;\r\n\r\n\t\t\u0026lt;result name=\"sayHello\"\u0026gt;sayHello.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;result name=\"sayStruts2\"\u0026gt;sayStruts2.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;result name=\"saySysOut\"\u0026gt;saySysOut.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n \u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e http://localhost:8080/struts2actiontag/actionTagAction.action \u003c/p\u003e \n\u003cp\u003e 在瀏覽器中打開上面的URL,顯示結果如下圖: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/action-1.png\" alt=\"Struts2 \u003cs:action\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/action.html\"\u003eStruts2 \u0026lt;s:action\u0026gt;標籤文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e 代碼下載 -\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1kT8NTUf\"\u003ehttp://pan.baidu.com/s/1kT8NTUf\u003c/a\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"e4:Tbe0,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e \n \u003cspan\u003eStruts2的\u0026lt;s:bean\u0026gt;標籤用於在JSP頁面中實例化一個類。\u003c/span\u003e \n \u003cspan\u003e在本教程中,將使用\u0026lt;s:bean\u0026gt;標籤,以實例化一個\u0026nbsp;helloBean\u0026nbsp;的類,\u003c/span\u003e \n \u003cspan\u003e通過「param」元素設置其屬性,並打印出它的值。\u003c/span\u003e \n \u003c/div\u003e \n\u003c/div\u003e \n\u003ch2\u003e 1. 簡單Bean \u003c/h2\u003e \n\u003cdiv\u003e\n 一個簡單的類,後面使用bean標籤來實例化。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eHelloBean.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\npublic class HelloBean{\r\n\t\r\n\tprivate String msg;\r\n\r\n\tpublic String getMsg() {\r\n\t\treturn msg;\r\n\t}\r\n\r\n\tpublic void setMsg(String msg) {\r\n\t\tthis.msg = msg;\r\n\t}\r\n\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. 動作 - Action \u003c/h2\u003e \n\u003cdiv\u003e\n Action類轉發請求。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eBeanTagAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class BeanTagAction extends ActionSupport{\r\n\t\r\n\tpublic String execute() {\r\n\t\treturn SUCCESS;\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. \u0026lt;s:bean\u0026gt;標籤示例 \u003c/h2\u003e \n\u003cdiv\u003e\n 在這個JSP頁面將顯示如何使用\u0026lt;s:bean\u0026gt;標籤來實例化helloBean。 \n\u003c/div\u003e \n\u003cdiv\u003e\n 在\u0026lt;s:bean\u0026gt;標籤,可以通過\u0026nbsp;var\u0026nbsp;屬性分配一個Bean的名稱,以後可以通過\u0026nbsp;#var_bean_name\u0026nbsp;訪問這個 Bean, 或者通過\u0026nbsp;#var_bean_name.property 來訪問屬性。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003ebean.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n \u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2 \u0026lt;s:bean\u0026gt;標籤示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:bean name=\"com.yiibai.common.action.HelloBean\" var=\"hello\"\u0026gt;\r\n \u0026lt;s:param name=\"msg\"\u0026gt;Hello Bean Tag\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:bean\u0026gt;\r\n\r\nThe HelloBean's msg property value : \u0026lt;s:property value=\"#hello.msg\"/\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\u0026lt;action name=\"beanTagAction\" \r\n\t class=\"com.yiibai.common.action.BeanTagAction\" \u0026gt;\r\n\t \u0026lt;result name=\"success\"\u0026gt;pages/bean.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n \u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e \u003ca href=\"http://localhost:8080/struts2beantag/beanTagAction.action\"\u003ehttp://localhost:8080/struts2beantag/beanTagAction.action\u003c/a\u003e \u003c/p\u003e \n\u003cp\u003e 在瀏覽器中打開上面的網址,結果如下所示: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/bean-1.png\" alt=\"Struts2 \u003cs:bean\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/bean.html\"\u003eStruts2 \u0026lt;s:bean\u0026gt;標籤文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e 代碼下載 -\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1jGJFv86\"\u003ehttp://pan.baidu.com/s/1jGJFv86\u003c/a\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"e5:Tdf2,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n Struts2\u0026nbsp;的\u0026lt;s:date\u0026gt;標籤用於格式化Date對象,它有兩種方法: \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003col\u003e \n \u003cli\u003e 自定義格式 (如:yyyy-MM-dd) \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 「nice」屬性來格式化日期到一個易於閱讀的符號,如,「此日期162天前」。 \n \u003c/div\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv\u003e\n 在本教程中,它顯示瞭如何使用\u0026nbsp;Struts2\u0026nbsp;的\u0026lt;s:date\u0026gt;標籤,以Date對象格式化爲「自定義日期格式」和「易讀取符號」。 \n\u003c/div\u003e \n\u003ch2\u003e 1. 動作 \u003c/h2\u003e \n\u003cdiv\u003e\n Action類轉發請求,並初始化一個Date對象有一個預定義的日期。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eDateTagAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.text.DateFormat;\r\nimport java.util.Calendar;\r\nimport java.util.Date;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class DateTagAction extends ActionSupport{\r\n\t\r\n\tpublic Date customDate;\r\n\t\r\n\tpublic String execute() {\r\n\t\t\r\n\t\tCalendar cal = Calendar.getInstance();\r\n\t\t//set date to january 31, 2010\r\n\t\tcal.set(2010, 0, 31);\r\n\t\tDate newDate = cal.getTime();\r\n\t\r\n\t\tsetCustomDate(newDate);\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t\t\r\n\t}\r\n\r\n\tpublic Date getCustomDate() {\r\n\t\treturn customDate;\r\n\t}\r\n\r\n\tpublic void setCustomDate(Date customDate) {\r\n\t\tthis.customDate = customDate;\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. \u0026lt;s:date\u0026gt;標籤示例 \u003c/h2\u003e \n\u003cdiv\u003e\n JSP頁面顯示使用\u0026lt;s:date\u0026gt;標籤格式化Date對象: \n\u003c/div\u003e \n\u003col\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 默認的日期格式 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e 自定義日期格式 \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 簡單易讀的符號 \n \u003c/div\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e \u003cstrong\u003edate.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n \u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\u0026lt;title\u0026gt;\u003cspan\u003eStruts2\u0026nbsp;\u0026lt;s:date\u0026gt;標籤示例 - www.yiibai.com\u0026lt;/title\u0026gt;\u003c/span\u003e \u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2 \u0026lt;s:date\u0026gt;標籤示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;ol\u0026gt;\r\n\r\n\u0026lt;li\u0026gt;\r\nDefault date format\r\n--\u0026gt; \u0026lt;strong\u0026gt;\u0026lt;s:date name=\"customDate\" /\u0026gt;\u0026lt;/strong\u0026gt;\r\n\u0026lt;/li\u0026gt;\r\n\r\n\u0026lt;li\u0026gt;\r\nDate format in \"yyyy-MM-dd\"\r\n--\u0026gt; \u0026lt;strong\u0026gt;\u0026lt;s:date name=\"customDate\" format=\"yyy-MM-dd\" /\u0026gt;\u0026lt;/strong\u0026gt;\r\n\u0026lt;/li\u0026gt;\r\n\r\n\u0026lt;li\u0026gt;\r\nIn Date tag, set the nice attribute to \"true\"\r\n--\u0026gt; \u0026lt;strong\u0026gt;\u0026lt;s:date name=\"customDate\" nice=\"true\" /\u0026gt;\u0026lt;/strong\u0026gt;\r\n\u0026lt;/li\u0026gt;\r\n\r\n\u0026lt;/ol\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\t\u0026lt;action name=\"dateTagAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.DateTagAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;/pages/date.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e http://localhost:8080/struts2datetag/dateTagAction.action \u003c/p\u003e \n\u003cp\u003e 在瀏覽器中打開上面的網址,顯示結果如下: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/date-1.png\" alt=\"Struts2 \u003cs:date\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/date.html\"\u003eStruts2 \u0026lt;s:date\u0026gt;標籤文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e 代碼下載 -\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1dDe7YLz\"\u003ehttp://pan.baidu.com/s/1dDe7YLz\u003c/a\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"e6:Ta0e,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n 在Struts2在\u0026nbsp;\u0026lt;s:debug\u0026gt;\u0026nbsp;標籤是一個非常有用的調試標記輸出「值棧」的內容,並在網頁中「堆棧上下文」的詳細信息。在本教程,在JSP頁面中顯示如何使用\u0026lt;s:debug\u0026gt;標籤。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003ch2\u003e 1. 動作 \u003c/h2\u003e \n\u003cdiv\u003e\n 一個簡單的Action類,帶有\u0026nbsp;propertyInStack 屬性,顯示疊加後的值。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eDebugTagAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class DebugTagAction extends ActionSupport{\r\n\t\r\n\tpublic String propertyInStack;\r\n\r\n\tpublic String getPropertyInStack() {\r\n\t\treturn propertyInStack;\r\n\t}\r\n\r\n\tpublic void setPropertyInStack(String propertyInStack) {\r\n\t\tthis.propertyInStack = propertyInStack;\r\n\t}\r\n\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. \u0026lt;s:date\u0026gt;標籤示例 \u003c/h2\u003e \n\u003cdiv\u003e\n 在JSP頁面使用\u0026lt;s:debug\u0026gt;標籤輸出系統的「值棧」和「棧上下文」。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003edebug.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n \u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2 \u0026lt;s:debug\u0026gt;標籤示例 - www.yiibai.com\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:debug /\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 將生成一個名爲\u0026nbsp;debug\u0026nbsp;文字鏈接,點擊文字鏈接獲得調試的詳細信息。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\t\u0026lt;action name=\"debugTagAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.DebugTagAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;pages/debug.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e http://localhost:8080/struts2debugtag/debugTagAction.action \u003c/p\u003e \n\u003cp\u003e 在瀏覽器中打開上面的網址,輸出結果如下: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/debug-1.png\" alt=\"Struts2 \u003cs:debug\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/debug.html\"\u003eStruts2 \u0026lt;s:debug\u0026gt;標籤文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e 下載代碼 -\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1gdEvJGZ\"\u003ehttp://pan.baidu.com/s/1gdEvJGZ\u003c/a\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"e7:T97c,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e \n \u003cspan\u003eStruts2\u0026nbsp;\u0026lt;s:include\u0026gt;標籤用於直接包含JSP或HTML頁面到當前頁面。\u003c/span\u003e \n \u003cspan\u003e參見下面\u0026lt;s:include\u0026gt;標籤的例子。\u003c/span\u003e \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003c/p\u003e \n\u003ch2\u003e 1. 動作 \u003c/h2\u003e \n\u003cdiv\u003e\n 一個簡單的動作類只做轉發任務。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eIncludeTagAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class IncludeTagAction extends ActionSupport{\r\n\t\r\n\tpublic String execute() throws Exception {\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. \u0026lt;s:include\u0026gt;標籤示例 \u003c/h2\u003e \n\u003cdiv\u003e\n 它顯示了使用\u0026lt;s:include\u0026gt;標籤包括一個yiibai.jsp頁面到當前\u0026nbsp;include.jsp\u0026nbsp;頁面。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003einclude.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2 \u0026lt;s:include\u0026gt;標籤示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:include value=\"/pages/yiibai.jsp\"\u0026gt;\u0026lt;/s:include\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eyiibai.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;/div\u0026gt;\u0026lt;h2\u0026gt;Message from yiibai.jsp\u0026lt;/h2\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\t\u0026lt;action name=\"includeTagAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.IncludeTagAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;pages/include.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e http://localhost:8080/struts2includetag/includeTagAction.action \u003c/p\u003e \n\u003cp\u003e 在瀏覽器中訪問上面網址,結果輸出如下: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/include-1.png\" alt=\"Struts2 \u003cs:include\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003cp\u003e \u003c/p\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/include.htmll\"\u003eStruts2 \u0026lt;s:include\u0026gt;標籤文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e 代碼下載 -\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1i3Iv1rR\"\u003ehttp://pan.baidu.com/s/1i3Iv1rR\u003c/a\u003e \u003c/p\u003e \n\u003cp\u003e\u003c/p\u003e \n\u003cp\u003e\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"e8:Te69,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e \n \u003cspan\u003eStruts2\u0026nbsp;\u0026lt;s:i18n\u0026gt;標籤是用來從聲明的資源包獲得消息,\u003c/span\u003e \n \u003cspan\u003e\u0026nbsp;\u003c/span\u003e \n \u003cspan\u003e不只是使用當前操作相關聯的資源包。看下面一個完整的\u0026lt;s:i18n\u0026gt;標籤的例子:\u003c/span\u003e \n \u003c/div\u003e \n\u003c/div\u003e \n\u003ch2\u003e 1. 動作 \u003c/h2\u003e \n\u003cdiv\u003e\n Action類轉發請求。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eI18nTagAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class I18nTagAction extends ActionSupport{\r\n\r\n\tpublic String execute() throws Exception {\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. 屬性文件 \u003c/h2\u003e \n\u003cdiv\u003e\n 兩個屬性文件作爲演示。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eI18nTagAction.properties\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003ei18n.msg = \"This is a message from I18nTagAction.properties\"\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eCustom.properties\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003ei18n.msg = \"This is a message from Custom.properties\"\u003c/pre\u003e \n\u003ch2\u003e 3. \u0026lt;s:i18n\u0026gt;標籤示例 \u003c/h2\u003e \n\u003cp\u003e 下面顯示\u0026lt;s:i18n\u0026gt;標籤的使用。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003ei18n.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2 \u0026lt;s:i18n\u0026gt;標籤示例 - www.yiibai.com\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;1.Get message from I18nTagAction.properties\u0026lt;/h2\u0026gt; \r\nOutput : \r\n\u0026lt;s:text name=\"i18n.msg\" /\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;2.Get message from Custom.properties\u0026lt;/h2\u0026gt; \r\nOutput : \r\n\u0026lt;s:i18n name=\"com/yiibai/common/action/Custom\"\u0026gt;\r\n\t\u0026lt;s:text name=\"i18n.msg\" /\u0026gt;\r\n\u0026lt;/s:i18n\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 它是如何工作的? \u003c/p\u003e \n\u003cp\u003e 1.在示例1中,它會得到來自資源包的消息(I18nTagAction.properties)這是關想當前的操作類\u0026nbsp;(I18nTagAction.java) \u003c/p\u003e \n\u003cp\u003e 2.在例2中,它會從「Custom.properties」屬性的文件得到消息,這個文件放在\u0026nbsp;com/yiibai/common/action/\u0026nbsp;文件 \u003c/p\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 不要放 .properties 後綴 \n \u003c/div\u003e 一個常見的錯誤,在國際化的標籤,如果聲明屬性名爲.properties後綴的文件,在Struts2將未能從聲明的資源包獲得消息。 \n \u003cbr\u003e 錯誤的方式: \n \u003cbr\u003e \n \u003cpre\u003e\u0026lt;s:i18n name=\"com/yiibai/common/action/Custom.properties\"\u0026gt;\r\n\t\u0026lt;s:text name=\"i18n.msg\" /\u0026gt;\r\n\u0026lt;/s:i18n\u0026gt;\u003c/pre\u003e \n \u003cp\u003e \u003cstrong\u003e正確的方式\u003c/strong\u003e\u0026nbsp;: \u003c/p\u003e \n \u003cdiv\u003e\n 聲明的屬性文件沒有 .properties 後綴。 \n \u003c/div\u003e \n \u003cpre\u003e\u0026lt;s:i18n name=\"com/yiibai/common/action/Custom\"\u0026gt;\r\n\t\u0026lt;s:text name=\"i18n.msg\" /\u0026gt;\r\n\u0026lt;/s:i18n\u0026gt;\u003c/pre\u003e \n\u003c/div\u003e \n\u003ch2\u003e 4. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\t\u0026lt;action name=\"i18nTagAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.I18nTagAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;pages/i18n.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. 示例 \u003c/h2\u003e \n\u003cp\u003e http://localhost:8080/struts2i18ntag/i18nTagAction.action \u003c/p\u003e \n\u003cp\u003e 在瀏覽器中打開上面的URL,顯示結果如下: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/i18n-1.png\" alt=\"Struts2 \u003cs:i18n\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/i18n.html\"\u003eStruts2 \u0026lt;s:i18n\u0026gt;標籤文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv\u003e \n \u003cspan\u003e\u003cspan\u003e下載代碼 -\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1c0mHDlA\"\u003ehttp://pan.baidu.com/s/1c0mHDlA\u003c/a\u003e \u003c/span\u003e\u003c/span\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"e9:T1931,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e \n \u003cspan\u003eStruts2 \u0026lt;s:\u003c/span\u003e \n \u003cspan\u003eparam\u003c/span\u003e \n \u003cspan\u003e\u0026gt;\u003c/span\u003e \n \u003cspan\u003e標籤被用來參數化其他標籤。\u003c/span\u003e \n \u003cspan\u003e\u0026nbsp;\u003c/span\u003e \n \u003cspan\u003e但是,當稱明\u0026lt;s:param\u0026gt;標籤,「參數值」可以有兩種定義方式:\u003c/span\u003e \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003col\u003e \n \u003cli\u003e 「value」 屬性 \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n param標籤的開始和結束之間的文本 \n \u003c/div\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv\u003e\n 例如, \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;param name=\"fruit\"\u0026gt;Banana\u0026lt;/param\u0026gt; {Case 1}\r\n\u0026lt;param name=\"fruit\" value=\"Banana\"/\u0026gt; {Case 2}\u0026nbsp;\u003c/pre\u003e \n\u003cdiv\u003e\n 在Struts2中,都是表現一個完全不同的意義。\u0026nbsp;在「Case 1」中,\u0026nbsp;值被認爲是一個java.lang.String對象;\u0026nbsp;而在「Case 2」中,\u0026nbsp;值被認爲是一個 java.lang.Object\u0026nbsp;對象。 \n\u003c/div\u003e \n\u003cdiv\u003e\n 上述聲明用一些例子很好地說明: \n\u003c/div\u003e \n\u003ch2\u003e 示例1 \u003c/h2\u003e \n\u003cdiv\u003e\n 通過「param」標籤設置「字符串」值轉換到\u0026nbsp;bean屬性,必須這樣聲明 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;s:bean name=\"com.yiibai.common.Person\" var=\"personBean\"\u0026gt;\r\n\t\u0026lt;s:param name=\"nickName\"\u0026gt;yiibai\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:bean\u0026gt;\u003c/pre\u003e \n\u003cdiv\u003e\n 而不是 \n \u003cpre\u003e\u0026lt;s:bean name=\"com.yiibai.common.Person\" var=\"personBean\"\u0026gt;\r\n\t\u0026lt;s:param name=\"nickName\" value=\"yiibai\"\u0026gt;\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:bean\u0026gt;\u003c/pre\u003e \n \u003cdiv\u003e\n 如果你聲明「字符串」的值在「value」屬性中,Struts2 會忽略它。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003ch2\u003e 示例2 \u003c/h2\u003e \n\u003cdiv\u003e\n 通過\u0026lt;s:param\u0026gt;標籤設置\u0026nbsp;java.lang.Object\u0026nbsp;對象轉換成\u0026nbsp;bean\u0026nbsp;屬性,這樣聲明 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;s:bean name=\"com.yiibai.common.Fruit\" var=\"fruitBean\"\u0026gt;\r\n\t\u0026lt;s:param name=\"fruitName\"\u0026gt;Banana\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:bean\u0026gt;\r\n\r\n\u0026lt;s:bean name=\"com.yiibai.common.Person\" var=\"personBean\"\u0026gt;\r\n\t\u0026lt;s:param name=\"favorFruit\" value=\"#fruitBean\"\u0026gt;\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:bean\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 示例3 \u003c/h2\u003e \n\u003cdiv\u003e\n 對於基本類型,可以自由地在任何位置聲明它。 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;s:bean name=\"com.yiibai.common.Person\" var=\"personBean\"\u0026gt;\r\n\t\u0026lt;s:param name=\"age\" value=\"99\"\u0026gt;\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:bean\u0026gt;\r\n// or\r\n\u0026lt;s:bean name=\"com.yiibai.common.Person\" var=\"personBean\"\u0026gt;\r\n\t\u0026lt;s:param name=\"age\"\u0026gt;99\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:bean\u0026gt;\u0026nbsp;\u003c/pre\u003e \n\u003cdiv\u003e\n \u0026lt;s:param\u0026gt;標籤不僅是可用於bean標籤,它幾乎適用於所有需要參數化的標籤。 \n\u003c/div\u003e \n\u003cdiv\u003e\n 在Struts\u0026nbsp;2,\u0026lt;s:param\u0026gt;標籤是一個非常混亂的標籤,許多新的Struts2開發人員都可能會掉進這個陷阱,但不知道爲什麼一個簡單的「字符串」的setter方法是不行的。希望 Struts2 的團隊能夠在今後設計更加人性化的標籤。 \n\u003c/div\u003e \n\u003ch2\u003e Struts2 \u0026lt;s:param\u0026gt;標籤示例 \u003c/h2\u003e \n\u003cdiv\u003e\n 一個完整的Struts2\u0026nbsp;\u0026lt;s:param\u0026gt;標籤的例子。 \n\u003c/div\u003e \n\u003ch2\u003e 1. 動作 \u003c/h2\u003e \n\u003cdiv\u003e\n Action類轉發請求。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eParamTagAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class ParamTagAction extends ActionSupport{\r\n\t\r\n\tpublic String execute() {\r\n\t\treturn SUCCESS;\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. Bean \u003c/h2\u003e \n\u003cdiv\u003e\n 兩個Bean對象初始化在「param」標籤之後。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003ePerson.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common;\r\n\r\npublic class Person{\r\n\t\r\n\tprivate String nickName;\r\n\tprivate int age;\r\n\tprivate Fruit favorFruit;\r\n\t\r\n\tpublic String getNickName() {\r\n\t\treturn nickName;\r\n\t}\r\n\tpublic void setNickName(String nickName) {\r\n\t\tthis.nickName = nickName;\r\n\t}\r\n\tpublic int getAge() {\r\n\t\treturn age;\r\n\t}\r\n\tpublic void setAge(int age) {\r\n\t\tthis.age = age;\r\n\t}\r\n\tpublic Fruit getFavorFruit() {\r\n\t\treturn favorFruit;\r\n\t}\r\n\tpublic void setFavorFruit(Fruit favorFruit) {\r\n\t\tthis.favorFruit = favorFruit;\r\n\t}\r\n\t\r\n\tpublic String getFruitName(){\r\n\t\treturn this.favorFruit.getFruitName();\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eFruit.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common;\r\n\r\npublic class Fruit{\r\n\t\r\n\tprivate String fruitName;\r\n\r\n\tpublic String getFruitName() {\r\n\t\treturn fruitName;\r\n\t}\r\n\r\n\tpublic void setFruitName(String fruitName) {\r\n\t\tthis.fruitName = fruitName;\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 3. \u0026lt;s:param\u0026gt;標籤示例 \u003c/h2\u003e \n\u003cdiv\u003e\n JSP頁面顯示如何使用\u0026lt;s:param\u0026gt;標籤。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eparam.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n \u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 param tag example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:bean name=\"com.yiibai.common.Fruit\" var=\"fruitBean\"\u0026gt;\r\n\t\u0026lt;s:param name=\"fruitName\"\u0026gt;Banana\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:bean\u0026gt;\r\n\r\n\u0026lt;s:bean name=\"com.yiibai.common.Person\" var=\"personBean\"\u0026gt;\r\n\t\u0026lt;s:param name=\"nickName\"\u0026gt;ah pig ah dog\u0026lt;/s:param\u0026gt;\r\n\t\u0026lt;s:param name=\"age\"\u0026gt;99\u0026lt;/s:param\u0026gt;\r\n\t\u0026lt;s:param name=\"favorFruit\" value=\"#fruitBean\"\u0026gt;\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:bean\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;PersonBean\u0026lt;/h2\u0026gt;\r\n\u0026lt;ol\u0026gt;\r\n\u0026lt;li\u0026gt;NickName property : \u0026lt;s:property value=\"#personBean.nickName\" /\u0026gt;\u0026lt;/li\u0026gt;\r\n\u0026lt;li\u0026gt;Age property : \u0026lt;s:property value=\"#personBean.age\" /\u0026gt;\u0026lt;/li\u0026gt;\r\n\u0026lt;li\u0026gt;Fruit property : \u0026lt;s:property value=\"#personBean.fruitName\" /\u0026gt;\u0026lt;/li\u0026gt;\r\n\u0026lt;/ol\u0026gt;\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\t\u0026lt;action name=\"paramTagAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.ParamTagAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;pages/param.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. 示例 \u003c/h2\u003e \n\u003cp\u003e http://localhost:8080/struts2paramtag/paramTagAction.action \u003c/p\u003e \n\u003cp\u003e 在瀏覽中打上面的網址,訪問後顯示結果如下: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/param-1.png\" alt=\"Struts2 \u003cs:param\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/param.html\"\u003eStruts2 \u0026lt;s:param\u0026gt;標籤文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv\u003e \n \u003cspan\u003e\u003cspan\u003e代碼下載 -\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1pJreREj\"\u003ehttp://pan.baidu.com/s/1pJreREj\u003c/a\u003e \u003c/span\u003e\u003c/span\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"ea:Tcc1,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n Struts2的\u0026lt;s:property\u0026gt;標籤是用來從一個類獲得屬性值,如果沒有指定,這將默認爲當前Action類(堆棧的頂部)屬性。在本教程中,它展示瞭如何使用\u0026nbsp;\u0026lt;s:property\u0026gt;\u0026nbsp;標籤,以從目前Action類獲得其他bean類的屬性值。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003ch2\u003e 1. 動作類 \u003c/h2\u003e \n\u003cdiv\u003e\n 這裏有一個Action類,有一個\u0026nbsp;name\u0026nbsp;屬性。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003ePropertyTagAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class PropertyTagAction extends ActionSupport{\r\n\t\r\n\tprivate String name = \"Name from PropertyTagAction.java\"; \r\n\t\r\n\tpublic String getName() {\r\n\t\treturn name;\r\n\t}\r\n\r\n\tpublic String execute() throws Exception {\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. Bean \u003c/h2\u003e \n\u003cdiv\u003e\n 一個簡單的Java類,它有一個\u0026nbsp;name\u0026nbsp;屬性。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003ePerson.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common;\r\n\r\npublic class Person {\r\n\t\r\n\tprivate String name = \"Name from Person.java\"; \r\n\t\r\n\tpublic String getName() {\r\n\t\treturn name;\r\n\t}\r\n\r\n}\u003c/pre\u003e \n\u003ch2\u003e 3. \u0026lt;s:property\u0026gt;標籤示例 \u003c/h2\u003e \n\u003cdiv\u003e\n 它展示瞭如何使用\u0026lt;s:property\u0026gt;標籤,從PropertyTagAction與「Person」類獲得name屬性值。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eproperty.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 property tag example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;1. Call getName() from propertyTagAction.java\u0026lt;/h2\u0026gt; \r\n\u0026lt;s:property value=\"name\" /\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;2. Call getName() from Person.java\u0026lt;/h2\u0026gt; \r\n\u0026lt;s:bean name=\"com.yiibai.common.Person\" var=\"personBean\" /\u0026gt;\r\n\u0026lt;s:property value=\"#personBean.name\" /\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u0026nbsp;\u003c/pre\u003e \n\u003cdiv\u003e\n 「property.jsp」頁面是「PropertyTagAction」動作返回一個成功的結果頁面。如果指定了\u0026lt;s:property\u0026nbsp;value=」name」\u0026nbsp;/\u0026gt;在「property.jsp」頁面,默認爲當前的Action類「PropertyTagAction.getName()」屬性。 \n\u003c/div\u003e \n\u003ch2\u003e 4. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\t\u0026lt;action name=\"propertyTagAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.PropertyTagAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;pages/property.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. 示例 \u003c/h2\u003e \n\u003cp\u003e http://localhost:8080/struts2propertytag/propertyTagAction.action \u003c/p\u003e \n\u003cp\u003e 在瀏覽器中打開上面的URL,顯示結果如下: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/property-1.png\" alt=\"Struts2 \u003cs:property\u003e標籤實例\"\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/property.html\"\u003eStruts2 \u0026lt;s:property\u0026gt;標籤文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e 代碼下載 -\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1t7m2M\"\u003ehttp://pan.baidu.com/s/1t7m2M\u003c/a\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"eb:Td88,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n Struts2\u0026nbsp;\u0026lt;s:push\u0026gt;標籤被用來將值推到堆棧的頂部,以便它可以容易地訪問或參考。看到一個完整的\u0026lt;s:push\u0026gt;標記示例: \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003c/p\u003e \n\u003ch2\u003e 1. 動作 \u003c/h2\u003e \n\u003cdiv\u003e\n Action類只轉發請求。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003ePushTagAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class PushTagAction extends ActionSupport{\r\n\r\n\tpublic String execute() throws Exception {\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. Bean \u003c/h2\u003e \n\u003cdiv\u003e\n 一個簡單的Person類,將它推入堆棧以便於訪問。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003ePerson.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common;\r\n\r\npublic class Person{\r\n\r\n\tprivate String firstName = \"This is firstName\";\r\n\tprivate String lastName = \"This is lastName\";\r\n\t\r\n\tpublic String getFirstName() {\r\n\t\treturn firstName;\r\n\t}\r\n\tpublic String getLastName() {\r\n\t\treturn lastName;\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 3. \u0026lt;s:push\u0026gt;標籤示例 \u003c/h2\u003e \n\u003cdiv\u003e\n 它顯示了使用\u0026lt;s:push\u0026gt;標籤。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003epush.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 push tag example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;1. Normal way\u0026lt;/h2\u0026gt;\r\n\u0026lt;s:bean name=\"com.yiibai.common.Person\" var=\"personBean\" /\u0026gt;\r\nFirst name : \u0026lt;s:property value=\"#personBean.firstName\" /\u0026gt;\u0026lt;br/\u0026gt;\r\nLast name: \u0026lt;s:property value=\"#personBean.lastName\" /\u0026gt;\u0026lt;br/\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;2. Push way\u0026lt;/h2\u0026gt;\r\n\u0026lt;s:push value=\"#personBean\" \u0026gt;\r\nFirst name : \u0026lt;s:property value=\"firstName\" /\u0026gt;\u0026lt;br/\u0026gt;\r\nLast name: \u0026lt;s:property value=\"lastName\" /\u0026gt;\u0026lt;br/\u0026gt;\r\n\u0026lt;/s:push\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 它是如何工作的? \u003c/p\u003e \n\u003cp\u003e 通常情況下,如果你想獲得bean的屬性,可以參考它,如\u0026nbsp;\u0026lt;s:property value=」#personBean.firstName」 /\u0026gt;。使用 \u0026lt;s:push\u0026gt;標籤,\u0026nbsp;可以推「#personBean」到堆棧的頂部,並直接訪問屬性\u0026nbsp;\u0026lt;s:property value=」firstName」 /\u0026gt;。兩者都返回相同的結果,但使用不同的接入機制。 \u003c/p\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n \u0026lt;s:push\u0026gt;標籤節省鍵入幾個字符,看不出有什麼真正的值在後面。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003ch2\u003e 4. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\t\u0026lt;action name=\"pushTagAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.PushTagAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;pages/push.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. 執行結果 \u003c/h2\u003e \n\u003cp\u003e http://localhost:8080/struts2pushtag/pushTagAction.action \u003c/p\u003e \n\u003cp\u003e 在瀏覽器中打開上面的網址,顯示結果如下: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/push-1.png\" alt=\"Struts2 \u003cs:push\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/push.html\"\u003eStruts2 \u0026lt;s:push\u0026gt;標籤文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv\u003e \n \u003cspan\u003e\u003cspan\u003e下載代碼 -\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1o6Eh5TS\"\u003ehttp://pan.baidu.com/s/1o6Eh5TS\u003c/a\u003e \u003c/span\u003e\u003c/span\u003e \n\u003c/div\u003e \n\u003cp\u003e\u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"ec:T109d,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n Struts2\u0026nbsp;\u0026lt;s:set\u0026gt;標籤用於分配值在指定範圍內的變量(應用,會話,請求,頁面,或動作),默認的範圍是動作。下面來看一個完整的\u0026lt;s:set\u0026gt;標籤的例子: \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 「value」是指任何硬編碼字符串,屬性值或是任何可以參考的東西。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003ch2\u003e 1. 動作 \u003c/h2\u003e \n\u003cdiv\u003e\n Action類有\u0026nbsp;「msg」\u0026nbsp;屬性。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eSetTagAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class SetTagAction extends ActionSupport{\r\n\r\n\tprivate String msg = \"Struts 2 is a funny framework\";\r\n\t\r\n\tpublic String getMsg() {\r\n\t\treturn msg;\r\n\t}\r\n\r\n\tpublic String execute() throws Exception {\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. \u0026lt;s:set\u0026gt;標籤示例 \u003c/h2\u003e \n\u003cdiv\u003e\n 它展示瞭如何使用\u0026lt;s:set\u0026gt;標籤。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eset.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\u0026lt;title\u0026gt;www.yiibai.com\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 set tag example\u0026lt;/h1\u0026gt;\r\n\u0026lt;div\u0026gt;\u0026lt;div class=\"ads-in-post hide_if_width_less_800\"\u0026gt;\r\n\u0026lt;script async src=\"//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\"\u0026gt;\u0026lt;/script\u0026gt;\r\n\u0026lt;!-- 728x90 - After2ndH4 --\u0026gt;\r\n\u0026lt;ins class=\"adsbygoogle hide_if_width_less_800\" \r\n style=\"display:inline-block;width:728px;height:90px\"\r\n data-ad-client=\"ca-pub-2836379775501347\"\r\n data-ad-slot=\"3642936086\"\r\n\t data-ad-region=\"yiibairegion\"\u0026gt;\u0026lt;/ins\u0026gt;\r\n\u0026lt;script\u0026gt;\r\n(adsbygoogle = window.adsbygoogle || []).push({});\r\n\u0026lt;/script\u0026gt;\r\n\u0026lt;/div\u0026gt;\u0026lt;/div\u0026gt;\u0026lt;h2\u0026gt;1. \u0026lt;s:set var=\"varMsg\" value=\"msg\" /\u0026gt;\u0026lt;/h2\u0026gt;\r\n\r\n\u0026lt;s:set var=\"varMsg\" value=\"msg\" /\u0026gt;\r\n\u0026lt;s:property value=\"varMsg\" /\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;2. \u0026lt;s:set var=\"varUrl\" value=\"%{'http://www.yiibai.com'}\" /\u0026gt;\u0026lt;/h2\u0026gt; \r\n\r\n\u0026lt;s:set var=\"varUrl\" value=\"%{'http://www.yiibai.com'}\" /\u0026gt;\r\n\u0026lt;s:property value=\"varUrl\" /\u0026gt;\r\n\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003e它是如何工作的?\u003c/strong\u003e \u003c/p\u003e \n\u003cp\u003e 1. \u0026lt;s:set var=」varMsg」 value=」msg」 /\u0026gt; \u003c/p\u003e \n\u003cp\u003e 調用動作的\u0026nbsp;getMsg()方法返回的值賦給變量名爲\u0026nbsp;「varMsg「. \u003c/p\u003e \n\u003cp\u003e 2. \u0026lt;s:set var=」varUrl」 value=」%{‘http://www.yiibai.com’}」 /\u0026gt; \u003c/p\u003e \n\u003cp\u003e 硬編碼字符串,並將其分配給一個名爲變量\u0026nbsp;「varUrl「. \u003c/p\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 賦值給一個變量,而不是屬性值。 \n \u003c/div\u003e \n \u003cp\u003e 例如, \u003c/p\u003e \n \u003cpre\u003epublic class SetTagAction extends ActionSupport{\r\n\r\n\tprivate String msg;\r\n\t\r\n\tpublic String setMsg(String msg) {\r\n\t\tthis.msg = msg;\r\n\t}\r\n\t...\u003c/pre\u003e \n \u003cpre\u003e\u0026lt;s:set var=\"msg\" value=\"%{'this is a message'}\" /\u0026gt;\u003c/pre\u003e \n \u003cdiv\u003e\n 許多Struts\u0026nbsp;2的開發者認爲,\u0026lt;s:set\u0026gt;標籤\u0026nbsp;var=「smsg」,將通過指定setMsg()方法將值相關的動作類。 \n \u003c/div\u003e \n \u003cp\u003e 這是錯誤的,\u0026lt;s:set\u0026gt;標籤將不會調用setMsg()方法,它只會以名爲「msg」分配「value」到變量。沒有動作屬性值。 \u003c/p\u003e \n\u003c/div\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\t\u0026lt;action name=\"setTagAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.SetTagAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;pages/set.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. 示例 \u003c/h2\u003e \n\u003cp\u003e http://localhost:8080/struts2settag/setTagAction.action \u003c/p\u003e \n\u003cp\u003e 在瀏覽器中打開上面的網址,輸出結果如下: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/set-1.png\" alt=\"Struts2 \u003cs:set\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/set.html\"\u003eStruts2 \u0026lt;s:set\u0026gt;標籤文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e 代碼下載 -\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1mgs6Tle\"\u003ehttp://pan.baidu.com/s/1mgs6Tle\u003c/a\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"ed:T1018,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e\n Struts2\u0026nbsp;\u0026lt;s:text\u0026gt;標籤是用來從資源包獲取捆綁動作類的消息。並按照三個序列: \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003col\u003e \n \u003cli\u003e 顯示來自資源包的消息,按照Struts2的資源包搜索順序。 \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 如果未在資源包中找到消息,則標籤的本身會被顯示。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 如果標記的主體是空的,在\u0026lt;s:text\u0026gt;標籤「name」屬性的值將被顯示。 \n \u003c/div\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv\u003e\n 一個完整的例子: \n\u003c/div\u003e \n\u003ch2\u003e 1. 動作 \u003c/h2\u003e \n\u003cdiv\u003e\n Action類轉發請求。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eTextTagAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class TextTagAction extends ActionSupport{\r\n\r\n\tpublic String execute() throws Exception {\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2.\u0026nbsp;屬性文件 \u003c/h2\u003e \n\u003cdiv\u003e\n 一個簡單的屬性文件有兩個鍵「name.msg」和「name.msg.param」。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eTextTagAction.properies\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003ename.msg = \"This is a message from properties file\"\r\nname.msg.param = \"This is a message from properties file - param : {0}\"\u003c/pre\u003e \n\u003ch2\u003e 3. \u0026lt;s:text\u0026gt;標籤示例 \u003c/h2\u003e \n\u003cdiv\u003e\n 它顯示了\u0026lt;s:text\u0026gt;標籤的使用。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003etext.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\u0026lt;title\u0026gt;www.yiibai.com\u0026lt;/title\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts2 text標籤示例\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;1.\u0026lt;s:text name=\"name.msg\" /\u0026gt;\u0026lt;/h2\u0026gt; \r\nOutput : \u0026lt;s:text name=\"name.msg\" /\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;2. \u0026lt;s:text name=\"name.msg.unknow\"\u0026gt;message doesn't exists\u0026lt;/s:text\u0026gt;\u0026lt;/h2\u0026gt; \r\nOutput : \u0026lt;s:text name=\"name.msg.unknow\"\u0026gt;message doesn't exists\u0026lt;/s:text\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;3. \u0026lt;s:text name=\"name.msg.unknow\" /\u0026gt;\u0026lt;/h2\u0026gt; \r\nOutput : \u0026lt;s:text name=\"name.msg.unknow\" /\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;4. \u0026lt;s:text name=\"name.msg.param\" \u0026gt;\u0026lt;s:param \u0026gt;yiibai\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:text\u0026gt;\u0026lt;/h2\u0026gt; \r\nOutput :\r\n\u0026lt;s:text name=\"name.msg.param\" \u0026gt;\r\n\t\u0026lt;s:param \u0026gt;yiibai\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:text\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003e它是如何工作的?\u003c/strong\u003e\u003cbr\u003e 1. \u0026lt;s:text name=」name.msg」 /\u0026gt; \u003c/p\u003e \n\u003cp\u003e 從資源包獲取並顯示消息(TextTagAction.properies)關聯當前動作類\u0026nbsp;(TextTagAction.action). \u003c/p\u003e \n\u003cpre\u003e\"This is a message from properties file\"\u003c/pre\u003e \n\u003cp\u003e 2. \u0026lt;s:text name=」name.msg.unknow」\u0026gt;message doesn’t exists\u0026lt;/s:text\u0026gt; \u003c/p\u003e \n\u003cdiv\u003e\n 鍵不在資源包「TextTagAction.properies」或搜索順序中,所以顯示標記的主體。 \n\u003c/div\u003e \n\u003cpre\u003emessage doesn't exists\u003c/pre\u003e \n\u003cp\u003e 3. \u0026lt;s:text name=」name.msg.unknow」 /\u0026gt; \u003c/p\u003e \n\u003cdiv\u003e\n 標籤的資源包和主體的消息未找到,所以顯示在「name」屬性的值。 \n\u003c/div\u003e \n\u003cpre\u003ename.msg.unknow\u003c/pre\u003e \n\u003cp\u003e 4. \u0026lt;s:text name=」name.msg.param」 \u0026gt;\u0026lt;s:param \u0026gt;yiibai\u0026lt;/s:param\u0026gt;\u0026lt;/s:text\u0026gt; \u003c/p\u003e \n\u003cdiv\u003e\n 通過\u0026lt;s:param\u0026gt;標記傳遞參數到資源包。 \n\u003c/div\u003e \n\u003cpre\u003e\"This is a message from properties file - param : yiibai\"\u003c/pre\u003e \n\u003ch2\u003e 4. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\t\u0026lt;action name=\"textTagAction\" \r\n\t\t\tclass=\"com.yiibai.common.action.TextTagAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;/pages/text.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. 執行結果 \u003c/h2\u003e \n\u003cp\u003e http://localhost:8080/struts2texttag/textTagAction.action \u003c/p\u003e \n\u003cp\u003e 在瀏覽器中打開上面的網址,顯示結果如下所示: \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/text.html\"\u003eStruts2 \u0026lt;s:text\u0026gt;標籤文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cdiv\u003e\n 下載代碼 -\u0026nbsp; \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"ee:T13dd,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n Struts2\u0026nbsp;\u0026lt;s:url\u0026gt;標籤被用來創建一個URL,並輸出它作爲文本格式。它從不通過自己的工作,但它可以提供URL鏈接到其他標籤,如\u0026lt;s:a\u0026gt;創建超鏈接或\u0026lt;img\u0026gt;渲染圖像。在本教程中,它顯示 Struts2\u0026nbsp;\u0026lt;s:url\u0026gt;標籤的5種常見用法。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003ch2\u003e 1. 動作 \u003c/h2\u003e \n\u003cdiv\u003e\n Action類轉發請求。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eURLTagAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class URLTagAction extends ActionSupport{\r\n\t\r\n\tpublic String execute() {\r\n\t\treturn SUCCESS;\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. \u0026lt;s:url\u0026gt;標籤示例 \u003c/h2\u003e \n\u003cdiv\u003e\n 這裏舉5個例子來說明如何使用Struts2\u0026nbsp;\u0026lt;s:url\u0026gt;\u0026nbsp;標籤。 \n\u003c/div\u003e \n\u003col\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 創建圖片URL。 \n \u003c/div\u003e \u003cpre\u003e\u0026lt;img src=\"\u0026lt;s:url value=\"/images/man.jpg\"/\u0026gt;\" /\u0026gt;\u003c/pre\u003e \n \u003cdiv\u003e\n 輸出(假設根上下文名稱爲「Struts2Example」) \n \u003c/div\u003e \u003cpre\u003e\u0026lt;img src=\"/Struts2Example/images/man.jpg\" /\u0026gt;\u003c/pre\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 創建一個「Google」文字,並將其鏈接到 \n \u003ca href=\"http://www.google.com/\"\u003ehttp://www.google.com\u003c/a\u003e。 \n \u003c/div\u003e \u003cpre\u003e\u0026lt;a href=\"\u0026lt;s:url value=\"http://www.google.com\" /\u0026gt;\" target=\"_blank\"\u0026gt;Google\u0026lt;/a\u0026gt;\u003c/pre\u003e \u003cp\u003e 輸出 \u003c/p\u003e \u003cpre\u003e\u0026lt;a href=\"http://www.google.com\" target=\"_blank\"\u0026gt;Google\u0026lt;/a\u0026gt; \u0026nbsp;\u003c/pre\u003e \n \u003cdiv\u003e\n 當以「http」或「www」字符開始定義URL值,在Struts\u0026nbsp;2將呈現它,因爲它是不增加額外的根上下文的域名爲example1。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 創建操作URL以「id」參數,並輸出它作爲文本格式。 \n \u003c/div\u003e \u003cpre\u003e\u0026lt;s:url action=\"urlTagAction.action\" \u0026gt;\r\n \u0026lt;s:param name=\"id\"\u0026gt;123\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:url\u0026gt;\u003c/pre\u003e \u003cp\u003e 輸出 \u003c/p\u003e \u003cpre\u003e/Struts2Example/urlTagAction.action?id=123\u003c/pre\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 使用「name」參數來創建操作URL,並用\u0026lt;s:a\u0026gt;組合通過\u0026lt;s:property\u0026gt;標籤。 \n \u003c/div\u003e \u003cpre\u003e\u0026lt;s:url action=\"urlTagAction.action\" var=\"urlTag\" \u0026gt;\r\n \u0026lt;s:param name=\"name\"\u0026gt;yiibai\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:url\u0026gt;\r\n\u0026lt;a href=\"\u0026lt;s:property value=\"#urlTag\" /\u0026gt;\" \u0026gt;URL Tag Action (via property)\u0026lt;/a\u0026gt;\u003c/pre\u003e \u003cp\u003e 輸出 \u003c/p\u003e \u003cpre\u003e\u0026lt;a href=\"/Struts2Example/urlTagAction.action?name=yiibai\" \u0026gt;URL Tag Action (via property)\u0026lt;/a\u0026gt;\u003c/pre\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 使用 「age」 參數創建操作URL,並用\u0026lt;s:a\u0026gt;通過組合「%{urlTag}標記。 \n \u003c/div\u003e \u003cpre\u003e\u0026lt;s:url action=\"urlTagAction.action\" var=\"urlTag\" \u0026gt;\r\n \u0026lt;s:param name=\"age\"\u0026gt;99\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:url\u0026gt;\r\n\u0026lt;s:a href=\"%{urlTag}\"\u0026gt;URL Tag Action (via %)\u0026lt;/s:a\u0026gt;\u003c/pre\u003e \u003cp\u003e 輸出 \u003c/p\u003e \u003cpre\u003e\u0026lt;a href=\"/Struts2Example/urlTagAction.action?age=99\"\u0026gt;URL Tag Action (via %)\u0026lt;/a\u0026gt;\u003c/pre\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e 全部的JSP代碼 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eurl.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n \u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 URL tag example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;ol\u0026gt;\r\n\u0026lt;li\u0026gt;\r\n\u0026lt;img src=\"\u0026lt;s:url value=\"/images/man.jpg\"/\u0026gt;\" /\u0026gt;\r\n\u0026lt;/li\u0026gt;\r\n\r\n\u0026lt;li\u0026gt;\r\n\u0026lt;a href=\"\u0026lt;s:url value=\"http://www.google.com\" /\u0026gt;\" target=\"_blank\"\u0026gt;Google\u0026lt;/a\u0026gt;\r\n\u0026lt;/li\u0026gt;\r\n\r\n\u0026lt;li\u0026gt;\r\n\u0026lt;s:url action=\"urlTagAction.action\" \u0026gt;\r\n \u0026lt;s:param name=\"id\"\u0026gt;123\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:url\u0026gt;\r\n\u0026lt;/li\u0026gt;\r\n\r\n\u0026lt;li\u0026gt;\r\n\u0026lt;s:url action=\"urlTagAction.action\" var=\"urlTag\" \u0026gt;\r\n \u0026lt;s:param name=\"name\"\u0026gt;yiibai\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:url\u0026gt;\r\n\u0026lt;a href=\"\u0026lt;s:property value=\"#urlTag\" /\u0026gt;\" \u0026gt;URL Tag Action (via property)\u0026lt;/a\u0026gt;\r\n\u0026lt;/li\u0026gt;\r\n\r\n\u0026lt;li\u0026gt;\r\n\u0026lt;s:url action=\"urlTagAction.action\" var=\"urlTag\" \u0026gt;\r\n \u0026lt;s:param name=\"age\"\u0026gt;99\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:url\u0026gt;\r\n\u0026lt;s:a href=\"%{urlTag}\"\u0026gt;URL Tag Action (via %)\u0026lt;/s:a\u0026gt;\r\n\u0026lt;/li\u0026gt;\r\n\r\n\u0026lt;/ol\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\r\n\t\u0026lt;action name=\"urlTagAction\" \r\n\t\tclass=\"com.yiibai.common.action.URLTagAction\" \u0026gt;\r\n\t\t\u0026lt;result name=\"success\"\u0026gt;/pages/url.jsp\u0026lt;/result\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n \u0026lt;/package\u0026gt;\t\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. 示例 \u003c/h2\u003e \n\u003cp\u003e http://localhost:8080/struts2urltag/urlTagAction.action \u003c/p\u003e \n\u003cp\u003e 在瀏覽器中打上面的網址,它顯示結果如下圖: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/url-1.png\" alt=\"Struts2 \u003cs:url\u003e標籤示例\"\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.14/docs/url.html\"\u003eStruts2 \u0026lt;s:url\u0026gt;標籤文檔\u003c/a\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e 代碼下載 -\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1c0gBXeC\"\u003ehttp://pan.baidu.com/s/1c0gBXeC\u003c/a\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"ef:Te1b,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e\n 要使用資源包從屬性文件檢索消息,必須瞭解Struts2的資源包搜索順序: \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003ch2\u003e \n \u003cdiv\u003e\n 資源包搜索順序 \n \u003c/div\u003e \u003c/h2\u003e \n\u003cdiv\u003e\n 資源包中搜索按以下順序: \n\u003c/div\u003e \n\u003col\u003e \n \u003cli\u003e ActionClass.properties \u003c/li\u003e \n \u003cli\u003e Interface.properties \u003c/li\u003e \n \u003cli\u003e BaseClass.properties \u003c/li\u003e \n \u003cli\u003e ModelDriven’s model \u003c/li\u003e \n \u003cli\u003e package.properties \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 搜索國際化消息鍵的層次結構本身 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 全局資源屬性 \n \u003c/div\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 請參閱 \n \u003ca href=\"http://struts.apache.org/docs/localization.html\"\u003eStruts2資源包\u003c/a\u003e文檔詳細解釋。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e 在實踐中,是不可能組織屬性的文件的順序。所以,只要瞭解幾個常用的搜索順序應該是足夠了:\u0026nbsp;package.properties\u0026nbsp;和\u0026nbsp;global resource properties。參見下圖: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-19.png\" alt=\"Struts2資源包使用示例\"\u003e \u003c/p\u003e \n\u003cdiv\u003e\n 如果com.yiibai.user.action.LoginAction想通過資源包獲得消息,它將搜索 \n\u003c/div\u003e \n\u003col\u003e \n \u003cli\u003e com.yiibai.user.action.LoginAction.properties (找到,退出,否則下一個) \u003c/li\u003e \n \u003cli\u003e com.yiibai.user.action.package.properties (找到,退出,否則下一個) \u003c/li\u003e \n \u003cli\u003e com.yiibai.user.package.properties (找到,退出,否則下一個)\u003cbr\u003e …一路不斷在每個父目錄的根目錄查找package.properties \u003c/li\u003e \n \u003cli\u003e 查找全局資源屬性,如果將其配置在應用程序中。 \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 明白這搜索順序可以給你更多的信心來決定正確的文件夾的屬性文件。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003ch2\u003e \n \u003cdiv\u003e\n 獲取資源包 \n \u003c/div\u003e \u003c/h2\u003e \n\u003cdiv\u003e\n 下面是訪問該資源包的幾個例子: \n\u003c/div\u003e \n\u003cp\u003e P.S ‘username.required‘ \u0026nbsp;和 ‘username‘\u0026nbsp;在一個屬性文件中的鍵。 \u003c/p\u003e \n\u003ch2\u003e 1. 動作類 \u003c/h2\u003e \n\u003cdiv\u003e\n 在Action類,可以擴展了ActionSupport和通過getText(‘key’)\u0026nbsp;函數獲取資源包。 \n\u003c/div\u003e \n\u003cpre\u003e...\r\npublic class LoginAction extends ActionSupport{\r\n\t...\r\n\tpublic void validate(){\r\n\t\tif(\"\".equals(getUsername())){\r\n\t\t\taddFieldError(\"username\", getText(\"username.required\"));\r\n\t\t}\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 2. \u0026lt;s:property\u0026gt;標籤 \u003c/h2\u003e \n\u003cp\u003e 在屬性標記,使用\u0026nbsp;getText(‘key’). \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:property value=\"getText('username')\" /\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. \u0026lt;s:text\u0026gt;標籤 \u003c/h2\u003e \n\u003cdiv\u003e\n 在text標籤,設置「name」屬性的鍵。 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;s:text name=\"username\" /\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 4. Key屬性 \u003c/h2\u003e \n\u003cp\u003e UI組件的主要屬性有特殊的功能,查看這個key屬性例子詳細信息。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:textfield key=\"username\" /\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. I18n標籤 \u003c/h2\u003e \n\u003cp\u003e 國際化i18n\u0026nbsp;標籤可以從「name」屬性聲明指定資源包得到消息。在這個例子中,它要求從com/yiibai/user/package.properties文件中以獲得\u0026nbsp;「username」\u0026nbsp;的消息。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;s:i18n name=\"com.yiibai.user.package\" \u0026gt;\r\n \u0026lt;s:text name=\"username\" /\u0026gt;\r\n\u0026lt;/s:i18n\u0026gt;\u0026nbsp;\u003c/pre\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 訪問 URL\u0026nbsp; \n \u003ca href=\"http://localhost:8080/struts2resourcebundle/user/login.action\"\u003ehttp://localhost:8080/struts2resourcebundle/user/login.action\u003c/a\u003e,輸出以下結果: \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-20.png\" alt=\"Struts2資源包使用示例\"\u003e \n \u003cbr\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cp\u003e 下載完整的項目實踐(struts2resourcebundle)\u0026nbsp;–\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1dD2UQ2l\"\u003ehttp://pan.baidu.com/s/1dD2UQ2l\u003c/a\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"f0:T1f8e,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n Struts\u0026nbsp;2的國際化(I18N)和本地化(i10n)或多語言的例子,來說明如何使用資源包來顯示不同語言的消息。在這個例子中,您將創建一個簡單的登錄屏幕,通過Struts\u0026nbsp;2的UI組件顯示來自資源包的消息,\u0026nbsp;並更改基於所選的語言選項的語言環境。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003ch2\u003e 1. 工程結構 \u003c/h2\u003e \n\u003cp\u003e 項目結構,如下圖片顯示: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-21.png\" alt=\"Struts2本地化和國際化\"\u003e \u003c/p\u003e \n\u003ch2\u003e 2. Properties文件 \u003c/h2\u003e \n\u003cdiv\u003e\n 確保屬性文件命名爲國家指定的代碼。 \n\u003c/div\u003e \n\u003cdiv\u003e\n 在一些「非歐洲」或「非英語」之類的字符,應該始終編碼的內容\u0026nbsp;native2ascii屬性 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eglobal.properties\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e#Global messages\r\nglobal.username = Username\r\nglobal.password = Password\r\nglobal.submit = Submit\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eglobal_zh_CN.properties\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e#Global messages\r\nglobal.username = \\u7528\\u6237\\u540d\r\nglobal.password = \\u5bc6\\u7801\r\nglobal.submit=\\u63d0\\u4ea4\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eglobal_fr.properties\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e#Global messages\r\nglobal.username = Nom d'utilisateur\r\nglobal.password = Mot de passe\r\nglobal.submit = Soumettre\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eglobal_de.properties\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e#Global messages\r\nglobal.username = Benutzername\r\nglobal.password = Kennwort\r\nglobal.submit = Einreichen\u0026nbsp;\u003c/pre\u003e \n\u003cdiv\u003e\n 請仔細閱讀Struts2資源包的例子來了解Struts\u0026nbsp;2的自動搜索屬性文件。 \n\u003c/div\u003e \n\u003ch2\u003e 3. 動作類 \u003c/h2\u003e \n\u003cp\u003e 兩個動作類,LocaleAction基本上是什麼都不做,\u0026nbsp;而 LoginAction 會做一個簡單的驗證和通過gettext()顯示來自資源包錯誤信息。 \u003c/p\u003e \n\u003cp\u003e LocaleAction.java \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class LocaleAction extends ActionSupport{\r\n\r\n\t//business logic\r\n\tpublic String execute() {\r\n\t\treturn \"SUCCESS\";\r\n\t}\r\n}\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eLoginAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.user.action;\r\n\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class LoginAction extends ActionSupport{\r\n\r\n\tprivate String username;\r\n\tprivate String password;\r\n\t \r\n\t//...getter and setter methods\r\n\r\n\t//business logic\r\n\tpublic String execute() {\r\n\t\treturn \"SUCCESS\";\r\n\t}\r\n\r\n\t//simple validation\r\n\tpublic void validate(){\r\n\t\tif(\"\".equals(getUsername())){\r\n\t\t\taddFieldError(\"username\", getText(\"username.required\"));\r\n\t\t}\r\n\t\tif(\"\".equals(getPassword())){\r\n\t\t\taddFieldError(\"password\", getText(\"password.required\"));\r\n\t\t}\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 4. 視圖頁面 \u003c/h2\u003e \n\u003cdiv\u003e\n 一個登錄頁面帶有一個文本框,密碼和提交UI組件。 \n\u003c/div\u003e \n\u003cdiv\u003e\n 爲了支持Struts2\u0026nbsp;本地化,必須聲明\u0026nbsp;\u0026lt;%@\u0026nbsp;page\u0026nbsp;contentType=」text/html;charset=UTF-8″\u0026nbsp;%\u0026gt;在您的視圖頁面,否則能將有問題的「UTF-8數據」正確顯示,尤其是中國漢字。閱讀這篇文章,關於Struts2中國本土化問題。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003elogin.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ page contentType=\"text/html;charset=UTF-8\" %\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 localization example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:form action=\"validateUser\" namespace=\"/user\"\u0026gt;\r\n\r\n\t\u0026lt;s:textfield key=\"global.username\" name=\"username\" /\u0026gt;\r\n\t\u0026lt;s:password key=\"global.password\" name=\"password\"/\u0026gt;\t\r\n\t\u0026lt;s:submit key=\"global.submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;s:url id=\"localeEN\" namespace=\"/\" action=\"locale\" \u0026gt;\r\n \u0026lt;s:param name=\"request_locale\" \u0026gt;en\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:url\u0026gt;\r\n\u0026lt;s:url id=\"localezhCN\" namespace=\"/\" action=\"locale\" \u0026gt;\r\n \u0026lt;s:param name=\"request_locale\" \u0026gt;zh_CN\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:url\u0026gt;\r\n\u0026lt;s:url id=\"localeDE\" namespace=\"/\" action=\"locale\" \u0026gt;\r\n \u0026lt;s:param name=\"request_locale\" \u0026gt;de\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:url\u0026gt;\r\n\u0026lt;s:url id=\"localeFR\" namespace=\"/\" action=\"locale\" \u0026gt;\r\n \u0026lt;s:param name=\"request_locale\" \u0026gt;fr\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:url\u0026gt;\r\n\r\n\u0026lt;s:a href=\"%{localeEN}\" \u0026gt;English\u0026lt;/s:a\u0026gt;\r\n\u0026lt;s:a href=\"%{localezhCN}\" \u0026gt;Chinese\u0026lt;/s:a\u0026gt;\r\n\u0026lt;s:a href=\"%{localeDE}\" \u0026gt;German\u0026lt;/s:a\u0026gt;\r\n\u0026lt;s:a href=\"%{localeFR}\" \u0026gt;France\u0026lt;/s:a\u0026gt;\r\n \r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u0026nbsp;\u003c/pre\u003e \n\u003cdiv\u003e\n 要更改默認的語言環境,只需要聲明「request_locale」參數,設置你喜歡的語言代碼,並傳遞給一個Action類。在 Struts2中,com.opensymphony.xwork2.interceptor.I18nInterceptor\u0026nbsp;攔截器,\u0026nbsp;在 struts-default.xml中聲明將攔截Action類,並相應地處理語言環境。 \n\u003c/div\u003e \n\u003ch2\u003e 5.\u0026nbsp;顯示資源包的消息? \u003c/h2\u003e \n\u003cdiv\u003e\n 在Struts2,有很多的方式來顯示所選擇的語言或語言環境的資源包的信息。有關示例, \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;s:textfield key=\"global.username\" name=\"username\" /\u0026gt;\r\n\u0026lt;s:text name=\"global.username\" /\u0026gt;\t\r\n\u0026lt;s:property value=\"getText('global.username')\" /\u0026gt;\r\n\u0026lt;s:text name=\"global.password\" /\u0026gt;\u0026nbsp;\u003c/pre\u003e \n\u003cdiv\u003e\n 在Struts1,有一個標準的\u0026nbsp;bean:message\u0026nbsp;來顯示資源包的消息。但是在Struts\u0026nbsp;2中,有這麼多相當於顯示資源包的消息(甚至內部的工作不同)方式,基本上,無論選擇的是什麼,在 Struts2 也將顯示正確的資源包的消息。 \n\u003c/div\u003e \n\u003ch2\u003e 6. struts.xml \u003c/h2\u003e \n\u003cdiv\u003e\n Struts2 的配置文件,鏈接一起。 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n\t\u0026lt;constant name=\"struts.custom.i18n.resources\" value=\"global\" /\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \t\r\n\t\u0026lt;package name=\"user\" namespace=\"/user\" extends=\"struts-default\"\u0026gt;\r\n\t \u0026lt;action name=\"login\"\u0026gt;\r\n\t\t\u0026lt;result\u0026gt;/pages/login.jsp\u0026lt;/result\u0026gt;\r\n\t \u0026lt;/action\u0026gt;\r\n\t \u0026lt;action name=\"validateUser\" class=\"com.yiibai.user.action.LoginAction\"\u0026gt;\r\n\t\t\u0026lt;result name=\"SUCCESS\"\u0026gt;/pages/welcome.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;result name=\"input\"\u0026gt;/pages/login.jsp\u0026lt;/result\u0026gt;\r\n\t \u0026lt;/action\u0026gt;\r\n\t\u0026lt;/package\u0026gt;\r\n\t\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t \u0026lt;action name=\"locale\" class=\"com.yiibai.common.action.LocaleAction\"\u0026gt;\r\n\t\t\u0026lt;result name=\"SUCCESS\"\u0026gt;/user/pages/login.jsp\u0026lt;/result\u0026gt;\r\n\t \u0026lt;/action\u0026gt;\r\n\t\u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 7. 示例 \u003c/h2\u003e \n\u003cp\u003e http://localhost:8080/i18nlocalization/user/login.action \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-22.png\" alt=\"Struts2本地化和國際化\"\u003e \u003c/p\u003e \n\u003cp\u003e http://localhost:8080/i18nlocalization/locale.action?request_locale=en \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-22.png\" alt=\"Struts2本地化和國際化\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cp\u003e http://localhost:8080/i18nlocalization/locale.action?request_locale=zh_CN \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-23.png\" alt=\"Struts2本地化和國際化\"\u003e \u003c/p\u003e \n\u003cp\u003e http://localhost:8080/i18nlocalization/locale.action?request_locale=de \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-24.png\" alt=\"Struts2本地化和國際化\"\u003e \u003c/p\u003e \n\u003cp\u003e http://localhost:8080/i18nlocalization/locale.action?request_locale=fr \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-25.png\" alt=\"Struts2本地化和國際化\"\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/localization.html\"\u003ehttp://struts.apache.org/2.1.8/docs/localization.html\u003cbr\u003e \u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e http://www.yiibai.com/java/java-convert-chinese-character-to-unicode-with-native2ascii/ \u003c/li\u003e \n \u003cli\u003e http://www.yiibai.com/struts2/struts-2-resource-bundle-example/ \u003c/li\u003e \n \u003cli\u003e http://www.yiibai.com/struts/struts-internationalizing-or-localization-example/ \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e 代碼下載 -\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1jGCUaJ8\"\u003ehttp://pan.baidu.com/s/1jGCUaJ8\u003c/a\u003e \u003c/p\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"f1:T92a,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n 在Struts2,在UI組件的「key」屬性來處理本地化的常用方法,也是編碼UI標籤的一個非常有效的方式。見下面兩種情況: \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003ch2\u003e 1. Properties屬性文件 \u003c/h2\u003e \n \u003cdiv\u003e\n 屬性文件包含一條消息。 \n \u003c/div\u003e \n \u003cp\u003e \u003cstrong\u003eglobal.properties\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003eglobal.username = Username\u003c/pre\u003e \n \u003ch2\u003e 2. 示例1 \u003c/h2\u003e \n \u003cp\u003e 如果分配一個「key」屬性到一個文本框。鍵(key)屬性會從資源包中獲取信息,並使其在默認XHTML\u0026nbsp;text.tfl模板基礎上渲染。 \u003c/p\u003e \n \u003cpre\u003e\u0026lt;s:form action=\"validateUser\"\u0026gt;\r\n\t\u0026lt;s:textfield key=\"global.username\" /\u0026gt;\r\n\u0026lt;/s:form\u0026gt;\u003c/pre\u003e \n \u003cdiv\u003e\n 現在它將會使用「global.username\u0026nbsp;{left-side}」和\u0026nbsp;「Username\u0026nbsp;{right-side}」,並匹配相應的XHTML\u0026nbsp;text.tfl模板。 \n \u003c/div\u003e \n \u003cpre\u003e\u0026lt;td class=\"tdLabel\"\u0026gt;\r\n \u0026lt;label for=\"validateUser_{left-side}\" class=\"label\"\u0026gt;{right-side}:\u0026lt;/label\u0026gt;\r\n\u0026lt;/td\u0026gt;\r\n\u0026lt;td\u0026gt;\r\n \u0026lt;input type=\"text\" name=\"{left-side}\" value=\"\" id=\"validateUser_{left-side}\"/\u0026gt;\r\n\u0026lt;/td\u0026gt;\u003c/pre\u003e \n \u003cp\u003e 最後的 HTML \u003c/p\u003e \n \u003cpre\u003e\u0026lt;td class=\"tdLabel\"\u0026gt;\r\n \u0026lt;label for=\"validateUser_global_username\" class=\"label\"\u0026gt;Username:\u0026lt;/label\u0026gt;\r\n\u0026lt;/td\u0026gt;\r\n\u0026lt;td\u0026gt;\r\n \u0026lt;input type=\"text\" name=\"global.username\" value=\"\" id=\"validateUser_global_username\"/\u0026gt;\r\n\u0026lt;/td\u0026gt;\u003c/pre\u003e \n \u003cdiv\u003e\n 鍵屬性將使用\u0026nbsp;{left-side}作爲文本框名稱和ID;\u0026nbsp;{right-side}\u0026nbsp;作爲標籤值。 \n \u003c/div\u003e \n \u003ch2\u003e 3. 示例2 \u003c/h2\u003e \n \u003cdiv\u003e\n 在某些情況下,可能需要顯式聲明的一個不同的名稱的文本框。 \n \u003c/div\u003e \n \u003cpre\u003e\u0026lt;s:form action=\"validateUser\"\u0026gt;\r\n\t\u0026lt;s:textfield key=\"global.username\" name=\"username\"/\u0026gt;\r\n\u0026lt;/s:form\u0026gt;\u0026nbsp;\u003c/pre\u003e \n \u003cp\u003e 現在key屬性將使用「Username\u0026nbsp;{right-side}」來只匹配的標籤值,\u0026nbsp;文本框的名稱和ID將明確覆蓋。 \u003c/p\u003e \n \u003cp\u003e 最後的 HTML \u003c/p\u003e \n \u003cpre\u003e\u0026lt;td class=\"tdLabel\"\u0026gt;\r\n \u0026lt;label for=\"validateUser_username\" class=\"label\"\u0026gt;Username:\u0026lt;/label\u0026gt;\r\n\u0026lt;/td\u0026gt;\r\n\u0026lt;td\u0026gt;\r\n \u0026lt;input type=\"text\" name=\"username\" value=\"\" id=\"validateUser_username\"/\u0026gt;\r\n\u0026lt;/td\u0026gt;\u003c/pre\u003e \n \u003cdiv\u003e \n \u003cdiv\u003e\n key屬性可以提高你的開發速度,使代碼更有效,這是值得學習的。 \n \u003c/div\u003e \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"f2:T2117,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n 一個 Struts2 的國際化定位的問題,用來顯示中國漢字... \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003ch2\u003e \n \u003cdiv\u003e\n 案例1:屬性有特殊字符的文件 \n \u003c/div\u003e \u003c/h2\u003e \n\u003cp\u003e 屬性文件存儲用戶名,密碼信息,並以中文字符提交。此屬性文件以UTF-8格式創建的,但內容不使用 native2ascii\u0026nbsp;編碼。 \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-22.jpg\" alt=\"Struts2中文本地化問題\"\u003e \u003c/p\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003cp\u003e 讓我們試着通過一些UI標籤,來顯示中國漢字。查看頁面聲明爲UTF-8格式的HTML元標記來顯示。 \u003c/p\u003e \n\u003cpre\u003e...\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" /\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n...\r\n\u0026lt;s:form action=\"validateUser\"\u0026gt;\r\n\t\u0026lt;s:textfield key=\"global.username\" name=\"username\"/\u0026gt;\r\n\t\u0026lt;s:password key=\"global.password\" name=\"password\"/\u0026gt;\t\r\n\t\u0026lt;s:submit key=\"global.submit\" name=\"submit\" /\u0026gt;\r\n\t\r\n\t\u0026lt;div\u0026gt;Testing 1 : \u0026lt;s:property value=\"getText('global.username')\" /\u0026gt;\u0026lt;/div\u0026gt;\r\n\t\u0026lt;div\u0026gt;Testing 2 : \u0026lt;s:text name=\"global.password\" /\u0026gt;\u0026lt;/div\u0026gt;\u0026lt;/br/\u0026gt;\r\n\u0026lt;/s:form\u0026gt;\r\n...\r\n\u0026lt;s:url id=\"localezhCN\" namespace=\"/\" action=\"locale\" \u0026gt;\r\n \u0026lt;s:param name=\"request_locale\" \u0026gt;zh_CN\u0026lt;/s:param\u0026gt;\r\n\u0026lt;/s:url\u0026gt;\r\n...\r\n\u0026lt;s:a href=\"%{localezhCN}\" \u0026gt;Chinese\u0026lt;/s:a\u0026gt;\r\n...\u003c/pre\u003e \n\u003cp\u003e 結果\u003cbr\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-26.png\" alt=\"Struts2中文本地化問題\"\u003e \u003c/p\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003cdiv\u003e\n 令人驚奇的是,以下三個UI標籤都能夠正確地顯示中國消息 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;s:textfield key=\"global.username\" name=\"username\"/\u0026gt;\r\n\u0026lt;s:password key=\"global.password\" name=\"password\"/\u0026gt;\t\r\nTesting 2 : \u0026lt;s:text name=\"global.password\" /\u0026gt;\u003c/pre\u003e \n\u003cdiv\u003e\n 然而,「s:submit」\u0026nbsp;和\u0026nbsp;「getText()」\u0026nbsp;卻無法顯示呢? \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 據Java的國際化文檔,要使用資源包正確顯示特殊字符,則必須用 native2ascii 工具進行處理。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e 深入到 TextProvider.getText()的源代碼後,它使用的資源\u0026nbsp;bundle.getString()來從資源包檢索的消息,所以不正確的消息是合理的。但是,爲什麼「s:text「,\u0026nbsp;「s:textfield」\u0026nbsp;和\u0026nbsp;「s:password」\u0026nbsp;能夠正確顯示了中文的消息,爲什麼「s:submit」會失敗?在有太多的問題,讓我們看看示例2... \u003c/p\u003e \n\u003ch2\u003e \n \u003cdiv\u003e\n 案例2:有特殊字符的屬性文件(編碼) \n \u003c/div\u003e \u003c/h2\u003e \n\u003cp\u003e 這一次,屬性文件使用native2ascii工具處理中國漢字的編碼正確。 \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-23.jpg\" alt=\"Struts2中文本地化問題\"\u003e \u003c/p\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003cp\u003e 結果如下所示: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-27.png\" alt=\"Struts2中文本地化問題\"\u003e \u003c/p\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003cp\u003e 其結果是完全逆轉,現在\u0026nbsp;「s:submit」\u0026nbsp;和\u0026nbsp;「getText()」\u0026nbsp;是能夠正確地顯示它,但其他UI組件失敗。\u0026nbsp;這裏是按預期方式工作的,因爲在Struts\u0026nbsp;2推薦使用getText(),以顯示國際化或本地化的消息。問題是,爲什麼「s:submit」會不同呢? \u003c/p\u003e \n\u003cdiv\u003e \n \u003ch2\u003e Struts2..哪裏有問題? \u003c/h2\u003e \n \u003cp\u003e 這裏有幾個問題: \u003c/p\u003e \n \u003col\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 爲什麼\u0026nbsp;s:submit\u0026nbsp;有如此不同的效果? \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \u003cspan\u003e對國際化應該是非常簡單的,爲什麼在Struts\u0026nbsp;2有這種問題?\u003c/span\u003e\u0026nbsp;\u003cspan\u003e或者我們誤解了Struts2 國際化如何工作了?\u003c/span\u003e \u003c/li\u003e \n \u003cli\u003e \u003cspan\u003e爲什麼有這麼多的方式來顯示來自資源包的消息?\u003c/span\u003e\u003cspan\u003e爲什麼不直接組織成一個方法?\u003c/span\u003e\u003cspan\u003e\u0026nbsp;\u003c/span\u003e\u003cspan\u003e在Struts1,只需使用「bean:message」,爲什麼Struts\u0026nbsp;2中它看起來很複雜?\u003c/span\u003e \u003c/li\u003e \n \u003cli\u003e \u003cspan\u003eStruts2的支持XML資源包?\u003c/span\u003e\u0026nbsp;我們可能\u003cspan\u003e不太喜歡用native2ascii工具對數據進行編碼爲UTF-8格式,\u003c/span\u003e\u003cspan\u003e它使屬性文件不可讀。\u0026nbsp;Apache\u0026nbsp;Wicket的在這個問題做了很好的工作,可能是在Struts\u0026nbsp;2中吸取教訓。\u003c/span\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 那麼,如何正確地在 Struts2 中顯示中國漢字? \n \u003c/div\u003e \u003c/li\u003e \n \u003c/ol\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 許多文章和教程使用以下方法來顯示資源包的消息: \n \u003c/div\u003e \n \u003cpre\u003e\u0026lt;s:text name=\"global.username\"/\u0026gt;\r\n\u0026lt;s:property value=\"getText('global.username')\"/\u0026gt;\u0026nbsp;\u003c/pre\u003e \n \u003cp\u003e \u003cspan\u003e然而,這僅適用於英國或一些「英語狀(歐洲)」 的字符,如法文,德文。\u003c/span\u003e\u003cspan\u003e但對中文或日文,這兩種方法將返回完全不同的輸出。真的不知道Struts2的本地化該怎麼辦了。\u003c/span\u003e \u003c/p\u003e \n\u003c/div\u003e \n\u003ch2\u003e 解決辦法 \u003c/h2\u003e \n\u003cdiv\u003e\n 問題是在HTML\u0026nbsp;meta標籤, \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;head\u0026gt;\r\n\u0026lt;meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" /\u0026gt;\r\n\u0026lt;/head\u0026gt;\u003c/pre\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 在Struts1,上述meta標籤必須正確顯示UTF-8的數據,但這在 Struts2 是有問題的。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cspan\u003e在Struts2,meta標籤不起作用,我們應該把\u0026nbsp;\u0026lt;%@\u0026nbsp;page\u0026nbsp;contentType=」text/html;charset=UTF-8″\u0026nbsp;%\u0026gt;標籤放在頁面的第一行。\u003c/span\u003e例如下面的代碼片斷: \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ page contentType=\"text/html;charset=UTF-8\" %\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n...\u003c/pre\u003e \n\u003cp\u003e 結果顯示如下: \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-28.png\" alt=\"Struts2中文本地化問題\"\u003e \u003c/p\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003cdiv\u003e\n 所有的中文消息正確顯示。 \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003ch2\u003e \n \u003cdiv\u003e\n 回答之前的問題 \n \u003c/div\u003e \u003c/h2\u003e \n \u003col\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 爲什麼\u0026nbsp;s:submit\u0026nbsp;有如此不同的效果? \n \u003c/div\u003e \u003cstrong\u003eA:\u0026nbsp;\u003c/strong\u003e\u003cspan\u003e暫無評論\u003c/span\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 對國際化應該是非常簡單的,爲什麼在Struts\u0026nbsp;2有這種問題?\u0026nbsp;或者我們誤解了Struts2\u0026nbsp;國際化如何工作了? \n \u003c/div\u003e \u003cstrong\u003eA:\u0026nbsp;\u003cstrong\u003e \n \u003cdiv\u003e\n 確保把 \n \u003c/div\u003e \u003c/strong\u003e\u003cstrong\u003e\u0026nbsp;\u003cstrong\u003e\u0026lt;%@ page contentType=」text/html;charset=UTF-8″ %\u0026gt;\u003c/strong\u003e」 放在頁面的第一行。\u003c/strong\u003e\u003c/strong\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 爲什麼有這麼多的方式來顯示來自資源包的消息?爲什麼不直接組織成一個方法?\u0026nbsp;在Struts1,只需使用「bean:message」,爲什麼Struts\u0026nbsp;2中它看起來很複雜? \n \u003c/div\u003e \u003cstrong\u003eA: s:text, key, getText(), name… ,\u0026nbsp;\u003cstrong\u003e \n \u003cdiv\u003e\n 所有的都能夠正確地顯示中文或UTF-8編碼的數據, \n \u003cstrong\u003e\u003cstrong\u003e \n \u003cdiv\u003e\n 只要確保把正確的「字符集」放在視圖頁面中。 \n \u003c/div\u003e \u003c/strong\u003e\u003c/strong\u003e \n \u003c/div\u003e \u003c/strong\u003e\u003c/strong\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n Struts2的支持XML資源包?\u0026nbsp;我們可能不太喜歡用native2ascii工具對數據進行編碼爲UTF-8格式,它使屬性文件不可讀。\u0026nbsp;Apache\u0026nbsp;Wicket的在這個問題做了很好的工作,可能是在Struts\u0026nbsp;2中吸取教訓。 \n \u003c/div\u003e \u003cstrong\u003eA:\u003c/strong\u003e\u003cspan\u003e希望在Struts2的下一版本可以支持在XML資源包。\u003c/span\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 那麼,如何正確地在\u0026nbsp;Struts2\u0026nbsp;中顯示中國漢字? \n \u003c/div\u003e \u003cstrong\u003eA: 看看上頁的解決辦法\u003c/strong\u003e \u003c/li\u003e \n \u003c/ol\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003cdiv\u003e \n \u003ch2\u003e 參考 \u003c/h2\u003e \n \u003col\u003e \n \u003cli\u003e http://www.yiibai.com/java/java-convert-chinese-character-to-unicode-with-native2ascii.html \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://forums.sun.com/thread.jspa?threadID=5185040\"\u003ehttp://forums.sun.com/thread.jspa?threadID=5185040\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://www.coderanch.com/t/452139/Struts/applicationresources-properties-utf-characters#2013557\"\u003ehttp://www.coderanch.com/t/452139/Struts/applicationresources-properties-utf-characters#2013557\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/docs/localization.html\"\u003ehttp://struts.apache.org/2.1.8/docs/localization.html\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://hxzon00.blog.163.com/blog/static/10489241620088121449163/\"\u003ehttp://hxzon00.blog.163.com/blog/static/10489241620088121449163/\u003c/a\u003e \u003c/li\u003e \n \u003c/ol\u003e \n \u003cdiv\u003e \n \u003cbr\u003e 下載代碼( \n \u003cspan\u003eglobalresource\u003c/span\u003e \n \u003cspan\u003e) –\u003c/span\u003e \n \u003cspan\u003e\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1mgzt3dQ\"\u003ehttp://pan.baidu.com/s/1mgzt3dQ\u003c/a\u003e\u003c/span\u003e \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"f3:Ta02,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n 通常情況下,您可能需要一個全局資源包(屬性文件)來存儲信息,可用於在應用程序中的所有類。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 在Struts2,有三種方式來配置全局資源包: \n \u003c/div\u003e \n \u003ch2\u003e 1. struts.properties \u003c/h2\u003e \n \u003cdiv\u003e\n 配置全局資源包在\u0026nbsp;「struts.properties」\u0026nbsp;文件,在這裏你定義一個名爲「global.properties」的屬性文件爲全局資源包。 \n \u003c/div\u003e \n \u003cpre\u003estruts.custom.i18n.resources = global\u003c/pre\u003e \n \u003cdiv\u003e\n 對於多個資源包,只是用逗號分隔屬性文件。 \n \u003c/div\u003e \n \u003cpre\u003estruts.custom.i18n.resources = global, another-properties-file\u003c/pre\u003e \n \u003ch2\u003e 2. struts.xml \u003c/h2\u003e \n \u003cdiv\u003e\n 或者,可以配置全局資源包在\u0026nbsp;struts.xml\u0026nbsp;配置文件中的常量值。 \n \u003c/div\u003e \n \u003cpre\u003e\u0026lt;struts\u0026gt;\r\n \u0026lt;constant name=\"struts.custom.i18n.resources\" value=\"global\" /\u0026gt; \t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n \u003ch2\u003e 3. listener \u003c/h2\u003e \n \u003cdiv\u003e\n 最後一個方法是使用servlet監聽器加載一個屬性文件作爲全局資源包。 \n \u003c/div\u003e \n \u003cpre\u003epackage com.yiibai.common.listener;\r\n\r\nimport javax.servlet.ServletContextEvent;\r\nimport javax.servlet.ServletContextListener;\r\n\r\nimport com.opensymphony.xwork2.util.LocalizedTextUtil;\r\n\r\npublic class GlobalMessagesListener implements ServletContextListener {\r\n\t \r\n\t private static final String DEFAULT_RESOURCE = \"global\";\r\n\r\n\t public void contextInitialized(ServletContextEvent arg0) {\r\n\t LocalizedTextUtil.addDefaultResourceBundle(DEFAULT_RESOURCE);\r\n\t }\r\n\r\n\t public void contextDestroyed(ServletContextEvent arg0) {\r\n\t }\r\n}\u003c/pre\u003e \n \u003cp\u003e \u003cstrong\u003eweb.xml\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003e\u0026lt;!DOCTYPE web-app PUBLIC\r\n \"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN\"\r\n \"http://java.sun.com/dtd/web-app_2_3.dtd\" \u0026gt;\r\n\r\n\u0026lt;web-app\u0026gt;\r\n \u0026lt;display-name\u0026gt;Struts 2 Web Application\u0026lt;/display-name\u0026gt;\r\n \r\n \u0026lt;filter\u0026gt;\r\n\t\u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n\t\u0026lt;filter-class\u0026gt;org.apache.struts2.dispatcher.FilterDispatcher\u0026lt;/filter-class\u0026gt;\r\n \u0026lt;/filter\u0026gt;\r\n \r\n \u0026lt;filter-mapping\u0026gt;\r\n\t\u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n\t\u0026lt;url-pattern\u0026gt;/*\u0026lt;/url-pattern\u0026gt;\r\n \u0026lt;/filter-mapping\u0026gt;\r\n \r\n \u0026lt;listener\u0026gt;\r\n \t\u0026lt;listener-class\u0026gt;\r\n com.yiibai.common.listener.GlobalMessagesListener\r\n \u0026lt;/listener-class\u0026gt;\r\n \u0026lt;/listener\u0026gt;\r\n\r\n\u0026lt;/web-app\u0026gt;\u003c/pre\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003cspan\u003e下載源代碼(globalresource)–\u0026nbsp;\u003ca href=\"http://pan.baidu.com/s/1sj1Rg7r\"\u003ehttp://pan.baidu.com/s/1sj1Rg7r\u003c/a\u003e\u003c/span\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"f4:T1dfe,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e \n \u003cspan\u003e在本教程中,我們來學習Struts2和Spring的集成。\u003cbr\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2+spring-1.png\" alt=\"Struts2+Spring集成實例\"\u003e\u003cbr\u003e \u003c/span\u003e \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cbr\u003e \u003c/p\u003e \n\u003ch2\u003e 1. 工程結構 \u003c/h2\u003e \n\u003cdiv\u003e\n 下面的圖是本教程的項目文件夾結構。 \n \u003cbr\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2+spring-2.png\" alt=\"Struts2+Spring集成實例\"\u003e \n \u003cbr\u003e \n\u003c/div\u003e \n\u003ch2\u003e 2. Spring監聽器 \u003c/h2\u003e \n\u003cp\u003e 配置Spring監聽器\u0026nbsp;「org.springframework.web.context.ContextLoaderListener」 到\u0026nbsp;web.xml\u0026nbsp;文件中。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eweb.xml\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;!DOCTYPE web-app PUBLIC\r\n \"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN\"\r\n \"http://java.sun.com/dtd/web-app_2_3.dtd\" \u0026gt;\r\n\r\n\u0026lt;web-app\u0026gt;\r\n \u0026lt;display-name\u0026gt;Struts 2 Web Application\u0026lt;/display-name\u0026gt;\r\n \r\n \u0026lt;filter\u0026gt;\r\n\t\u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n\t\u0026lt;filter-class\u0026gt;\r\n org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter\r\n \u0026lt;/filter-class\u0026gt;\r\n \u0026lt;/filter\u0026gt;\r\n \r\n \u0026lt;filter-mapping\u0026gt;\r\n\t\u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n\t\u0026lt;url-pattern\u0026gt;/*\u0026lt;/url-pattern\u0026gt;\r\n \u0026lt;/filter-mapping\u0026gt;\r\n \r\n \u0026lt;listener\u0026gt;\r\n \u0026lt;listener-class\u0026gt;\r\n org.springframework.web.context.ContextLoaderListener\r\n \u0026lt;/listener-class\u0026gt;\r\n \u0026lt;/listener\u0026gt;\r\n \r\n\u0026lt;/web-app\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 3. 註冊Spring Bean \u003c/h2\u003e \n\u003cp\u003e 註冊所有的Spring\u0026nbsp;Beans\u0026nbsp;配置在 applicationContext.xml 文件中,\u0026nbsp;Spring監聽器會自動找到這個\u0026nbsp;XML\u0026nbsp;文件。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eapplicationContext.xml\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;beans xmlns=\"http://www.springframework.org/schema/beans\"\r\nxmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\nxsi:schemaLocation=\"http://www.springframework.org/schema/beans\r\nhttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd\"\u0026gt;\r\n \r\n\t\u0026lt;bean id=\"userBo\" class=\"com.yiibai.user.bo.impl.UserBoImpl\" /\u0026gt;\r\n\t\r\n\t\u0026lt;bean id=\"userSpringAction\" class=\"com.yiibai.user.action.UserSpringAction\"\u0026gt;\r\n\t\t\u0026lt;property name=\"userBo\" ref=\"userBo\" /\u0026gt;\t\r\n\t\u0026lt;/bean\u0026gt;\r\n \r\n\u0026lt;/beans\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eUserBo.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.user.bo;\r\n\r\npublic interface UserBo{\r\n\r\n\tpublic void printUser();\r\n\t\r\n}\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eUserBoImpl.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.user.bo.impl;\r\n\r\nimport com.yiibai.user.bo.UserBo;\r\n\r\npublic class UserBoImpl implements UserBo{\r\n\r\n\tpublic void printUser(){\r\n\t\tSystem.out.println(\"printUser() is executed...\");\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eUserSpringAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.user.action;\r\n\r\nimport com.yiibai.user.bo.UserBo;\r\n\r\npublic class UserSpringAction{\r\n\r\n\t//DI via Spring\r\n\tUserBo userBo;\r\n\t\r\n\tpublic UserBo getUserBo() {\r\n\t\treturn userBo;\r\n\t}\r\n\r\n\tpublic void setUserBo(UserBo userBo) {\r\n\t\tthis.userBo = userBo;\r\n\t}\r\n\r\n\tpublic String execute() throws Exception {\r\n\t\t\r\n\t\tuserBo.printUser();\r\n\t\treturn \"success\";\r\n\t\t\r\n\t}\r\n}\u003c/pre\u003e \n\u003ch2\u003e 4. Struts.xml \u003c/h2\u003e \n\u003cdiv\u003e\n 在此聲明的所有關係。 \n\u003c/div\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \t\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\r\n\t\t\u0026lt;action name=\"userAction\" \r\n\t\t\tclass=\"com.yiibai.user.action.UserAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;pages/user.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\t\u0026lt;action name=\"userSpringAction\" \r\n\t\t\tclass=\"userSpringAction\" \u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;pages/user.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. 示例 \u003c/h2\u003e \n\u003cdiv\u003e\n 現在,所有的Struts2和Spring的集成工作已經完成,現在看到下面的用例來訪問\u0026nbsp;Spring\u0026nbsp;的\u0026nbsp;「userBo」\u0026nbsp;Bean。 \n\u003c/div\u003e \n\u003cul\u003e \n \u003cli\u003e 用例 1 :\u0026nbsp;讓\u0026nbsp;Spring\u0026nbsp;充當\u0026nbsp;Struts2的Action類,並訪問Spring的Bean。 \u003c/li\u003e \n \u003cli\u003e 用例 2 :\u0026nbsp;在Struts2的Action類中訪問Spring的Bean。 \u003c/li\u003e \n\u003c/ul\u003e \n\u003ch2\u003e 用例1 \u003c/h2\u003e \n\u003cdiv\u003e\n 在這個例子中,userSpringAction充當Struts2的Action類,也可以使用普通Spring的方式注入Spring的userBo。 \n\u003c/div\u003e \n\u003cpre\u003e//struts.xml\r\n\u0026lt;action name=\"userSpringAction\" \r\n\tclass=\"userSpringAction\" \u0026gt;\r\n\t\u0026lt;result name=\"success\"\u0026gt;pages/user.jsp\u0026lt;/result\u0026gt;\r\n\u0026lt;/action\u0026gt;\r\n\r\n//applicationContext.xml\r\n\u0026lt;bean id=\"userSpringAction\" class=\"com.yiibai.user.action.UserSpringAction\"\u0026gt;\r\n\t\u0026lt;property name=\"userBo\" ref=\"userBo\" /\u0026gt;\t\r\n\u0026lt;/bean\u0026gt;\u0026nbsp;\u003c/pre\u003e \n\u003cp\u003e 要訪問此操作,請使用網址:\u0026nbsp;\u003ca href=\"http://localhost:8080/struts2spring/userSpringAction.action\"\u003ehttp://localhost:8080/struts2spring/userSpringAction.action\u003c/a\u003e \u003c/p\u003e \n\u003ch2\u003e 用例 2 \u003c/h2\u003e \n\u003cp\u003e 默認情況下,Spring監聽器啓用\u0026nbsp;「通過匹配bean的名字自動裝配「。\u0026nbsp;因此,它會通過setUserBo自動傳遞Spring\u0026nbsp;「userBo」\u0026nbsp;Bean\u0026nbsp;到UserAction。請參閱下面的Struts2動作: \u003c/p\u003e \n\u003cdiv\u003e \n \u003cspan\u003eSpring的自動裝配功能可以修改爲\u003c/span\u003e\u0026nbsp; \n \u003cstrong\u003ename\u003c/strong\u003e(默認),\u0026nbsp; \n \u003cstrong\u003etype\u003c/strong\u003e,\u0026nbsp; \n \u003cstrong\u003eauto\u003c/strong\u003e\u0026nbsp;或\u0026nbsp; \n \u003cstrong\u003econstructor\u003c/strong\u003e,\u0026nbsp; \n \u003cspan\u003e可能需要參考\u0026nbsp;\u003ca href=\"http://struts.apache.org/docs/spring-plugin.html\"\u003eStruts2的Spring插件文檔\u003c/a\u003e。\u003c/span\u003e \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eUserAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.user.action;\r\n\r\nimport com.yiibai.user.bo.UserBo;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class UserAction extends ActionSupport{\r\n\r\n\t//DI via Spring\r\n\tUserBo userBo;\r\n\t\r\n\tpublic UserBo getUserBo() {\r\n\t\treturn userBo;\r\n\t}\r\n\r\n\tpublic void setUserBo(UserBo userBo) {\r\n\t\tthis.userBo = userBo;\r\n\t}\r\n\r\n\tpublic String execute() throws Exception {\r\n\t\t\r\n\t\tuserBo.printUser();\r\n\t\treturn SUCCESS;\r\n\t\t\r\n\t}\r\n}\u003c/pre\u003e \n\u003cp\u003e 要訪問此操作,請使用網址:\u0026nbsp;http://localhost:8080/struts2spring/userAction.action \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2+spring-3.png\" alt=\"Struts2+Spring集成實例\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003c/p\u003e \n\u003cdiv\u003e \n \u003cstrong\u003eWebApplicationContextUtils\u003c/strong\u003e \n \u003cbr\u003e \n \u003cspan\u003e另外,也可以使用Spring 通用\u003c/span\u003e\u0026nbsp; \n \u003cstrong\u003eWebApplicationContextUtils\u003c/strong\u003e\u0026nbsp; \n \u003cspan\u003e類來直接獲得Spring的bean。\u003c/span\u003e \n \u003cpre\u003epackage com.yiibai.user.action;\r\n\r\nimport org.apache.struts2.ServletActionContext;\r\nimport org.springframework.web.context.WebApplicationContext;\r\nimport org.springframework.web.context.support.WebApplicationContextUtils;\r\n\r\nimport com.yiibai.user.bo.UserBo;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class UserAction extends ActionSupport{\r\n\r\n\tpublic String execute() throws Exception {\r\n\t\t\r\n\t\tWebApplicationContext context =\r\n\t\t\tWebApplicationContextUtils.getRequiredWebApplicationContext(\r\n ServletActionContext.getServletContext()\r\n );\r\n\t\t\r\n\t\tUserBo userBo1 = (UserBo)context.getBean(\"userBo\");\r\n\t\tuserBo1.printUser();\r\n\r\n\t\treturn SUCCESS;\r\n\t\t\r\n\t}\r\n}\u003c/pre\u003e \n\u003c/div\u003e \n\u003cdiv\u003e\n 這是一個又長又臭的文章(包教不包會),請下載完整的項目並按照源代碼去一步步實現。 \n\u003c/div\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.x/docs/spring-plugin.html\"\u003eStruts2 Spring 插件文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e Struts + Spring 集成實例 \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv\u003e\n 代碼下載 -\u0026nbsp; \n \u003ca href=\"http://pan.baidu.com/s/1dDhqQ5b\"\u003ehttp://pan.baidu.com/s/1dDhqQ5b\u003c/a\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"f5:T2f26,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n Struts2並沒有附帶任何現成「Struts2-Quartz.jar」之類的插件,黑客可能會使用標準的\u0026nbsp;Servlet\u0026nbsp;監聽將兩個框架鏈接在一起。請參閱它們的關係 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003cpre\u003eStruts 2 \u0026lt;-- (Listener)--\u0026gt; Quartz \u0026lt;---\u0026gt; Scheduler task\u003c/pre\u003e \n \u003cdiv\u003e\n 在本教程中,我們將學習如何將Struts2和Quartz調度框架集成在一起。 \n \u003c/div\u003e \n \u003cdiv\u003e\n 使用的工具: \n \u003c/div\u003e \n \u003col\u003e \n \u003cli\u003e Struts 2.1.4 \u003c/li\u003e \n \u003cli\u003e Quartz 2.1.5 \u003c/li\u003e \n \u003cli\u003e Tomcat 6/7 \u003c/li\u003e \n \u003cli\u003e MyEclipse 10 \u003c/li\u003e \n \u003c/ol\u003e \n \u003ch2\u003e 1. 調度作業 \u003c/h2\u003e \n \u003cdiv\u003e\n 創建Quartz調度作業任務,並打印出一行。 \n \u003c/div\u003e \n \u003cp\u003e \u003cem\u003eFile : SchedulerJob.java\u003c/em\u003e \u003c/p\u003e \n \u003cpre\u003epackage com.yiibai.quartz;\r\n\r\nimport org.quartz.Job;\r\nimport org.quartz.JobExecutionContext;\r\nimport org.quartz.JobExecutionException;\r\n\r\npublic class SchedulerJob implements Job {\r\n\tpublic void execute(JobExecutionContext context)\r\n\t\tthrows JobExecutionException { \u003cspan\u003eSystem.out.println(\"Struts\u0026nbsp;2.1.4\u0026nbsp;+\u0026nbsp;Quartz\u0026nbsp;2.2.2\u0026nbsp;-\u0026nbsp;by\u0026nbsp;\u003c/span\u003ewww.yiibai.com\u003cspan\u003e\");\u003c/span\u003e \r\n\t\n \n \n \u003cdiv\u003e\n \n \n \r\n\t\t\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;SimpleDateFormat\u0026nbsp;sdf\u0026nbsp;=\u0026nbsp;new\u0026nbsp;SimpleDateFormat(\"yyyy-MM-dd\u0026nbsp;HH:mm:ss\");\r\n\t\n \n \n \u003c/div\u003e\r\n\r\n\t\n \n \n \u003cdiv\u003e\n \n \n \r\n\t\t\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;System.out.println(\u0026nbsp;\"\u0026nbsp;已被安排執行於:\u0026nbsp;\"\u0026nbsp;+\u0026nbsp;sdf.format(new\u0026nbsp;Date()));\r\n\t\n \n \n \u003c/div\u003e\r\n}\r\n}\u003c/pre\u003e \n \u003ch2\u003e 3. Servlet 監聽器 \u003c/h2\u003e \n \u003cp\u003e 創建標準的servlet監聽器類用來做整合工作。它調用Quartz調度框架中的contextInitialized()方法。在Servlet容器初始化,contextInitialized()方法將自動執行。 \u003c/p\u003e \n \u003cp\u003e \u003cem\u003eFile : QuartzSchedulerListener.java\u003c/em\u003e \u003c/p\u003e \n \u003cpre\u003epackage com.yiibai.listener;\r\n\r\nimport javax.servlet.ServletContextEvent;\r\nimport javax.servlet.ServletContextListener;\r\nimport org.quartz.CronScheduleBuilder;\r\nimport org.quartz.JobBuilder;\r\nimport org.quartz.JobDetail;\r\nimport org.quartz.Scheduler;\r\nimport org.quartz.SchedulerException;\r\nimport org.quartz.Trigger;\r\nimport org.quartz.TriggerBuilder;\r\nimport org.quartz.impl.StdSchedulerFactory;\r\nimport com.yiibai.quartz.SchedulerJob;\r\n\r\npublic class QuartzSchedulerListener implements ServletContextListener {\r\n\r\n\tpublic void contextDestroyed(ServletContextEvent arg0) {\r\n\t\t//\r\n\t}\r\n\r\n\tpublic void contextInitialized(ServletContextEvent arg0) {\r\n\r\n\t\tJobDetail job = JobBuilder.newJob(SchedulerJob.class)\r\n\t\t\t.withIdentity(\"anyJobName\", \"group1\").build();\r\n\r\n\t\ttry {\r\n\r\n\t\t\tTrigger trigger = TriggerBuilder\r\n\t\t\t .newTrigger()\r\n\t\t\t .withIdentity(\"anyTriggerName\", \"group1\")\r\n\t\t\t .withSchedule(\r\n\t\t\t CronScheduleBuilder.cronSchedule(\"0/10 * * * * ?\"))\r\n\t\t\t .build();\r\n\r\n\t\t\tScheduler scheduler = new StdSchedulerFactory().getScheduler();\r\n\t\t\tscheduler.start();\r\n\t\t\tscheduler.scheduleJob(job, trigger);\r\n\r\n\t\t} catch (SchedulerException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t}\r\n\r\n\t}\r\n}\u003c/pre\u003e \n \u003ch2\u003e 4. web.xml \u003c/h2\u003e \n \u003cdiv\u003e\n 把監聽器類 QuartzSchedulerListener.java 添加到 web.xml 文件。 \n \u003c/div\u003e \n \u003cp\u003e \u003cem\u003eFile : web.xml\u003c/em\u003e \u003c/p\u003e \n \u003cpre\u003e\u0026lt;!DOCTYPE web-app PUBLIC\r\n \"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN\"\r\n \"http://java.sun.com/dtd/web-app_2_3.dtd\" \u0026gt;\r\n\r\n\u0026lt;web-app\u0026gt;\r\n\t\u0026lt;display-name\u0026gt;Struts 2 Web Application\u0026lt;/display-name\u0026gt;\r\n\r\n\t\u0026lt;filter\u0026gt;\r\n\t \u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n\t \u0026lt;filter-class\u0026gt;\r\n org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter\r\n \u0026lt;/filter-class\u0026gt;\r\n\t\u0026lt;/filter\u0026gt;\r\n\r\n\t\u0026lt;filter-mapping\u0026gt;\r\n\t \u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n\t \u0026lt;url-pattern\u0026gt;/*\u0026lt;/url-pattern\u0026gt;\r\n\t\u0026lt;/filter-mapping\u0026gt;\r\n\r\n\t\u0026lt;listener\u0026gt;\r\n\t \u0026lt;listener-class\u0026gt;\r\n com.yiibai.listener.QuartzSchedulerListener\r\n \u0026lt;/listener-class\u0026gt;\r\n\t\u0026lt;/listener\u0026gt;\r\n\r\n\u0026lt;/web-app\u0026gt;\u003c/pre\u003e \n \u003ch2\u003e \u003cp\u003e \u003cspan\u003eCronTrigger配置格式:\u003cbr\u003e \u003cspan\u003e格式: [秒] [分] [小時] [日] [月] [周] [年]\u003c/span\u003e\u003c/span\u003e \u003c/p\u003e \n \u003ctable\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e序號\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e說明\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e是否必填\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e允許填寫的值\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e允許的通配符\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e1\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e秒\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e是\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e0-59\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e, - * /\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e2\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e分\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e是\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e0-59\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e, - * /\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e3\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e小時\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e是\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e0-23\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e, - * /\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e4\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e日\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e是\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e1-31\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e, - * ? / L W\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e5\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e月\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e是\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e1-12 or JAN-DEC\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e, - * /\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e6\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e周\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e是\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e1-7 or SUN-SAT\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e, - * ? / L #\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e7\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e年\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e否\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003eempty 或 1970-2099\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e, - * /\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n \u003c/table\u003e \u003cp\u003e \u003cspan\u003e通配符說明:\u0026nbsp;\u003cspan\u003e\u003cstrong\u003e\u003cspan\u003e\u003cstrong\u003e\u003cstrong\u003e*\u003c/strong\u003e\u003c/strong\u003e\u0026nbsp;\u003c/span\u003e\u003c/strong\u003e表示所有值. 例如:在分的字段上設置 \"*\",表示每一分鐘都會觸發。\u0026nbsp;\u003cspan\u003e\u003cstrong\u003e\u003cspan\u003e\u003cstrong\u003e?\u003c/strong\u003e\u003c/span\u003e\u003c/strong\u003e\u0026nbsp;表示不指定值。使用的場景爲不需要關心當前設置這個字段的值。例如:要在每月的10號觸發一個操作,但不關心是周幾,所以需要周位置的那個字段設置爲\"?\" 具體設置爲 0 0 0 10\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan\u003e\u003cstrong\u003e\u003cspan\u003e\u003cstrong\u003e\u003cstrong\u003e\u003c/strong\u003e\u003c/strong\u003e\u003c/span\u003e\u003c/strong\u003e\u003cspan\u003e\u003cstrong\u003e\u003cspan\u003e\u003cstrong\u003e\u003c/strong\u003e\u003c/span\u003e\u003c/strong\u003e\u0026nbsp;\u003cspan\u003e\u003cspan\u003e* ?\u0026nbsp;\u003cspan\u003e\u003cstrong\u003e\u003cspan\u003e\u003cstrong\u003e\u003cspan\u003e-\u003c/span\u003e\u003c/strong\u003e\u003c/span\u003e\u003c/strong\u003e\u0026nbsp;表示區間。例如 在小時上設置 \"10-12\",表示 10,11,12點都會觸發。\u0026nbsp;\u003cspan\u003e\u003cstrong\u003e\u003cspan\u003e,\u003c/span\u003e\u003c/strong\u003e\u0026nbsp;表示指定多個值,例如在周字段上設置 \"MON,WED,FRI\" 表示週一,週三和週五觸發\u0026nbsp;\u003cspan\u003e\u003cstrong\u003e\u003cspan\u003e\u003cstrong\u003e\u003cstrong\u003e/\u003c/strong\u003e\u003c/strong\u003e\u0026nbsp;\u003c/span\u003e\u003c/strong\u003e用於遞增觸發。如在秒上面設置\"5/15\" 表示從5秒開始,每增15秒觸發(5,20,35,50)。 在月字段上設置'1/3'所示每月1號開始,每隔三天觸發一次。\u0026nbsp;\u003cspan\u003e\u003cstrong\u003e\u003cspan\u003eL\u003c/span\u003e\u003c/strong\u003e\u0026nbsp;表示最後的意思。在日字段設置上,表示當月的最後一天(依據當前月份,如果是二月還會依據是否是潤年[leap]), 在周字段上表示星期六,相當於\"7\"或\"SAT\"。如果在\"L\"前加上數字,則表示該數據的最後一個。例如在周字段上設置\"6L\"這樣的格式,則表示「本月最後一個星期五\"\u0026nbsp;\u003cspan\u003e\u003cstrong\u003e\u003cspan\u003e\u003cstrong\u003eW\u003c/strong\u003e\u003c/span\u003e\u003c/strong\u003e\u0026nbsp;表示離指定日期的最近那個工作日(週一至週五). 例如在日字段上設置\"15W\",表示離每月15號最近的那個工作日觸發。如果15號正好是週六,則找最近的週五(14號)觸發, 如果15號是周未,則找最近的下週一(16號)觸發.如果15號正好在工作日(週一至週五),則就在該天觸發。如果指定格式爲 \"1W\",它則表示每月1號往後最近的工作日觸發。如果1號正是週六,則將在3號下週一觸發。(注,\"W\"前只能設置具體的數字,不允許區間\"-\").\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e \u003c/p\u003e \n \u003ctable\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e小提示\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cp\u003e \u003cspan\u003e'L'和 'W'可以一組合使用。如果在日字段上設置\"LW\",則表示在本月的最後一個工作日觸發(一般指發工資\u0026nbsp;)\u003c/span\u003e \u003c/p\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n \u003c/table\u003e \u003cp\u003e \u003cspan\u003e\u003cstrong\u003e\u003cspan\u003e#\u003c/span\u003e\u003c/strong\u003e\u0026nbsp;序號(表示每月的第幾個周幾),例如在周字段上設置\"6#3\"表示在每月的第三個週六.注意如果指定\"#5\",正好第五週沒有周六,則不會觸發該配置(用在母親節和父親節再合適不過了)\u003c/span\u003e \u003c/p\u003e \n \u003ctable\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e小提示\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cp\u003e \u003cspan\u003e周字段的設置,若使用英文字母是不區分大小寫的\u0026nbsp;MON\u0026nbsp;與mon相同.\u003c/span\u003e \u003c/p\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n \u003c/table\u003e \u003cp\u003e \u003cspan\u003e常用示例:\u003c/span\u003e \u003c/p\u003e \n \u003ctable\u003e \n \u003ctbody\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 0 12 * * ?\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e每天12點觸發\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 15 10 ? * *\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e每天10點15分觸發\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 15 10 * * ?\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e每天10點15分觸發\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 15 10 * * ? *\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e每天10點15分觸發\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 15 10 * * ? 2005\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e2005年每天10點15分觸發\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 * 14 * * ?\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e每天下午的 2點到2點59分每分觸發\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 0/5 14 * * ?\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e每天下午的 2點到2點59分(整點開始,每隔5分觸發)\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 0/5 14,18 * * ?\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e每天下午的 2點到2點59分(整點開始,每隔5分觸發)\u0026nbsp;每天下午的 18點到18點59分(整點開始,每隔5分觸發)\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 0-5 14 * * ?\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e每天下午的 2點到2點05分每分觸發\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 10,44 14 ? 3 WED\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e3月分每週三下午的 2點10分和2點44分觸發\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 15 10 ? * MON-FRI\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e從週一到週五每天上午的10點15分觸發\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 15 10 15 * ?\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e每月15號上午10點15分觸發\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 15 10 L * ?\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e每月最後一天的10點15分觸發\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 15 10 ? * 6L\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e每月最後一週的星期五的10點15分觸發\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 15 10 ? * 6L 2002-2005\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e從2002年到2005年每月最後一週的星期五的10點15分觸發\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 15 10 ? * 6#3\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e每月的第三週的星期五開始觸發\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 0 12 1/5 * ?\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e每月的第一個中午開始每隔5天觸發一次\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003ctr\u003e \n \u003ctd\u003e \u003cspan\u003e0 11 11 11 11 ?\u003c/span\u003e \u003c/td\u003e \n \u003ctd\u003e \u003cspan\u003e每年的11月11號 11點11分觸發(光棍節)\u003c/span\u003e \u003c/td\u003e \n \u003c/tr\u003e \n \u003c/tbody\u003e \n \u003c/table\u003e \u003c/h2\u003e \n \u003ch2\u003e 5. 示例 \u003c/h2\u003e \n \u003cp\u003e 在Struts2項目啓動之後,已註冊的偵聽器類QuartzSchedulerListener.java\u0026nbsp;將被激發,\u0026nbsp;並調用\u0026nbsp;Quartz\u0026nbsp;作業,每10秒執行SchedulerTask.printSchedulerMessage()方法。 \u003c/p\u003e \n \u003ch2\u003e 下載源代碼 \u003c/h2\u003e \n \u003cdiv\u003e\n 下載網址 –\u0026nbsp; \n \u003ca href=\"http://pan.baidu.com/s/1c0E2QM8\"\u003ehttp://pan.baidu.com/s/1c0E2QM8\u003c/a\u003e \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"f6:T2b8b,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n 在上篇\u0026nbsp;Struts2 + Hibernate集成\u0026nbsp;實例中,\u0026nbsp;它使用\u0026nbsp;servlet\u0026nbsp;上下文監聽\u0026nbsp;Hibernate\u0026nbsp;的\u0026nbsp;Session,而且把Struts2和Hibernate框架集成。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e 但是,總有一些東西要提高。在本教程中,我們將展示如何整合Struts2+Hibernate,並使用Struts2一個名爲「\u003ca href=\"http://code.google.com/p/full-hibernate-plugin-for-struts2/\"\u003eFull Hibernate Plugin\u003c/a\u003e「的插件。 \u003c/p\u003e \n\u003cdiv\u003e\n 見下面的集成步驟: \n\u003c/div\u003e \n\u003col\u003e \n \u003cli\u003e 把 「Full Hibernate Plugin」 jar 放入到工程類路徑。 \u003c/li\u003e \n \u003cli\u003e 使用 「@SessionTarget」 註釋來注入到 Hibernate session; 當「@TransactionTarget」 註釋注入到Hibernate 事務。 \u003c/li\u003e \n \u003cli\u003e 在\u0026nbsp;struts.xml, 讓包擴展 「hibernate-default「,而不是默認的堆棧。 \u003c/li\u003e \n\u003c/ol\u003e \n\u003cp\u003e 看看下面的關係: \u003c/p\u003e \n\u003cpre\u003eStruts 2 \u0026lt;-- (Full Hibernate Plugin) ---\u0026gt; Hibernate \u0026lt;-----\u0026gt; Database\u003c/pre\u003e \n\u003cdiv\u003e \n \u003cstrong\u003e注,\u003c/strong\u003e \n \u003cbr\u003e \n \u003cspan\u003e本教程是從以前的\u003c/span\u003e\u0026nbsp;Struts2 + Hibernate集成\u0026nbsp;實例(servlet context listener)更新版本。 \n \u003cspan\u003e因此,JSP 和 Hibernate 配置基本相同,只是\u003c/span\u003e \n \u003cspan\u003e整合的部分是有點不同,嘗試比較既能發現不同。\u003c/span\u003e \n\u003c/div\u003e \n\u003ch2\u003e 1. 工程結構 \u003c/h2\u003e \n\u003cdiv\u003e\n 在節教程,我們創建一個工程名爲 full-hibernate 的web工程。看看這個項目文件夾的完整結構。 \n \u003cbr\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2+hibernatefull-hibernate-plugin-1.png\" alt=\"Struts2+Hibernate使用Full Hibernate Plugin集成\"\u003e \n \u003cbr\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003ch2\u003e 2. MySQL創建表腳本 \u003c/h2\u003e \n\u003cp\u003e Customer表結構 \u003c/p\u003e \n\u003cpre class=\"prettyprint lang-bsh\"\u003eCREATE TABLE `customer` (\r\n `customer_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,\r\n `name` varchar(45) NOT NULL,\r\n `address` varchar(255) NOT NULL,\r\n `create_date` datetime NOT NULL,\r\n PRIMARY KEY (`customer_id`)\r\n) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;\u003c/pre\u003e \n\u003ch2\u003e 3. Hibernate相關配置 \u003c/h2\u003e \n\u003cdiv\u003e\n 所有\u0026nbsp;Hibernate\u0026nbsp;的模型和配置的東西。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eCustomer.java\u003c/strong\u003e\u0026nbsp;– 爲customer 表創建一個類。 \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.customer.model;\r\n\r\nimport java.util.Date;\r\n\r\npublic class Customer implements java.io.Serializable {\r\n\r\n\tprivate Long customerId;\r\n\tprivate String name;\r\n\tprivate String address;\r\n\tprivate Date createdDate;\r\n\r\n\t//getter and setter methods\r\n}\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eCustomer.hbm.xml\u003c/strong\u003e\u0026nbsp;– Hibernate 的 customer 表映射。 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\"?\u0026gt;\r\n\u0026lt;!DOCTYPE hibernate-mapping PUBLIC \"-//Hibernate/Hibernate Mapping DTD 3.0//EN\"\r\n\"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd\"\u0026gt;\r\n\u0026lt;!-- Generated 20 Julai 2010 11:40:18 AM by Hibernate Tools 3.2.5.Beta --\u0026gt;\r\n\u0026lt;hibernate-mapping\u0026gt;\r\n \u0026lt;class name=\"com.yiibai.customer.model.Customer\" \r\n\t\ttable=\"customer\" catalog=\"yiibai\"\u0026gt;\r\n \u0026lt;id name=\"customerId\" type=\"java.lang.Long\"\u0026gt;\r\n \u0026lt;column name=\"CUSTOMER_ID\" /\u0026gt;\r\n \u0026lt;generator class=\"identity\" /\u0026gt;\r\n \u0026lt;/id\u0026gt;\r\n \u0026lt;property name=\"name\" type=\"string\"\u0026gt;\r\n \u0026lt;column name=\"NAME\" length=\"45\" not-null=\"true\" /\u0026gt;\r\n \u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"address\" type=\"string\"\u0026gt;\r\n \u0026lt;column name=\"ADDRESS\" not-null=\"true\" /\u0026gt;\r\n \u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"createdDate\" type=\"timestamp\"\u0026gt;\r\n \u0026lt;column name=\"CREATED_DATE\" length=\"19\" not-null=\"true\" /\u0026gt;\r\n \u0026lt;/property\u0026gt;\r\n \u0026lt;/class\u0026gt;\r\n\u0026lt;/hibernate-mapping\u0026gt;\u003c/pre\u003e \n\u003cp\u003e 文件: hibernate.cfg.xml, Hibernate 數據庫配置 \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"utf-8\"?\u0026gt;\r\n\u0026lt;!DOCTYPE hibernate-configuration PUBLIC\r\n\"-//Hibernate/Hibernate Configuration DTD 3.0//EN\"\r\n\"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd\"\u0026gt;\r\n\u0026lt;hibernate-configuration\u0026gt;\r\n \u0026lt;session-factory\u0026gt;\r\n \u0026lt;property name=\"hibernate.bytecode.use_reflection_optimizer\"\u0026gt;false\u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"hibernate.connection.password\"\u0026gt;password\u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"hibernate.connection.url\"\u0026gt;jdbc:mysql://localhost:3306/yiibai\u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"hibernate.connection.username\"\u0026gt;root\u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"hibernate.dialect\"\u0026gt;org.hibernate.dialect.MySQLDialect\u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"show_sql\"\u0026gt;true\u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"format_sql\"\u0026gt;true\u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"use_sql_comments\"\u0026gt;false\u0026lt;/property\u0026gt;\r\n \u0026lt;mapping resource=\"com/yiibai/customer/hibernate/Customer.hbm.xml\" /\u0026gt;\r\n \u0026lt;/session-factory\u0026gt;\r\n\u0026lt;/hibernate-configuration\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. DAO \u003c/h2\u003e \n\u003cp\u003e 實現DAO設計模式執行數據庫操作。在\u0026nbsp;CustomerDAOImpl\u0026nbsp;類,\u0026nbsp;聲明Hibernate會話和事務爲類成員。在Struts\u0026nbsp;2的項目初始化,\u0026nbsp;「Full Hibernate Plugin」\u0026nbsp;使用\u0026nbsp;@SessionTarget\u0026nbsp;和\u0026nbsp;@TransactionTarget\u0026nbsp;分別標註將注入相應的 Hibernate 會話和事務成爲類成員。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eCustomerDAO.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.customer.dao;\r\n\r\nimport java.util.List;\r\n\r\nimport com.yiibai.customer.model.Customer;\r\n \r\npublic interface CustomerDAO{\r\n\t\r\n\tvoid addCustomer(Customer customer);\r\n\t\r\n\tList\u0026lt;Customer\u0026gt; listCustomer();\r\n\t\r\n}\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eCustomerDAOImpl.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.customer.dao.impl;\r\n\r\nimport java.util.List;\r\n\r\nimport org.hibernate.Session;\r\nimport org.hibernate.Transaction;\r\n\r\nimport com.googlecode.s2hibernate.struts2.plugin.annotations.SessionTarget;\r\nimport com.googlecode.s2hibernate.struts2.plugin.annotations.TransactionTarget;\r\nimport com.yiibai.customer.dao.CustomerDAO;\r\nimport com.yiibai.customer.model.Customer;\r\n \r\npublic class CustomerDAOImpl implements CustomerDAO{\r\n\t\r\n\t@SessionTarget\r\n\tSession session;\r\n\t \r\n\t@TransactionTarget\r\n\tTransaction transaction;\r\n\t\r\n\t//add the customer\r\n\tpublic void addCustomer(Customer customer){\r\n\t\t\r\n\t\tsession.save(customer);\r\n\t\t\r\n\t}\r\n\t\r\n\t//return all the customers in list\r\n\tpublic List\u0026lt;Customer\u0026gt; listCustomer(){\r\n\t\t\r\n\t\treturn session.createQuery(\"from Customer\").list();\r\n\t\t\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 6. Action \u003c/h2\u003e \n\u003cdiv\u003e\n 在Action類,調用DAO類來執行數據庫操作。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eCustomerAction.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.customer.action;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.Date;\r\nimport java.util.List;\r\n\r\nimport com.yiibai.customer.dao.CustomerDAO;\r\nimport com.yiibai.customer.dao.impl.CustomerDAOImpl;\r\nimport com.yiibai.customer.model.Customer;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\nimport com.opensymphony.xwork2.ModelDriven;\r\n \r\npublic class CustomerAction extends ActionSupport \r\n\timplements ModelDriven{\r\n\r\n\tCustomer customer = new Customer();\r\n\tList\u0026lt;Customer\u0026gt; customerList = new ArrayList\u0026lt;Customer\u0026gt;();\r\n\tCustomerDAO customerDAO = new CustomerDAOImpl();\r\n\t\r\n\tpublic String execute() throws Exception {\r\n\t\treturn SUCCESS;\r\n\t}\r\n\r\n\tpublic Object getModel() {\r\n\t\treturn customer;\r\n\t}\r\n\t\r\n\tpublic List\u0026lt;Customer\u0026gt; getCustomerList() {\r\n\t\treturn customerList;\r\n\t}\r\n\r\n\tpublic void setCustomerList(List\u0026lt;Customer\u0026gt; customerList) {\r\n\t\tthis.customerList = customerList;\r\n\t}\r\n\r\n\t//save customer\r\n\tpublic String addCustomer() throws Exception{\r\n\t\t\r\n\t\t//save it\r\n\t\tcustomer.setCreatedDate(new Date());\r\n\t\tcustomerDAO.addCustomer(customer);\r\n\t \r\n\t\t//reload the customer list\r\n\t\tcustomerList = null;\r\n\t\tcustomerList = customerDAO.listCustomer();\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t\r\n\t}\r\n\t\r\n\t//list all customers\r\n\tpublic String listCustomer() throws Exception{\r\n\t\t\r\n\t\tcustomerList = customerDAO.listCustomer();\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 7. JSP 頁面 \u003c/h2\u003e \n\u003cdiv\u003e\n JSP頁面添加並列出客戶。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003ecustomer.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 Full Hibernate Plugin example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;Add Customer\u0026lt;/h2\u0026gt;\r\n\u0026lt;s:form action=\"addCustomerAction\" \u0026gt;\r\n \u0026lt;s:textfield name=\"name\" label=\"Name\" value=\"\" /\u0026gt;\r\n \u0026lt;s:textarea name=\"address\" label=\"Address\" value=\"\" cols=\"50\" rows=\"5\" /\u0026gt;\r\n \u0026lt;s:submit /\u0026gt;\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;All Customers\u0026lt;/h2\u0026gt;\r\n\r\n\u0026lt;s:if test=\"customerList.size() \u0026gt; 0\"\u0026gt;\r\n\u0026lt;table border=\"1px\" cellpadding=\"8px\"\u0026gt;\r\n\t\u0026lt;tr\u0026gt;\r\n\t\t\u0026lt;th\u0026gt;Customer Id\u0026lt;/th\u0026gt;\r\n\t\t\u0026lt;th\u0026gt;Name\u0026lt;/th\u0026gt;\r\n\t\t\u0026lt;th\u0026gt;Address\u0026lt;/th\u0026gt;\r\n\t\t\u0026lt;th\u0026gt;Created Date\u0026lt;/th\u0026gt;\r\n\t\u0026lt;/tr\u0026gt;\r\n\t\u0026lt;s:iterator value=\"customerList\" status=\"userStatus\"\u0026gt;\r\n\t\t\u0026lt;tr\u0026gt;\r\n\t\t\t\u0026lt;td\u0026gt;\u0026lt;s:property value=\"customerId\" /\u0026gt;\u0026lt;/td\u0026gt;\r\n\t\t\t\u0026lt;td\u0026gt;\u0026lt;s:property value=\"name\" /\u0026gt;\u0026lt;/td\u0026gt;\r\n\t\t\t\u0026lt;td\u0026gt;\u0026lt;s:property value=\"address\" /\u0026gt;\u0026lt;/td\u0026gt;\r\n\t\t\t\u0026lt;td\u0026gt;\u0026lt;s:date name=\"createdDate\" format=\"dd/MM/yyyy\" /\u0026gt;\u0026lt;/td\u0026gt;\r\n\t\t\u0026lt;/tr\u0026gt;\r\n\t\u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/table\u0026gt;\r\n\u0026lt;/s:if\u0026gt;\r\n\u0026lt;br/\u0026gt;\r\n\u0026lt;br/\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 8. struts.xml \u003c/h2\u003e \n\u003cp\u003e 鏈接所有〜讓包擴展\u0026nbsp;「hibernate-default」 來代替\u0026nbsp;「struts-default「. \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \t\r\n \u0026lt;package name=\"default\" namespace=\"/\" extends=\"hibernate-default\"\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"addCustomerAction\" \r\n\tclass=\"com.yiibai.customer.action.CustomerAction\" method=\"addCustomer\" \u0026gt;\r\n \u0026lt;result name=\"success\"\u0026gt;pages/customer.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\r\n \u0026lt;action name=\"listCustomerAction\" \r\n\tclass=\"com.yiibai.customer.action.CustomerAction\" method=\"listCustomer\" \u0026gt;\r\n \u0026lt;result name=\"success\"\u0026gt;pages/customer.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\t\r\n\u0026lt;/package\u0026gt;\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 9. 實例 \u003c/h2\u003e \n\u003cp\u003e 訪問以下網址 :\u0026nbsp;\u003ca href=\"http://localhost:8080/full-hibernate/addCustomerAction.action\"\u003ehttp://localhost:8080/full-hibernate/addCustomerAction.action\u003c/a\u003e\u003cbr\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2+hibernatefull-hibernate-plugin-2.png\" alt=\"Struts2+Hibernate使用Full Hibernate Plugin集成\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2+hibernatefull-hibernate-plugin-3.png\" alt=\"Struts2+Hibernate使用Full Hibernate Plugin集成\"\u003e \u003c/p\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e \u003ca href=\"http://code.google.com/p/full-hibernate-plugin-for-struts2/\"\u003eStruts2 Full Hibernate插件文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e Struts2 + Hibernate集成實例 \u003c/li\u003e \n \u003cli\u003e 安裝庫到Maven本地資源庫 \u003c/li\u003e \n\u003c/ol\u003e \n\u003ch2\u003e 下載代碼 \u003c/h2\u003e \n\u003cdiv\u003e\n 下載所有源代碼 –\u0026nbsp; \n \u003ca href=\"http://pan.baidu.com/s/1o6tjSam\"\u003ehttp://pan.baidu.com/s/1o6tjSam\u003c/a\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"f7:T2e8a,"])</script><script>self.__next_f.push([1,"\u003cdiv class=\"__kindeditor_paste__\"\u003e \n \u003cdiv\u003e \n \u003cdiv\u003e\n 在 Struts2 中,沒有官方的插件集成Hibernate框架。但是,可以通過以下步驟解決方法: \n \u003c/div\u003e \n \u003c/div\u003e \n \u003cdiv\u003e \n \u003col\u003e \n \u003cli\u003e 註冊一個自定義的\u0026nbsp;ServletContextListener \u003c/li\u003e \n \u003cli\u003e 在\u0026nbsp;ServletContextListener\u0026nbsp;類,\u0026nbsp;初始化Hibernate會話,並將其存儲到servlet上下文。 \u003c/li\u003e \n \u003cli\u003e 在動作類,\u0026nbsp;可以通過servlet上下文的Hibernate會話,並執行任務正常的Hibernate操作。 \u003c/li\u003e \n \u003c/ol\u003e \n \u003cdiv\u003e\n 請參閱它們的關係: \n \u003c/div\u003e \n \u003cpre\u003eStruts 2 \u0026lt;-- (Servlet Context) ---\u0026gt; Hibernate \u0026lt;-----\u0026gt; Database \u0026nbsp;\u003c/pre\u003e \n \u003cp\u003e 在本教程中,在Struts中2開發我們顯示了一個簡單的客戶模塊(添加和列表功能),並使用 Hibernate 進行數據庫操作。使用上述部分機制集成(存儲和檢索在servlet上下文Hibernate的Session)。 \u003c/p\u003e \n \u003ch2\u003e 1. 工程目錄結構 \u003c/h2\u003e \n \u003cdiv\u003e\n 來看看這個完整的項目文件夾結構。 \n \u003cbr\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2+hibernate-1.png\" alt=\"Struts2+Hibernate集成實例\"\u003e \n \u003c/div\u003e \n \u003ch2\u003e 2. MySQL表結構腳本 \u003c/h2\u003e \n \u003cdiv\u003e\n 創建一個客戶(customer)表。下面是SQL表腳本。 \n \u003cbr\u003e \n \u003cpre class=\"prettyprint\"\u003eCREATE TABLE `customer` (\r\n `customer_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,\r\n `name` varchar(45) NOT NULL,\r\n `address` varchar(255) NOT NULL,\r\n `create_date` datetime NOT NULL,\r\n PRIMARY KEY (`customer_id`)\r\n) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;\u003c/pre\u003e \n \u003c/div\u003e \n \u003ch2\u003e 4. Hibernate 相關配置 \u003c/h2\u003e \n \u003cdiv\u003e\n Hibernate的模型和配置的東西。 \n \u003c/div\u003e \n \u003cp\u003e Customer.java\u0026nbsp;–\u0026nbsp;創建客戶表對應的一個類。 \u003c/p\u003e \n \u003cpre\u003epackage com.yiibai.customer.model;\r\n\r\nimport java.util.Date;\r\n\r\npublic class Customer implements java.io.Serializable {\r\n\r\n\tprivate Long customerId;\r\n\tprivate String name;\r\n\tprivate String address;\r\n\tprivate Date createdDate;\r\n\r\n\t//getter and setter methods\r\n}\u003c/pre\u003e \n \u003cp\u003e \u003cstrong\u003eCustomer.hbm.xml\u003c/strong\u003e\u0026nbsp;–\u0026nbsp;\u003cspan\u003eHibernate映射文件客戶表。\u003c/span\u003e \u003c/p\u003e \n \u003cpre\u003e\u0026lt;?xml version=\"1.0\"?\u0026gt;\r\n\u0026lt;!DOCTYPE hibernate-mapping PUBLIC \"-//Hibernate/Hibernate Mapping DTD 3.0//EN\"\r\n\"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd\"\u0026gt;\r\n\u0026lt;hibernate-mapping\u0026gt;\r\n \u0026lt;class name=\"com.yiibai.customer.model.Customer\" \r\n\ttable=\"customer\" catalog=\"yiibai\"\u0026gt;\r\n\r\n \u0026lt;id name=\"customerId\" type=\"java.lang.Long\"\u0026gt;\r\n \u0026lt;column name=\"CUSTOMER_ID\" /\u0026gt;\r\n \u0026lt;generator class=\"identity\" /\u0026gt;\r\n \u0026lt;/id\u0026gt;\r\n \u0026lt;property name=\"name\" type=\"string\"\u0026gt;\r\n \u0026lt;column name=\"NAME\" length=\"45\" not-null=\"true\" /\u0026gt;\r\n \u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"address\" type=\"string\"\u0026gt;\r\n \u0026lt;column name=\"ADDRESS\" not-null=\"true\" /\u0026gt;\r\n \u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"createdDate\" type=\"timestamp\"\u0026gt;\r\n \u0026lt;column name=\"CREATED_DATE\" length=\"19\" not-null=\"true\" /\u0026gt;\r\n \u0026lt;/property\u0026gt;\r\n \u0026lt;/class\u0026gt;\r\n\u0026lt;/hibernate-mapping\u0026gt;\u003c/pre\u003e \n \u003cp\u003e \u003cstrong\u003ehibernate.cfg.xml\u003c/strong\u003e\u0026nbsp;– Hibernate數據庫配置文件 \u003c/p\u003e \n \u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"utf-8\"?\u0026gt;\r\n\u0026lt;!DOCTYPE hibernate-configuration PUBLIC\r\n\"-//Hibernate/Hibernate Configuration DTD 3.0//EN\"\r\n\"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd\"\u0026gt;\r\n\u0026lt;hibernate-configuration\u0026gt;\r\n \u0026lt;session-factory\u0026gt;\r\n \u0026lt;property name=\"hibernate.bytecode.use_reflection_optimizer\"\u0026gt;false\u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"hibernate.connection.password\"\u0026gt;password\u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"hibernate.connection.url\"\u0026gt;jdbc:mysql://localhost:3306/yiibai\u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"hibernate.connection.username\"\u0026gt;root\u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"hibernate.dialect\"\u0026gt;org.hibernate.dialect.MySQLDialect\u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"show_sql\"\u0026gt;true\u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"format_sql\"\u0026gt;true\u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"use_sql_comments\"\u0026gt;false\u0026lt;/property\u0026gt;\r\n \u0026lt;mapping resource=\"com/yiibai/customer/hibernate/Customer.hbm.xml\" /\u0026gt;\r\n \u0026lt;/session-factory\u0026gt;\r\n\u0026lt;/hibernate-configuration\u0026gt;\u003c/pre\u003e \n \u003ch2\u003e 5. Hibernate ServletContextListener \u003c/h2\u003e \n \u003cp\u003e 創建一個類\u0026nbsp;ServletContextListener,\u0026nbsp;並初始化Hibernate會話,並將其存儲到servlet上下文。 \u003c/p\u003e \n \u003cp\u003e \u003cstrong\u003eHibernateListener .java\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003epackage com.yiibai.listener;\r\n\r\nimport java.net.URL;\r\n\r\nimport javax.servlet.ServletContextEvent;\r\nimport javax.servlet.ServletContextListener;\r\n\r\nimport org.hibernate.SessionFactory;\r\nimport org.hibernate.cfg.Configuration;\r\n \r\npublic class HibernateListener implements ServletContextListener{\r\n \r\n private Configuration config;\r\n private SessionFactory factory;\r\n private String path = \"/hibernate.cfg.xml\";\r\n private static Class clazz = HibernateListener.class;\r\n \r\n public static final String KEY_NAME = clazz.getName();\r\n\r\n\tpublic void contextDestroyed(ServletContextEvent event) {\r\n\t //\r\n\t}\r\n \r\n\tpublic void contextInitialized(ServletContextEvent event) {\r\n \r\n\t try { \r\n\t URL url = HibernateListener.class.getResource(path);\r\n\t config = new Configuration().configure(url);\r\n\t factory = config.buildSessionFactory();\r\n\t \r\n\t //save the Hibernate session factory into serlvet context\r\n\t event.getServletContext().setAttribute(KEY_NAME, factory);\r\n\t } catch (Exception e) {\r\n\t System.out.println(e.getMessage());\r\n\t }\r\n\t}\r\n}\u003c/pre\u003e \n \u003cdiv\u003e\n 在 web.xml 文件中註冊監聽器。 \n \u003c/div\u003e \n \u003cp\u003e \u003cstrong\u003eweb.xml\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003e\u0026lt;!DOCTYPE web-app PUBLIC\r\n \"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN\"\r\n \"http://java.sun.com/dtd/web-app_2_3.dtd\" \u0026gt;\r\n\r\n\u0026lt;web-app\u0026gt;\r\n \u0026lt;display-name\u0026gt;Struts 2 Web Application\u0026lt;/display-name\u0026gt;\r\n \r\n \u0026lt;filter\u0026gt;\r\n\t\u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n\t\u0026lt;filter-class\u0026gt;\r\n\t org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter\r\n\t\u0026lt;/filter-class\u0026gt;\r\n \u0026lt;/filter\u0026gt;\r\n \r\n \u0026lt;filter-mapping\u0026gt;\r\n\t\u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n\t\u0026lt;url-pattern\u0026gt;/*\u0026lt;/url-pattern\u0026gt;\r\n \u0026lt;/filter-mapping\u0026gt;\r\n \r\n \u0026lt;listener\u0026gt;\r\n \u0026lt;listener-class\u0026gt;\r\n\t com.yiibai.listener.HibernateListener\r\n \u0026lt;/listener-class\u0026gt;\r\n \u0026lt;/listener\u0026gt;\r\n \r\n\u0026lt;/web-app\u0026gt;\u003c/pre\u003e \n \u003ch2\u003e 6. Action \u003c/h2\u003e \n \u003cp\u003e 在動作類,\u0026nbsp;可以通過servlet上下文的Hibernate會話和執行正常的Hibernate任務。 \u003c/p\u003e \n \u003cp\u003e \u003cstrong\u003eCustomerAction.java\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003epackage com.yiibai.customer.action;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.Date;\r\nimport java.util.List;\r\n\r\nimport org.apache.struts2.ServletActionContext;\r\nimport org.hibernate.Session;\r\nimport org.hibernate.SessionFactory;\r\n\r\nimport com.yiibai.customer.model.Customer;\r\nimport com.yiibai.listener.HibernateListener;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\nimport com.opensymphony.xwork2.ModelDriven;\r\n \r\npublic class CustomerAction extends ActionSupport \r\n\timplements ModelDriven{\r\n\r\n\tCustomer customer = new Customer();\r\n\tList\u0026lt;Customer\u0026gt; customerList = new ArrayList\u0026lt;Customer\u0026gt;();\r\n\t\r\n\tpublic String execute() throws Exception {\r\n\t\treturn SUCCESS;\r\n\t}\r\n\r\n\tpublic Object getModel() {\r\n\t\treturn customer;\r\n\t}\r\n\t\r\n\tpublic List\u0026lt;Customer\u0026gt; getCustomerList() {\r\n\t\treturn customerList;\r\n\t}\r\n\r\n\tpublic void setCustomerList(List\u0026lt;Customer\u0026gt; customerList) {\r\n\t\tthis.customerList = customerList;\r\n\t}\r\n\r\n\t//save customer\r\n\tpublic String addCustomer() throws Exception{\r\n\t\t\r\n\t\t//get hibernate session from the servlet context\r\n\t\tSessionFactory sessionFactory = \r\n\t (SessionFactory) ServletActionContext.getServletContext()\r\n .getAttribute(HibernateListener.KEY_NAME);\r\n\r\n\t\tSession session = sessionFactory.openSession();\r\n\r\n\t\t//save it\r\n\t\tcustomer.setCreatedDate(new Date());\r\n\t \r\n\t\tsession.beginTransaction();\r\n\t\tsession.save(customer);\r\n\t\tsession.getTransaction().commit();\r\n\t \r\n\t\t//reload the customer list\r\n\t\tcustomerList = null;\r\n\t\tcustomerList = session.createQuery(\"from Customer\").list();\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t\r\n\t}\r\n\t\r\n\t//list all customers\r\n\tpublic String listCustomer() throws Exception{\r\n\t\t\r\n\t\t//get hibernate session from the servlet context\r\n\t\tSessionFactory sessionFactory = \r\n\t (SessionFactory) ServletActionContext.getServletContext()\r\n .getAttribute(HibernateListener.KEY_NAME);\r\n\r\n\t\tSession session = sessionFactory.openSession();\r\n\r\n\t\tcustomerList = session.createQuery(\"from Customer\").list();\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t\r\n\t}\t\r\n}\u003c/pre\u003e \n \u003ch2\u003e 7. JSP 頁面 \u003c/h2\u003e \n \u003cdiv\u003e\n JSP頁面用來添加和列出的客戶。 \n \u003c/div\u003e \n \u003cp\u003e \u003cstrong\u003ecustomer.jsp\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 + Hibernate integration example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;Add Customer\u0026lt;/h2\u0026gt;\r\n\u0026lt;s:form action=\"addCustomerAction\" \u0026gt;\r\n \u0026lt;s:textfield name=\"name\" label=\"Name\" value=\"\" /\u0026gt;\r\n \u0026lt;s:textarea name=\"address\" label=\"Address\" value=\"\" cols=\"50\" rows=\"5\" /\u0026gt;\r\n \u0026lt;s:submit /\u0026gt;\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;All Customers\u0026lt;/h2\u0026gt;\r\n\r\n\u0026lt;s:if test=\"customerList.size() \u0026gt; 0\"\u0026gt;\r\n\u0026lt;table border=\"1px\" cellpadding=\"8px\"\u0026gt;\r\n\t\u0026lt;tr\u0026gt;\r\n\t\t\u0026lt;th\u0026gt;Customer Id\u0026lt;/th\u0026gt;\r\n\t\t\u0026lt;th\u0026gt;Name\u0026lt;/th\u0026gt;\r\n\t\t\u0026lt;th\u0026gt;Address\u0026lt;/th\u0026gt;\r\n\t\t\u0026lt;th\u0026gt;Created Date\u0026lt;/th\u0026gt;\r\n\t\u0026lt;/tr\u0026gt;\r\n\t\u0026lt;s:iterator value=\"customerList\" status=\"userStatus\"\u0026gt;\r\n\t\t\u0026lt;tr\u0026gt;\r\n\t\t\t\u0026lt;td\u0026gt;\u0026lt;s:property value=\"customerId\" /\u0026gt;\u0026lt;/td\u0026gt;\r\n\t\t\t\u0026lt;td\u0026gt;\u0026lt;s:property value=\"name\" /\u0026gt;\u0026lt;/td\u0026gt;\r\n\t\t\t\u0026lt;td\u0026gt;\u0026lt;s:property value=\"address\" /\u0026gt;\u0026lt;/td\u0026gt;\r\n\t\t\t\u0026lt;td\u0026gt;\u0026lt;s:date name=\"createdDate\" format=\"dd/MM/yyyy\" /\u0026gt;\u0026lt;/td\u0026gt;\r\n\t\t\u0026lt;/tr\u0026gt;\r\n\t\u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/table\u0026gt;\r\n\u0026lt;/s:if\u0026gt;\r\n\u0026lt;br/\u0026gt;\r\n\u0026lt;br/\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n \u003ch2\u003e 8. struts.xml \u003c/h2\u003e \n \u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \t\r\n \u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"addCustomerAction\" \r\n\tclass=\"com.yiibai.customer.action.CustomerAction\" method=\"addCustomer\" \u0026gt;\r\n \u0026lt;result name=\"success\"\u0026gt;pages/customer.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\r\n \u0026lt;action name=\"listCustomerAction\" \r\n\tclass=\"com.yiibai.customer.action.CustomerAction\" method=\"listCustomer\" \u0026gt;\r\n \u0026lt;result name=\"success\"\u0026gt;pages/customer.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\t\t\r\n\r\n \u0026lt;/package\u0026gt;\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n \u003ch2\u003e 9. 實例測試執行 \u003c/h2\u003e \n \u003cp\u003e 訪問客戶模塊:http://localhost:8080/struts2hibernate/listCustomerAction.action\u003cbr\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2+hibernate-2.png\" alt=\"Struts2+Hibernate集成實例\"\u003e \u003c/p\u003e \n \u003cdiv\u003e\n 在名稱和地址字段填寫,點擊提交按鈕,插入的客戶的詳細信息會馬上列出結果。 \n \u003cbr\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2+hibernate-3.png\" alt=\"Struts2+Hibernate集成實例\"\u003e \n \u003cbr\u003e \n \u003c/div\u003e \n \u003ch2\u003e 參考 \u003c/h2\u003e \n \u003col\u003e \n \u003cli\u003e Struts2 + Hibernate使用「Full Hibernate Plugin\"集成 \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://java.sun.com/products/servlet/2.3/javadoc/javax/servlet/ServletContextListener.html\"\u003eServletContextListener 文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e Struts + Hibernate集成實例 \u003c/li\u003e \n \u003c/ol\u003e \n \u003c/div\u003e \n\u003c/div\u003e 代碼下載 - \n\u003ca href=\"http://pan.baidu.com/s/1hqhQJ7A\"\u003ehttp://pan.baidu.com/s/1hqhQJ7A\u003c/a\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"f8:T3dc9,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n 在本教程中,它顯示的集成\u0026nbsp;「Struts2 + Spring + Hibernate「,請務必檢查以下之前繼續學習教程。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003col\u003e \n \u003cli\u003e Struts2 + Hibernate集成實例 \u003c/li\u003e \n \u003cli\u003e Struts2 + Spring 集成實例 \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv\u003e\n 參見集成步驟總結: \n\u003c/div\u003e \n\u003col\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 獲取所有的依賴庫(很多)。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 註冊 Spring 的 ContextLoaderListener 來整合 Struts2 和 Spring。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 使用 Spring 的 LocalSessionFactoryBean 來集成 Spring 和 Hibernate。 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 完成所有連接。 \n \u003c/div\u003e \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv\u003e\n 請參閱它們之的關係: \n\u003c/div\u003e \n\u003cpre\u003eStruts 2 \u0026lt;-- (ContextLoaderListener) --\u0026gt; Spring \u0026lt;-- (LocalSessionFactoryBean) --\u0026gt; Hibernate\u003c/pre\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e\n 這將是一個很長的教程,相關解釋並不是很多,請務必閱讀上述2篇文章的詳細情況說明以方面學習。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cp\u003e 這將要創建一個客戶頁面,以添加客戶和列表的自定義函數。前端使用Struts2顯示,Spring作爲依賴注入引擎,而\u0026nbsp;Hibernate\u0026nbsp;用來執行數據庫操作。讓我們開始... \u003c/p\u003e \n\u003ch2\u003e 1. 工程文件夾結構 \u003c/h2\u003e \n\u003cp\u003e 在本章中,我們創建一個 ssh 的web工程,工程的目錄結構如下圖所示:\u003cbr\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2+spring+hibernate-1.png\" alt=\"Struts2+Spring+Hibernate集成實例\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2+spring+hibernate-2.png\" alt=\"Struts2+Spring+Hibernate集成實例\"\u003e \u003c/p\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n\u003c/div\u003e \n\u003ch2\u003e 2. MySQL表結構結構 \u003c/h2\u003e \n\u003cdiv\u003e\n 客戶(customer)表腳本。 \n\u003c/div\u003e \n\u003cpre\u003eDROP TABLE IF EXISTS `yiibai`.`customer`;\r\nCREATE TABLE `yiibai`.`customer` (\r\n `CUSTOMER_ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,\r\n `NAME` varchar(45) NOT NULL,\r\n `ADDRESS` varchar(255) NOT NULL,\r\n `CREATED_DATE` datetime NOT NULL,\r\n PRIMARY KEY (`CUSTOMER_ID`)\r\n) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;\u003c/pre\u003e \n\u003ch2\u003e 3. Hibernate相關配置 \u003c/h2\u003e \n\u003cdiv\u003e\n 只有模型和映射文件是必需的,因爲這裏要用Spring處理Hibernate配置。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eCustomer.java\u003c/strong\u003e\u0026nbsp;–\u0026nbsp;\u003cspan\u003e創建客戶表對應的一個類。\u003c/span\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.customer.model;\r\n\r\nimport java.util.Date;\r\n\r\npublic class Customer implements java.io.Serializable {\r\n\r\n\tprivate Long customerId;\r\n\tprivate String name;\r\n\tprivate String address;\r\n\tprivate Date createdDate;\r\n\r\n\t//getter and setter methods\r\n}\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eCustomer.hbm.xml\u003c/strong\u003e\u0026nbsp;–\u0026nbsp;\u003cspan\u003eHibernate的客戶映射文件。\u003c/span\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\"?\u0026gt;\r\n\u0026lt;!DOCTYPE hibernate-mapping PUBLIC \"-//Hibernate/Hibernate Mapping DTD 3.0//EN\"\r\n\"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd\"\u0026gt;\r\n\u0026lt;!-- Generated 20 Julai 2010 11:40:18 AM by Hibernate Tools 3.2.5.Beta --\u0026gt;\r\n\u0026lt;hibernate-mapping\u0026gt;\r\n \u0026lt;class name=\"com.yiibai.customer.model.Customer\" \r\n\t\ttable=\"customer\" catalog=\"yiibai\"\u0026gt;\r\n \u0026lt;id name=\"customerId\" type=\"java.lang.Long\"\u0026gt;\r\n \u0026lt;column name=\"customer_id\" /\u0026gt;\r\n \u0026lt;generator class=\"identity\" /\u0026gt;\r\n \u0026lt;/id\u0026gt;\r\n \u0026lt;property name=\"name\" type=\"string\"\u0026gt;\r\n \u0026lt;column name=\"name\" length=\"45\" not-null=\"true\" /\u0026gt;\r\n \u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"address\" type=\"string\"\u0026gt;\r\n \u0026lt;column name=\"address\" not-null=\"true\" /\u0026gt;\r\n \u0026lt;/property\u0026gt;\r\n \u0026lt;property name=\"createdDate\" type=\"timestamp\"\u0026gt;\r\n \u0026lt;column name=\"create_date\" length=\"19\" not-null=\"true\" /\u0026gt;\r\n \u0026lt;/property\u0026gt;\r\n \u0026lt;/class\u0026gt;\r\n\u0026lt;/hibernate-mapping\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 5. Struts2相關 \u003c/h2\u003e \n\u003cp\u003e 實現了 Bo 和 DAO 設計模式。所有Bo和DAO將由Spring\u0026nbsp;Spring\u0026nbsp;bean配置文件注入。在DAO中,讓它擴展Spring的HibernateDaoSupport來集成 Spring 和 Hibernate。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eCustomerBo.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.customer.bo;\r\n\r\nimport java.util.List;\r\nimport com.yiibai.customer.model.Customer;\r\n \r\npublic interface CustomerBo{\r\n\t\r\n\tvoid addCustomer(Customer customer);\r\n\tList\u0026lt;Customer\u0026gt; listCustomer();\r\n\t\r\n}\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eCustomerBoImpl.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.customer.bo.impl;\r\n\r\nimport java.util.List;\r\nimport com.yiibai.customer.bo.CustomerBo;\r\nimport com.yiibai.customer.dao.CustomerDAO;\r\nimport com.yiibai.customer.model.Customer;\r\n \r\npublic class CustomerBoImpl implements CustomerBo{\r\n\t\r\n\tCustomerDAO customerDAO;\r\n\t//DI via Spring\r\n\tpublic void setCustomerDAO(CustomerDAO customerDAO) {\r\n\t\tthis.customerDAO = customerDAO;\r\n\t}\r\n\r\n\t//call DAO to save customer\r\n\tpublic void addCustomer(Customer customer){\r\n\t\tcustomerDAO.addCustomer(customer);\r\n\t}\r\n\t\r\n\t//call DAO to return customers\r\n\tpublic List\u0026lt;Customer\u0026gt; listCustomer(){\r\n\t\treturn customerDAO.listCustomer();\r\n\t}\r\n}\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eCustomerDAO.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.customer.dao;\r\n\r\nimport java.util.List;\r\nimport com.yiibai.customer.model.Customer;\r\n \r\npublic interface CustomerDAO{\r\n\t\r\n\tvoid addCustomer(Customer customer);\r\n\tList\u0026lt;Customer\u0026gt; listCustomer();\t\r\n\t\r\n}\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eCustomerDAOImpl.java\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.customer.dao.impl;\r\n\r\nimport java.util.List;\r\nimport org.springframework.orm.hibernate3.support.HibernateDaoSupport;\r\nimport com.yiibai.customer.dao.CustomerDAO;\r\nimport com.yiibai.customer.model.Customer;\r\n \r\npublic class CustomerDAOImpl extends HibernateDaoSupport \r\n implements CustomerDAO{\r\n\t\r\n\t//add the customer\r\n\tpublic void addCustomer(Customer customer){\r\n\t\tgetHibernateTemplate().save(customer);\r\n\t}\r\n\t\r\n\t//return all the customers in list\r\n\tpublic List\u0026lt;Customer\u0026gt; listCustomer(){\r\n\t\treturn getHibernateTemplate().find(\"from Customer\");\t\t\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eCustomerAction.java\u003c/strong\u003e\u0026nbsp;–\u0026nbsp;\u003cspan\u003eStruts2 的動作不再需要擴展ActionSupport,它將由 Spring 來處理。\u003c/span\u003e \u003c/p\u003e \n\u003cpre\u003epackage com.yiibai.customer.action;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.Date;\r\nimport java.util.List;\r\n\r\nimport com.yiibai.customer.bo.CustomerBo;\r\nimport com.yiibai.customer.model.Customer;\r\nimport com.opensymphony.xwork2.ModelDriven;\r\n \r\npublic class CustomerAction implements ModelDriven{\r\n\r\n\tCustomer customer = new Customer();\r\n\tList\u0026lt;Customer\u0026gt; customerList = new ArrayList\u0026lt;Customer\u0026gt;();\r\n\t\r\n\tCustomerBo customerBo;\r\n\t//DI via Spring\r\n\tpublic void setCustomerBo(CustomerBo customerBo) {\r\n\t\tthis.customerBo = customerBo;\r\n\t}\r\n\r\n\tpublic Object getModel() {\r\n\t\treturn customer;\r\n\t}\r\n\t\r\n\tpublic List\u0026lt;Customer\u0026gt; getCustomerList() {\r\n\t\treturn customerList;\r\n\t}\r\n\r\n\tpublic void setCustomerList(List\u0026lt;Customer\u0026gt; customerList) {\r\n\t\tthis.customerList = customerList;\r\n\t}\r\n\r\n\t//save customer\r\n\tpublic String addCustomer() throws Exception{\r\n\t\t\r\n\t\t//save it\r\n\t\tcustomer.setCreatedDate(new Date());\r\n\t\tcustomerBo.addCustomer(customer);\r\n\t \r\n\t\t//reload the customer list\r\n\t\tcustomerList = null;\r\n\t\tcustomerList = customerBo.listCustomer();\r\n\t\t\r\n\t\treturn \"success\";\r\n\t\r\n\t}\r\n\t\r\n\t//list all customers\r\n\tpublic String listCustomer() throws Exception{\r\n\t\t\r\n\t\tcustomerList = customerBo.listCustomer();\r\n\t\t\r\n\t\treturn \"success\";\r\n\t\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n\u003ch2\u003e 6. Spring相關配置 \u003c/h2\u003e \n\u003cdiv\u003e\n 幾乎所有的配置都是在這裏完成是由Spring專門來整合。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003eCustomerBean.xml\u003c/strong\u003e\u0026nbsp;–\u0026nbsp;\u003cspan\u003e聲明 Spring 的 bean:Action,\u0026nbsp;BO\u0026nbsp;和\u0026nbsp;DAO.\u003c/span\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\"?\u0026gt;\r\n\u0026lt;beans xmlns=\"http://www.springframework.org/schema/beans\"\r\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans \r\n\thttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd\"\u0026gt;\r\n \r\n \t\u0026lt;bean id=\"customerAction\" class=\"com.yiibai.customer.action.CustomerAction\"\u0026gt;\r\n\t\t\u0026lt;property name=\"customerBo\" ref=\"customerBo\" /\u0026gt;\t\r\n\t\u0026lt;/bean\u0026gt;\r\n\r\n\t\u0026lt;bean id=\"customerBo\" class=\"com.yiibai.customer.bo.impl.CustomerBoImpl\" \u0026gt;\r\n\t\t\u0026lt;property name=\"customerDAO\" ref=\"customerDAO\" /\u0026gt;\r\n\t\u0026lt;/bean\u0026gt;\r\n\t\r\n \t\u0026lt;bean id=\"customerDAO\" class=\"com.yiibai.customer.dao.impl.CustomerDAOImpl\" \u0026gt;\r\n\t\t\u0026lt;property name=\"sessionFactory\" ref=\"sessionFactory\" /\u0026gt;\r\n\t\u0026lt;/bean\u0026gt;\r\n \r\n\u0026lt;/beans\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003edatabase.properties\u003c/strong\u003e\u0026nbsp;– 聲明數據庫詳細信息 \u003c/p\u003e \n\u003cpre\u003ejdbc.driverClassName=com.mysql.jdbc.Driver\r\njdbc.url=jdbc:mysql://localhost:3306/yiibai\r\njdbc.username=root\r\njdbc.password=password\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eDataSource.xml\u003c/strong\u003e\u0026nbsp;– 創建一個數據庫源的Bean\u0026nbsp; \u003c/p\u003e \n\u003cpre\u003e\u0026lt;beans xmlns=\"http://www.springframework.org/schema/beans\"\r\nxmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\nxsi:schemaLocation=\"http://www.springframework.org/schema/beans\r\nhttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd\"\u0026gt;\r\n \r\n \u0026lt;bean \r\n class=\"org.springframework.beans.factory.config.PropertyPlaceholderConfigurer\"\u0026gt;\r\n \u0026lt;property name=\"location\"\u0026gt;\r\n \u0026lt;value\u0026gt;WEB-INF/classes/config/database/properties/database.properties\u0026lt;/value\u0026gt;\r\n \u0026lt;/property\u0026gt;\r\n\u0026lt;/bean\u0026gt;\r\n \r\n \u0026lt;bean id=\"dataSource\" \r\n class=\"org.springframework.jdbc.datasource.DriverManagerDataSource\"\u0026gt;\r\n\t\u0026lt;property name=\"driverClassName\" value=\"${jdbc.driverClassName}\" /\u0026gt;\r\n\t\u0026lt;property name=\"url\" value=\"${jdbc.url}\" /\u0026gt;\r\n\t\u0026lt;property name=\"username\" value=\"${jdbc.username}\" /\u0026gt;\r\n\t\u0026lt;property name=\"password\" value=\"${jdbc.password}\" /\u0026gt;\r\n \u0026lt;/bean\u0026gt;\r\n \r\n\u0026lt;/beans\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eHibernateSessionFactory.xml\u003c/strong\u003e\u0026nbsp;–\u0026nbsp;\u003cspan\u003e創建一個SessionFactory Bean來集成Spring和Hibernate。\u003c/span\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\"?\u0026gt;\r\n\u0026lt;beans xmlns=\"http://www.springframework.org/schema/beans\"\r\nxmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\nxsi:schemaLocation=\"http://www.springframework.org/schema/beans\r\nhttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd\"\u0026gt;\r\n \r\n\u0026lt;!-- Hibernate session factory --\u0026gt;\r\n\u0026lt;bean id=\"sessionFactory\" \r\n class=\"org.springframework.orm.hibernate3.LocalSessionFactoryBean\"\u0026gt;\r\n \r\n \u0026lt;property name=\"dataSource\"\u0026gt;\r\n \u0026lt;ref bean=\"dataSource\"/\u0026gt;\r\n \u0026lt;/property\u0026gt;\r\n \r\n \u0026lt;property name=\"hibernateProperties\"\u0026gt;\r\n \u0026lt;props\u0026gt;\r\n \u0026lt;prop key=\"hibernate.dialect\"\u0026gt;org.hibernate.dialect.MySQLDialect\u0026lt;/prop\u0026gt;\r\n \u0026lt;prop key=\"hibernate.show_sql\"\u0026gt;true\u0026lt;/prop\u0026gt;\r\n \u0026lt;/props\u0026gt;\r\n \u0026lt;/property\u0026gt;\r\n \r\n \u0026lt;property name=\"mappingResources\"\u0026gt;\r\n\t\t\u0026lt;list\u0026gt;\r\n \u0026lt;value\u0026gt;com/yiibai/customer/hibernate/Customer.hbm.xml\u0026lt;/value\u0026gt;\r\n\t\t\u0026lt;/list\u0026gt;\r\n \u0026lt;/property\u0026gt;\t\r\n \r\n\u0026lt;/bean\u0026gt;\r\n\u0026lt;/beans\u0026gt;\u003c/pre\u003e \n\u003cp\u003e \u003cstrong\u003eSpringBeans.xml\u003c/strong\u003e\u0026nbsp;–\u0026nbsp;\u003cspan\u003e創建一個核心 Spring 的 bean 配置文件,作爲中央的 bean 管理層。\u003c/span\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;beans xmlns=\"http://www.springframework.org/schema/beans\"\r\nxmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\nxsi:schemaLocation=\"http://www.springframework.org/schema/beans\r\nhttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd\"\u0026gt;\r\n\t\r\n\t\u0026lt;!-- Database Configuration --\u0026gt;\r\n\t\u0026lt;import resource=\"config/spring/DataSource.xml\"/\u0026gt;\r\n\t\u0026lt;import resource=\"config/spring/HibernateSessionFactory.xml\"/\u0026gt;\r\n \r\n\t\u0026lt;!-- Beans Declaration --\u0026gt;\r\n\t\u0026lt;import resource=\"com/yiibai/customer/spring/CustomerBean.xml\"/\u0026gt;\r\n \r\n\u0026lt;/beans\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 7. JSP 頁面 \u003c/h2\u003e \n\u003cdiv\u003e\n JSP頁面來顯示使用 Struts2 標籤的元素。 \n\u003c/div\u003e \n\u003cp\u003e \u003cstrong\u003ecustomer.jsp\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 + Spring + Hibernate integration example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;Add Customer\u0026lt;/h2\u0026gt;\r\n\u0026lt;s:form action=\"addCustomerAction\" \u0026gt;\r\n \u0026lt;s:textfield name=\"name\" label=\"Name\" value=\"\" /\u0026gt;\r\n \u0026lt;s:textarea name=\"address\" label=\"Address\" value=\"\" cols=\"50\" rows=\"5\" /\u0026gt;\r\n \u0026lt;s:submit /\u0026gt;\r\n\u0026lt;/s:form\u0026gt;\r\n\r\n\u0026lt;h2\u0026gt;All Customers\u0026lt;/h2\u0026gt;\r\n\r\n\u0026lt;s:if test=\"customerList.size() \u0026gt; 0\"\u0026gt;\r\n\u0026lt;table border=\"1px\" cellpadding=\"8px\"\u0026gt;\r\n\t\u0026lt;tr\u0026gt;\r\n\t\t\u0026lt;th\u0026gt;Customer Id\u0026lt;/th\u0026gt;\r\n\t\t\u0026lt;th\u0026gt;Name\u0026lt;/th\u0026gt;\r\n\t\t\u0026lt;th\u0026gt;Address\u0026lt;/th\u0026gt;\r\n\t\t\u0026lt;th\u0026gt;Created Date\u0026lt;/th\u0026gt;\r\n\t\u0026lt;/tr\u0026gt;\r\n\t\u0026lt;s:iterator value=\"customerList\" status=\"userStatus\"\u0026gt;\r\n\t\t\u0026lt;tr\u0026gt;\r\n\t\t\t\u0026lt;td\u0026gt;\u0026lt;s:property value=\"customerId\" /\u0026gt;\u0026lt;/td\u0026gt;\r\n\t\t\t\u0026lt;td\u0026gt;\u0026lt;s:property value=\"name\" /\u0026gt;\u0026lt;/td\u0026gt;\r\n\t\t\t\u0026lt;td\u0026gt;\u0026lt;s:property value=\"address\" /\u0026gt;\u0026lt;/td\u0026gt;\r\n\t\t\t\u0026lt;td\u0026gt;\u0026lt;s:date name=\"createdDate\" format=\"dd/MM/yyyy\" /\u0026gt;\u0026lt;/td\u0026gt;\r\n\t\t\u0026lt;/tr\u0026gt;\r\n\t\u0026lt;/s:iterator\u0026gt;\r\n\u0026lt;/table\u0026gt;\r\n\u0026lt;/s:if\u0026gt;\r\n\u0026lt;br/\u0026gt;\r\n\u0026lt;br/\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 8. struts.xml \u003c/h2\u003e \n\u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n \t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n \t\r\n\t\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\t\r\n\t\t\u0026lt;action name=\"addCustomerAction\" \r\n\t\t\tclass=\"customerAction\" method=\"addCustomer\" \u0026gt;\r\n\t\t \u0026lt;result name=\"success\"\u0026gt;pages/customer.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\r\n\t\t\u0026lt;action name=\"listCustomerAction\"\r\n\t\t\tclass=\"customerAction\" method=\"listCustomer\" \u0026gt;\r\n\t\t \u0026lt;result name=\"success\"\u0026gt;pages/customer.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\t\t\r\n\t\u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 9. Struts 2 + Spring \u003c/h2\u003e \n\u003cp\u003e 要集成Struts2和Spring,只需註冊ContextLoaderListener監聽器類,定義一個「contextConfigLocation」參數要求Spring容器來解析「SpringBeans.xml」,而不使用默認的「applicationContext.xml」。 \u003c/p\u003e \n\u003cp\u003e \u003cstrong\u003eweb.xml\u003c/strong\u003e \u003c/p\u003e \n\u003cpre\u003e\u0026lt;!DOCTYPE web-app PUBLIC\r\n \"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN\"\r\n \"http://java.sun.com/dtd/web-app_2_3.dtd\" \u0026gt;\r\n\r\n\u0026lt;web-app\u0026gt;\r\n \u0026lt;display-name\u0026gt;Struts 2 Web Application\u0026lt;/display-name\u0026gt;\r\n \r\n \u0026lt;filter\u0026gt;\r\n\t\u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n\t\u0026lt;filter-class\u0026gt;\r\n\t org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter\r\n\t\u0026lt;/filter-class\u0026gt;\r\n \u0026lt;/filter\u0026gt;\r\n \r\n \u0026lt;filter-mapping\u0026gt;\r\n\t\u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n\t\u0026lt;url-pattern\u0026gt;/*\u0026lt;/url-pattern\u0026gt;\r\n \u0026lt;/filter-mapping\u0026gt;\r\n \r\n \u0026lt;context-param\u0026gt;\r\n\t\u0026lt;param-name\u0026gt;contextConfigLocation\u0026lt;/param-name\u0026gt;\r\n\t\u0026lt;param-value\u0026gt;/WEB-INF/classes/SpringBeans.xml\u0026lt;/param-value\u0026gt;\r\n \u0026lt;/context-param\u0026gt;\r\n \r\n \u0026lt;listener\u0026gt;\r\n \u0026lt;listener-class\u0026gt;\r\n org.springframework.web.context.ContextLoaderListener\r\n \u0026lt;/listener-class\u0026gt;\r\n \u0026lt;/listener\u0026gt;\r\n \r\n\u0026lt;/web-app\u0026gt;\u003c/pre\u003e \n\u003ch2\u003e 10. 運行實例 \u003c/h2\u003e \n\u003cp\u003e 在瀏覽器中打開網址 :\u0026nbsp;http://localhost:8080/ssh/listCustomerAction.action\u003cbr\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2+spring+hibernate-3.png\" alt=\"Struts2+Spring+Hibernate集成實例\"\u003e \u003c/p\u003e \n\u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2+spring+hibernate-4.png\" alt=\"Struts2+Spring+Hibernate集成實例\"\u003e \u003c/p\u003e \n\u003ch2\u003e 參考 \u003c/h2\u003e \n\u003col\u003e \n \u003cli\u003e Struts2 + Hibernate集成實例 \u003c/li\u003e \n \u003cli\u003e Struts2 + Spring集成實例 \u003c/li\u003e \n \u003cli\u003e Struts2 + Hibernate 使用 Full Hibernate Plugin插件集成 \u003c/li\u003e \n\u003c/ol\u003e \n\u003cdiv\u003e\n 代碼下載 -\u0026nbsp; \n \u003ca href=\"http://pan.baidu.com/s/1mgzt1Xm\"\u003ehttp://pan.baidu.com/s/1mgzt1Xm\u003c/a\u003e\u0026nbsp;(含ssh相關類庫,詳見 lib 目錄,文件大小約:18M)。 \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"f9:T13ad,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n 在本教程中,我們學習如何將log4j框架在Struts2的Web應用程序集成。所有需要做的有: \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003col\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 包含 log4j.jar 作爲項目依賴 \n \u003c/div\u003e \u003c/li\u003e \n \u003cli\u003e \n \u003cdiv\u003e\n 創建一個 log4j.properties 文件,並把它放入 classpath 的根目錄-放到資源文件夾中。 \n \u003c/div\u003e \u003c/li\u003e \n \u003c/ol\u003e \n \u003cp\u003e 相關技術和工具的使用: \u003c/p\u003e \n \u003col\u003e \n \u003cli\u003e Log4j 1.2.17 \u003c/li\u003e \n \u003cli\u003e Struts 2.1.8 \u003c/li\u003e \n \u003cli\u003e Tomcat 6 \u003c/li\u003e \n \u003cli\u003e MyEclipse 10 \u003c/li\u003e \n \u003c/ol\u003e \n \u003ch2\u003e 1. 工程結構 \u003c/h2\u003e \n \u003cp\u003e 這裏我們創建一個web工程爲:struts2log4j,參見下面最終的工程結構:\u003cbr\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2+log4j-1.png\" alt=\"Struts2+Log4j集成\"\u003e \u003c/p\u003e \n \u003cdiv\u003e \n \u003c/div\u003e \n \u003ch2\u003e 2. log4j.properties \u003c/h2\u003e \n \u003cdiv\u003e\n 創建log4j的屬性文件,並把它放入資源文件夾,請參閱步驟#1。 \n \u003c/div\u003e \n \u003cdiv\u003e\n log4j.properties \n \u003c/div\u003e \n \u003cpre\u003e# Root logger option\r\nlog4j.rootLogger=ERROR, stdout, file\r\n\r\n# Redirect log messages to console\r\nlog4j.appender.stdout=org.apache.log4j.ConsoleAppender\r\nlog4j.appender.stdout.Target=System.out\r\nlog4j.appender.stdout.layout=org.apache.log4j.PatternLayout\r\nlog4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n\r\n\r\n# Redirect log messages to a log file, support rolling backup file.\r\nlog4j.appender.file=org.apache.log4j.RollingFileAppender\r\nlog4j.appender.file.File=${catalina.home}/logs/mystruts2app.log\r\nlog4j.appender.file.MaxFileSize=5MB\r\nlog4j.appender.file.MaxBackupIndex=10\r\nlog4j.appender.file.layout=org.apache.log4j.PatternLayout\r\nlog4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n\u003c/pre\u003e \n \u003ch2\u003e 4. Struts2 Action 和 Logging \u003c/h2\u003e \n \u003cdiv\u003e\n 一個簡單的動作返回一個頁面,並顯示瞭如何來執行\u0026nbsp;log4j\u0026nbsp;消息日誌記錄。 \n \u003c/div\u003e \n \u003cdiv\u003e\n WelcomeAction.java \n \u003c/div\u003e \n \u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport org.apache.log4j.Logger;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class WelcomeAction extends ActionSupport {\r\n\r\n\tprivate static final long serialVersionUID = 1L;\r\n\r\n\t//get log4j\r\n\tprivate static final Logger logger = Logger.getLogger(WelcomeAction.class);\r\n\r\n\tpublic String execute() throws Exception {\r\n\r\n\t\t// logs debug message\r\n\t\tif (logger.isDebugEnabled()) {\r\n\t\t\tlogger.debug(\"execute()!\");\r\n\t\t}\r\n\r\n\t\t// logs exception\r\n\t\tlogger.error(\"This is Error message\", new Exception(\"Testing\"));\r\n\r\n\t\treturn SUCCESS;\r\n\r\n\t}\r\n}\u003c/pre\u003e \n \u003ch2\u003e 5. Struts2配置 \u003c/h2\u003e \n \u003cdiv\u003e\n Struts2 的配置和JSP頁面,如果想了解的話。 \n \u003c/div\u003e \n \u003cdiv\u003e\n struts.xml \n \u003c/div\u003e \n \u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n\r\n\u0026lt;struts\u0026gt;\r\n\t\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\r\n\t\u0026lt;package name=\"welcome\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\r\n\t\t\u0026lt;action name=\"welcome\" class=\"com.yiibai.common.action.WelcomeAction\"\u0026gt;\r\n\t\t\t\u0026lt;result name=\"success\"\u0026gt;pages/success.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;/action\u0026gt;\r\n\r\n\t\u0026lt;/package\u0026gt;\r\n\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n \u003cdiv\u003e\n web.xml \n \u003c/div\u003e \n \u003cpre\u003e\u0026lt;web-app xmlns=\"http://java.sun.com/xml/ns/javaee\" \r\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n\txsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee \r\n\thttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\r\n\tversion=\"2.5\"\u0026gt;\r\n\r\n\t\u0026lt;display-name\u0026gt;Struts 2 Web Application\u0026lt;/display-name\u0026gt;\r\n\r\n\t\u0026lt;filter\u0026gt;\r\n\t\t\u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n\t\t\u0026lt;filter-class\u0026gt;\r\n\t\t\torg.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter\r\n\t\t\u0026lt;/filter-class\u0026gt;\r\n\t\u0026lt;/filter\u0026gt;\r\n\r\n\t\u0026lt;filter-mapping\u0026gt;\r\n\t\t\u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n\t\t\u0026lt;url-pattern\u0026gt;/*\u0026lt;/url-pattern\u0026gt;\r\n\t\u0026lt;/filter-mapping\u0026gt;\r\n\r\n\u0026lt;/web-app\u0026gt;\u003c/pre\u003e \n \u003cdiv\u003e\n pages/success.jsp \n \u003c/div\u003e \n \u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\u0026lt;head\u0026gt;\r\n\u0026lt;/head\u0026gt;\r\n \r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 + Log4j integration example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n \u003ch2\u003e 6. 實例測試 \u003c/h2\u003e \n \u003cdiv\u003e\n 運行Struts\u0026nbsp;2的Web應用程序,並訪問welcome的動作。 \n \u003c/div\u003e \n \u003cp\u003e 在瀏覽器中打開 URL : http://localhost:8888/struts2log4j/welcome \u003c/p\u003e \n \u003cp\u003e \u003cem\u003e6.1\u003c/em\u003e\u0026nbsp;\u003cspan\u003e所有日誌消息將顯示在控制檯中。\u003c/span\u003e \u003c/p\u003e \n \u003cdiv\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2+log4j-2.png\" alt=\"Struts2+Log4j集成\"\u003e \n \u003c/div\u003e \n \u003cp\u003e \u003cem\u003eFigure : Eclipse 終端\u003c/em\u003e \u003c/p\u003e \n \u003cp\u003e \u003cem\u003e6.2\u003c/em\u003e\u0026nbsp;\u003cspan\u003e此外,日誌文件將在Tomcat 的日誌文件夾中被創建。\u003c/span\u003e \u003c/p\u003e \n \u003cdiv\u003e \n \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2+log4j-3.png\" alt=\"Struts2+Log4j集成\"\u003e \n \u003c/div\u003e \n \u003cp\u003e \u003cem\u003e圖片: C:\\mystruts2app.log\u003c/em\u003e \u003c/p\u003e \n \u003cdiv\u003e\n 下載代碼 –\u0026nbsp;http://pan.baidu.com/s/1nt7yVep \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"fa:T792,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n 在Struts2的開發時,很多人會問爲什麼有些聲明過濾器類是\u0026nbsp;「FilterDispatcher「; 而有一些又是「StrutsPrepareAndExecuteFilter「?\u0026nbsp;但兩者都可以正常使用,並有什麼區別? \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003cp\u003e \u003cem\u003e1. FilterDispatcher 示例\u003c/em\u003e \u003c/p\u003e \n \u003cpre\u003e...\r\n\u0026lt;filter\u0026gt;\r\n \u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n \u0026lt;filter-class\u0026gt;\r\n org.apache.struts2.dispatcher.FilterDispatcher\r\n \u0026lt;/filter-class\u0026gt;\r\n\u0026lt;/filter\u0026gt;\r\n \r\n\u0026lt;filter-mapping\u0026gt;\r\n \u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n \u0026lt;url-pattern\u0026gt;/*\u0026lt;/url-pattern\u0026gt;\r\n\u0026lt;/filter-mapping\u0026gt;\r\n...\u003c/pre\u003e \n \u003cp\u003e \u003cem\u003e2. StrutsPrepareAndExecuteFilter 示例\u003c/em\u003e \u003c/p\u003e \n \u003cpre\u003e...\r\n\u0026lt;filter\u0026gt;\r\n \u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n \u0026lt;filter-class\u0026gt;\r\n org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter\r\n \u0026lt;/filter-class\u0026gt;\r\n\u0026lt;/filter\u0026gt;\r\n \r\n\u0026lt;filter-mapping\u0026gt;\r\n \u0026lt;filter-name\u0026gt;struts2\u0026lt;/filter-name\u0026gt;\r\n \u0026lt;url-pattern\u0026gt;/*\u0026lt;/url-pattern\u0026gt;\r\n\u0026lt;/filter-mapping\u0026gt;\r\n...\u003c/pre\u003e \n \u003ch2\u003e 回答: \u003c/h2\u003e \n \u003cp\u003e The\u0026nbsp;FilterDispatcher\u0026nbsp;(org.apache.struts2.dispatcher.FilterDispatcher)\u0026nbsp;被用在早期的Struts2開發,並且在\u0026nbsp;Struts\u0026nbsp;2.1.3中它就被廢棄了。 \u003c/p\u003e \n \u003cp\u003e 如果使用Struts版本\u0026nbsp;\u0026gt;= 2.1.3,\u0026nbsp;它總是建議升級到新的過濾器類\u0026nbsp;–StrutsPrepareAndExecuteFilter\u0026nbsp;(org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter). \u003c/p\u003e \n \u003ch2\u003e 參考 \u003c/h2\u003e \n \u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/struts2-core/apidocs/org/apache/struts2/dispatcher/FilterDispatcher.htmll\"\u003eFilterDispatcher 文檔\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.8/struts2-core/apidocs/org/apache/struts2/dispatcher/ng/filter/StrutsPrepareAndExecuteFilter.htmll\"\u003eStrutsPrepareAndExecuteFilter 文檔\u003c/a\u003e \u003c/li\u003e \n \u003c/ol\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"fb:T825,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n 在Struts2中,可以使用以下兩種方法來獲取HttpServletRequest對象。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003ch2\u003e 1. ServletActionContext \u003c/h2\u003e \n \u003cdiv\u003e\n 直接從 org.apache.struts2.ServletActionContext 獲取 HttpServletRequest 對象。 \n \u003c/div\u003e \n \u003cpre\u003eimport javax.servlet.http.HttpServletRequest;\r\nimport org.apache.struts2.ServletActionContext;\r\n\r\npublic class LocaleAction{\r\n\t//business logic\r\n\tpublic String execute() {\r\n\t\tHttpServletRequest request = ServletActionContext.getRequest();\r\n\t\treturn \"SUCCESS\";\r\n\t}\r\n}\u003c/pre\u003e \n \u003ch2\u003e 2. ServletRequestAware \u003c/h2\u003e \n \u003cdiv\u003e\n 讓你的類實現org.apache.struts2.interceptor.ServletRequestAware。 \n \u003c/div\u003e \n \u003cdiv\u003e\n 當\u0026nbsp;Struts2\u0026nbsp;的\u0026nbsp;「servlet-config」\u0026nbsp;攔截器的一個Action類實現ServletRequestAware接口,它會通過一個\u0026nbsp;HttpServletRequest\u0026nbsp;的引用請求,通過Action類的setServletRequest()方法完成。 \n \u003c/div\u003e \n \u003cpre\u003eimport javax.servlet.http.HttpServletRequest;\r\nimport org.apache.struts2.interceptor.ServletRequestAware;\r\n\r\npublic class LocaleAction implements ServletRequestAware{\r\n\r\n\tHttpServletRequest request;\r\n\t\r\n\t//business logic\r\n\tpublic String execute() {\r\n\t\tString param = getServletRequest().getParameter(\"param\");\r\n\t\treturn \"SUCCESS\";\r\n\r\n\t}\r\n\r\n\tpublic void setServletRequest(HttpServletRequest request) {\r\n\t\tthis.request = request;\r\n\t}\r\n\r\n\tpublic HttpServletRequest getServletRequest() {\r\n\t\treturn this.request;\r\n\t}\r\n}\u003c/pre\u003e \n \u003cdiv\u003e \n \u003cdiv\u003e\n Struts2\u0026nbsp;文檔中建議使用\u0026nbsp;ServletRequestAware\u0026nbsp;代替\u0026nbsp;ServletActionContext。 \n \u003c/div\u003e \n \u003c/div\u003e \n \u003ch2\u003e 參考 \u003c/h2\u003e \n \u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.x/docs/how-can-we-access-the-httpservletrequest.htmll\"\u003ehttp://struts.apache.org/2.x/docs/how-can-we-access-the-httpservletrequest.htmll\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.6/struts2-core/apidocs/org/apache/struts2/interceptor/ServletRequestAware.htmll\"\u003ehttp://struts.apache.org/2.0.6/struts2-core/apidocs/org/apache/struts2/interceptor/ServletRequestAware.htmll\u003c/a\u003e \u003c/li\u003e \n \u003c/ol\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"fc:T935,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n 在Struts2中,可以用以下兩種方式來獲取HttpServletResponse對象。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003ch2\u003e 1. ServletActionContext \u003c/h2\u003e \n \u003cp\u003e 通過\u0026nbsp;ServletActionContext\u0026nbsp;類來訪問\u0026nbsp;HttpServletResponse\u0026nbsp;。 \u003c/p\u003e \n \u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport javax.servlet.http.HttpServletResponse;\r\nimport org.apache.struts2.ServletActionContext;\r\n\r\npublic class LocaleAction{\r\n\t//business logic\r\n\tpublic String execute() {\r\n\t\tHttpServletResponse response = ServletActionContext.getResponse();\r\n\t\t\r\n\t\treturn \"SUCCESS\";\r\n\t}\r\n}\u003c/pre\u003e \n \u003ch2\u003e 2. ServletResponseAware \u003c/h2\u003e \n \u003cdiv\u003e\n 通過實現 ServletResponseAware 接口並覆蓋 setServletResponse()方法來訪問HttpServletResponse。 \n \u003c/div\u003e \n \u003cdiv\u003e \n \u003cstrong\u003e注意\u003c/strong\u003e \n \u003cbr\u003e 當Struts2的「servlet-config」攔截器是看到一個Action類實現ServletResponseAware接口,它會通過一個HttpServletResponse的引用Action類通過setServletResponse()方法請求。 \n \u003cdiv\u003e\n 當然,也可以創建自定義 getServletResponse()來獲得 HttpServletResponse。 \n \u003c/div\u003e \n \u003c/div\u003e \n \u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.util.Locale;\r\nimport javax.servlet.http.HttpServletResponse;\r\nimport org.apache.struts2.interceptor.ServletResponseAware;\r\n\r\npublic class LocaleAction implements ServletResponseAware{\r\n\r\n\tHttpServletResponse response;\r\n\t\r\n\t//business logic\r\n\tpublic String execute() {\r\n\t\tLocale locale = getServletResponse().getLocale();\r\n\t\treturn \"SUCCESS\";\r\n\t}\r\n\r\n\tpublic void setServletResponse(HttpServletResponse response) {\r\n\t\tthis.response = response;\r\n\t}\r\n\tpublic HttpServletResponse getServletResponse() {\r\n\t\treturn this.response;\r\n\t}\t\r\n}\u0026nbsp;\u003c/pre\u003e \n \u003cp\u003e 這兩個機制都可以得到同樣 HttpServletResponse 對象,但 Struts2 文檔推薦使用 ServletResponseAware,請參見下面的參考資料: \u003c/p\u003e \n \u003ch2\u003e 參考 \u003c/h2\u003e \n \u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.x/docs/how-can-we-access-the-httpservletresponse.htmll\"\u003ehttp://struts.apache.org/2.x/docs/how-can-we-access-the-httpservletresponse.htmll\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.1.2/struts2-core/apidocs/org/apache/struts2/interceptor/ServletResponseAware.htmll\"\u003ehttp://struts.apache.org/2.1.2/struts2-core/apidocs/org/apache/struts2/interceptor/ServletResponseAware.htmll\u003c/a\u003e \u003c/li\u003e \n \u003c/ol\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"fd:T6a5,"])</script><script>self.__next_f.push([1,"\u003cdiv class=\"__kindeditor_paste__\"\u003e \n \u003cdiv\u003e \n \u003cdiv\u003e\n 在Struts2中,可以使用以下兩種方法來獲取ServletContext對象。 \n \u003c/div\u003e \n \u003c/div\u003e \n \u003cdiv\u003e \n \u003ch2\u003e 1. ServletActionContext \u003c/h2\u003e \n \u003cdiv\u003e\n 直接從 org.apache.struts2.ServletActionContext 獲取 ServletContext 對象。 \n \u003c/div\u003e \n \u003cpre\u003eimport javax.servlet.ServletContext;\r\nimport org.apache.struts2.ServletActionContext;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class CustomerAction extends ActionSupport{\r\n\t\r\n\tpublic String execute() throws Exception {\r\n\t\t\r\n\t\tServletContext context = ServletActionContext.getServletContext();\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t\t\r\n\t}\r\n\r\n}\u003c/pre\u003e \n \u003ch2\u003e 2. ServletContextAware \u003c/h2\u003e \n \u003cdiv\u003e\n 讓你的類實現了org.apache.struts2.util.ServletContextAware接口。 \n \u003c/div\u003e \n \u003cdiv\u003e\n 當Struts2\u0026nbsp;的\u0026nbsp;「servlet-config」攔截器是看到了一個Action類實現ServletContextAwareinterface,它會通過一個ServletContext引用Action類通過setServletContext()方法請求。 \n \u003c/div\u003e \n \u003cpre\u003eimport javax.servlet.ServletContext;\r\nimport org.apache.struts2.util.ServletContextAware;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n \r\npublic class CustomerAction \r\n extends ActionSupport implements ServletContextAware{\r\n\r\n\tServletContext context;\r\n\t\r\n\tpublic String execute() throws Exception {\r\n\t\t\r\n\t\treturn SUCCESS;\r\n\t\t\r\n\t}\r\n\r\n\tpublic void setServletContext(ServletContext context) {\r\n\t\tthis.context = context;\r\n\t}\r\n}\u003c/pre\u003e \n \u003ch2\u003e 參考 \u003c/h2\u003e \n \u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.0.11.1/struts2-core/apidocs/org/apache/struts2/util/ServletContextAware.htmll\"\u003eStruts 2 ServletContextAware文檔\u003c/a\u003e \u003c/li\u003e \n \u003c/ol\u003e \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"fe:Td1b,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e \n \u003cspan\u003e在某些情況下,可能需要一個Action類分配一些預定義或靜態的參數值。\u003c/span\u003e \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003cdiv\u003e \n \u003ch2\u003e \n \u003cdiv\u003e\n 爲動作定義靜態參數 \n \u003c/div\u003e \u003c/h2\u003e \n \u003cdiv\u003e\n 在Struts2,可以在 struts.xml\u0026nbsp;文件中的通過\u0026lt;param\u0026gt;標記進行配置,例如, \n \u003c/div\u003e \n \u003cp\u003e \u003cstrong\u003estruts.xml\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003e\u0026lt;struts\u0026gt;\r\n\r\n \u0026lt;constant name=\"struts.custom.i18n.resources\" value=\"global\" /\u0026gt;\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\r\n \u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n\t\u0026lt;action name=\"locale\" class=\"com.yiibai.common.action.LocaleAction\"\u0026gt;\r\n\t\t\u0026lt;result name=\"SUCCESS\"\u0026gt;pages/welcome.jsp\u0026lt;/result\u0026gt;\r\n\t\t\u0026lt;param name=\"EnglishParam\"\u0026gt;English\u0026lt;/param\u0026gt;\r\n \t \u0026lt;param name=\"ChineseParam\"\u0026gt;Chinese\u0026lt;/param\u0026gt;\r\n \t \u0026lt;param name=\"FranceParam\"\u0026gt;France\u0026lt;/param\u0026gt;\r\n\t\u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n \u003cdiv\u003e\n 它分配三個預定義的參數值到LocaleAction\u0026nbsp;Action類。 \n \u003c/div\u003e \n \u003ch2\u003e \n \u003cdiv\u003e\n 從動作獲取靜態參數 \n \u003c/div\u003e \u003c/h2\u003e \n \u003cp\u003e 要從struts.xml中獲取靜態參數值,Action類必須實現參數化Parameterizable接口。動作的靜態參數是由staticParams攔截,其中包括在默認堆棧控制 \u003c/p\u003e \n \u003cdiv\u003e \n \u003cdiv\u003e\n 動作的靜態參數是由staticParams攔截,包括在默認堆棧 「struts-default.xml」\u0026nbsp;中控制。 \n \u003c/div\u003e \n \u003c/div\u003e \n \u003ch2\u003e 1. Map屬性 \u003c/h2\u003e \n \u003cdiv\u003e\n 在操作類初始化期間,staticParams攔截器將通過動作類的setParams()方法獲取預先定義的參數值。 \n \u003c/div\u003e \n \u003cpre\u003e//...\r\nimport com.opensymphony.xwork2.config.entities.Parameterizable;\r\n\r\npublic class LocaleAction implements Parameterizable{\r\n\r\n\tMap\u0026lt;String, String\u0026gt; params;\r\n\t//...\r\n\tpublic void setParams(Map\u0026lt;String, String\u0026gt; params) {\r\n\t\tthis.params = params;\r\n\t}\r\n}\u003c/pre\u003e \n \u003ch2\u003e 2. JavaBean 屬性 \u003c/h2\u003e \n \u003cp\u003e 在動作類的初始化,如果創建了getter和setter方法得當,staticParams攔截器將設置預先定義的參數值,以對應於該「參數」的每JavaBean屬性。 \u003c/p\u003e \n \u003cpre\u003e//...\r\nimport com.opensymphony.xwork2.config.entities.Parameterizable;\r\n\r\npublic class LocaleAction implements Parameterizable{\r\n\r\n\tString englishParam;\r\n\tString chineseParam;\r\n\tString franceParam;\r\n\t\r\n\tpublic String getEnglishParam() {\r\n\t\treturn englishParam;\r\n\t}\r\n\r\n\tpublic void setEnglishParam(String englishParam) {\r\n\t\tthis.englishParam = englishParam;\r\n\t}\r\n\r\n\tpublic String getChineseParam() {\r\n\t\treturn chineseParam;\r\n\t}\r\n\r\n\tpublic void setChineseParam(String chineseParam) {\r\n\t\tthis.chineseParam = chineseParam;\r\n\t}\r\n\r\n\tpublic String getFranceParam() {\r\n\t\treturn franceParam;\r\n\t}\r\n\r\n\tpublic void setFranceParam(String franceParam) {\r\n\t\tthis.franceParam = franceParam;\r\n\t}\r\n //...\r\n}\u003c/pre\u003e \n \u003c/div\u003e \n \u003cp\u003e \u003c/p\u003e \n \u003ch2\u003e 2. 運行實例 \u003c/h2\u003e \n \u003cp\u003e 在瀏覽器中打開URL:http://localhost:8080/configure-param/locale.action \u003c/p\u003e \n \u003cp\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2action-1.png\" alt=\"Struts2配置Action類的靜態參數\"\u003e \u003c/p\u003e \n \u003cp\u003e\u003c/p\u003e \n \u003cdiv\u003e \n \u003c/div\u003e \n \u003cdiv\u003e\n 代碼下載(configure-param) -\u0026nbsp; \n \u003ca href=\"http://pan.baidu.com/s/1dDmGDK9\"\u003ehttp://pan.baidu.com/s/1dDmGDK9\u003c/a\u003e \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"ff:T1162,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e \n \u003cspan\u003e這是一個Struts2的例子來說明使用定製返回類型,允許用戶下載文件。web工程的文件夾結構如下所示:\u003cbr\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-29.png\" alt=\"Struts2下載文件實例\"\u003e\u003cbr\u003e \u003c/span\u003e \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003ch2\u003e 1. Action \u003c/h2\u003e \n \u003cdiv\u003e\n 在Action類中,聲明一個\u0026nbsp;InputStream\u0026nbsp;的數據類型和getter方法。 \n \u003c/div\u003e \n \u003cp\u003e \u003cstrong\u003eDownloadAction.java\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.io.File;\r\nimport java.io.FileInputStream;\r\nimport java.io.InputStream;\r\nimport com.opensymphony.xwork2.ActionSupport;\r\n\r\npublic class DownloadAction extends ActionSupport{\r\n\r\n\tprivate InputStream fileInputStream;\r\n\t\r\n\tpublic InputStream getFileInputStream() {\r\n\t\treturn fileInputStream;\r\n\t}\r\n\r\n\tpublic String execute() throws Exception {\r\n\t fileInputStream = new FileInputStream(new File(\"C:\\\\\u003cspan\u003efile-for-download\u003c/span\u003e\u003cspan\u003e.txt\"));\u003c/span\u003e return SUCCESS;\r\n\t}\r\n}\u003c/pre\u003e \n \u003ch2\u003e 2. 視圖文件 \u003c/h2\u003e \n \u003cdiv\u003e\n 一個正常的頁面,有一個下載鏈接,用於下載文件。 \n \u003c/div\u003e \n \u003cp\u003e \u003cstrong\u003edownloadPage.jsp\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003e\u0026lt;%@ taglib prefix=\"s\" uri=\"/struts-tags\" %\u0026gt;\r\n\u0026lt;html\u0026gt;\r\n\r\n\u0026lt;body\u0026gt;\r\n\u0026lt;h1\u0026gt;Struts 2 download file example\u0026lt;/h1\u0026gt;\r\n\r\n\u0026lt;s:url id=\"fileDownload\" namespace=\"/\" action=\"download\" \u0026gt;\u0026lt;/s:url\u0026gt;\r\n\r\n\u0026lt;div\u0026gt;\u0026lt;div class=\"ads-in-post hide_if_width_less_800\"\u0026gt;\r\n\u0026lt;script async src=\"//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\"\u0026gt;\u0026lt;/script\u0026gt;\r\n\u0026lt;!-- 728x90 - After2ndH4 --\u0026gt;\r\n\u0026lt;ins class=\"adsbygoogle hide_if_width_less_800\" \r\n style=\"display:inline-block;width:728px;height:90px\"\r\n data-ad-client=\"ca-pub-2836379775501347\"\r\n data-ad-slot=\"3642936086\"\r\n\t data-ad-region=\"yiibairegion\"\u0026gt;\u0026lt;/ins\u0026gt;\r\n\u0026lt;script\u0026gt;\r\n(adsbygoogle = window.adsbygoogle || []).push({});\r\n\u0026lt;/script\u0026gt;\r\n\u0026lt;/div\u0026gt;\u0026lt;/div\u0026gt;\u0026lt;h2\u0026gt;Download file - \u0026lt;s:a href=\"%{fileDownload}\"\u0026gt;fileABC.txt\u0026lt;/s:a\u0026gt;\r\n\u0026lt;/h2\u0026gt;\r\n\t\r\n\u0026lt;/body\u0026gt;\r\n\u0026lt;/html\u0026gt;\u003c/pre\u003e \n \u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n \u003cp\u003e 定義下載文件的細節。\u0026nbsp;\u0026lt;param name=」inputName」\u0026gt;\u0026nbsp;值是從Action的InputStream屬性的名稱。 \u003c/p\u003e \n \u003cdiv\u003e\n 閱讀 \n \u003ca href=\"http://struts.apache.org/2.x/docs/stream-result.html\"\u003eStruts2的數據流結果文檔\u003c/a\u003e以瞭解更詳細信息。 \n \u003c/div\u003e \n \u003cp\u003e \u003cstrong\u003estruts.xml\u003c/strong\u003e \u003c/p\u003e \n \u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n\u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\r\n\u0026lt;package name=\"default\" namespace=\"/\" extends=\"struts-default\"\u0026gt;\r\n \u0026lt;action name=\"show\"\u0026gt;\r\n\t\u0026lt;result name=\"success\"\u0026gt;pages/downloadPage.jsp\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\t\t\r\n \u0026lt;action name=\"download\" class=\"com.yiibai.common.action.DownloadAction\"\u0026gt;\r\n\t\u0026lt;result name=\"success\" type=\"stream\"\u0026gt;\r\n\t \u0026lt;param name=\"contentType\"\u0026gt;application/octet-stream\u0026lt;/param\u0026gt;\r\n\t \u0026lt;param name=\"inputName\"\u0026gt;fileInputStream\u0026lt;/param\u0026gt;\r\n\t \u0026lt;param name=\"contentDisposition\"\u0026gt;attachment;filename=\"\u003cspan\u003efile-for-download\u003c/span\u003e\u003cspan\u003e.txt\"\u0026lt;/param\u0026gt;\u003c/span\u003e \u0026lt;param name=\"bufferSize\"\u0026gt;1024\u0026lt;/param\u0026gt;\r\n\t\u0026lt;/result\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n\u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n \u003ch2\u003e 4. 執行結果 \u003c/h2\u003e \n \u003cp\u003e 在瀏覽器中打開:http://localhost:8080/struts2download/\u003cbr\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2-30.png\" alt=\"Struts2下載文件實例\"\u003e \u003c/p\u003e \n \u003ch2\u003e 參考 \u003c/h2\u003e \n \u003col\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.x/docs/stream-result.html\"\u003ehttp://struts.apache.org/2.x/docs/stream-result.html\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://www.iana.org/assignments/media-types/\"\u003ehttp://www.iana.org/assignments/media-types/\u003c/a\u003e \u003c/li\u003e \n \u003cli\u003e http://www.yiibai.com/struts/struts-download-file-from-website-example.html \u003c/li\u003e \n \u003cli\u003e http://www.yiibai.com/java/how-to-download-file-from-website-java-jsp.html \u003c/li\u003e \n \u003cli\u003e \u003ca href=\"http://struts.apache.org/2.x/docs/how-can-we-return-a-text-string-as-the-response.html\"\u003ehttp://struts.apache.org/2.x/docs/how-can-we-return-a-text-string-as-the-response.html\u003c/a\u003e \u003c/li\u003e \n \u003c/ol\u003e \n \u003cdiv\u003e\n 代碼下載(struts2download) -\u0026nbsp; \n \u003ca href=\"http://pan.baidu.com/s/1n2C5S\"\u003ehttp://pan.baidu.com/s/1jGg0Lzo\u003c/a\u003e \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"100:Tfdd,"])</script><script>self.__next_f.push([1,"\u003cdiv\u003e \n \u003cdiv\u003e\n 在這個Struts2例子,將學習如何通過「struts2-json-plugin.jar」庫將對象轉換爲JSON格式的數據。 \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cdiv\u003e \n \u003ch2\u003e 1. Action (JSON) \u003c/h2\u003e \n \u003cdiv\u003e\n 這是一個將被轉換成JSON格式的 Action 類。 \n \u003c/div\u003e \n \u003cpre\u003epackage com.yiibai.common.action;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.HashMap;\r\nimport java.util.List;\r\nimport java.util.Map;\r\n\r\nimport com.opensymphony.xwork2.Action;\r\n\r\npublic class JSONDataAction{\r\n\r\n\tprivate String string1 = \"A\";\r\n\tprivate String[] stringarray1 = {\"A1\",\"B1\"};\r\n\tprivate int number1 = 123456789;\r\n\tprivate int[] numberarray1 = {1,2,3,4,5,6,7,8,9};\r\n\tprivate List\u0026lt;String\u0026gt; lists = new ArrayList\u0026lt;String\u0026gt;();\r\n\tprivate Map\u0026lt;String, String\u0026gt; maps = new HashMap\u0026lt;String, String\u0026gt;();\r\n\t\r\n\t//no getter method, will not include in the JSON\r\n\tprivate String string2 = \"B\";\r\n\t\r\n\tpublic JSONDataAction(){\r\n\t\tlists.add(\"list1\");\r\n\t\tlists.add(\"list2\");\r\n\t\tlists.add(\"list3\");\r\n\t\tlists.add(\"list4\");\r\n\t\tlists.add(\"list5\");\r\n\t\t\r\n\t\tmaps.put(\"key1\", \"value1\");\r\n\t\tmaps.put(\"key2\", \"value2\");\r\n\t\tmaps.put(\"key3\", \"value3\");\r\n\t\tmaps.put(\"key4\", \"value4\");\r\n\t\tmaps.put(\"key5\", \"value5\");\r\n\t}\r\n\r\n\tpublic String execute() {\r\n return Action.SUCCESS;\r\n }\r\n\t\r\n\tpublic String getString1() {\r\n\t\treturn string1;\r\n\t}\r\n\r\n\tpublic void setString1(String string1) {\r\n\t\tthis.string1 = string1;\r\n\t}\r\n\r\n\tpublic String[] getStringarray1() {\r\n\t\treturn stringarray1;\r\n\t}\r\n\r\n\tpublic void setStringarray1(String[] stringarray1) {\r\n\t\tthis.stringarray1 = stringarray1;\r\n\t}\r\n\r\n\tpublic int getNumber1() {\r\n\t\treturn number1;\r\n\t}\r\n\r\n\tpublic void setNumber1(int number1) {\r\n\t\tthis.number1 = number1;\r\n\t}\r\n\r\n\tpublic int[] getNumberarray1() {\r\n\t\treturn numberarray1;\r\n\t}\r\n\r\n\tpublic void setNumberarray1(int[] numberarray1) {\r\n\t\tthis.numberarray1 = numberarray1;\r\n\t}\r\n\r\n\tpublic List\u0026lt;String\u0026gt; getLists() {\r\n\t\treturn lists;\r\n\t}\r\n\r\n\tpublic void setLists(List\u0026lt;String\u0026gt; lists) {\r\n\t\tthis.lists = lists;\r\n\t}\r\n\r\n\tpublic Map\u0026lt;String, String\u0026gt; getMaps() {\r\n\t\treturn maps;\r\n\t}\r\n\r\n\tpublic void setMaps(Map\u0026lt;String, String\u0026gt; maps) {\r\n\t\tthis.maps = maps;\r\n\t}\r\n\t\r\n}\u003c/pre\u003e \n \u003ch2\u003e 3. struts.xml \u003c/h2\u003e \n \u003cdiv\u003e\n 要輸出JSON數據,需要聲明一個包,它擴展「json-default」,會將結果類型轉爲「json」。 \n \u003c/div\u003e \n \u003cpre\u003e\u0026lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?\u0026gt;\r\n\u0026lt;!DOCTYPE struts PUBLIC\r\n\"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN\"\r\n\"http://struts.apache.org/dtds/struts-2.0.dtd\"\u0026gt;\r\n \r\n\u0026lt;struts\u0026gt;\r\n\r\n \u0026lt;constant name=\"struts.devMode\" value=\"true\" /\u0026gt;\r\n\t\r\n \u0026lt;package name=\"default\" namespace=\"/\" extends=\"json-default\"\u0026gt;\r\n \u0026lt;action name=\"getJSONResult\" \r\n class=\"com.yiibai.common.action.JSONDataAction\"\u0026gt;\r\n \t \u0026lt;result type=\"json\" /\u0026gt;\r\n \u0026lt;/action\u0026gt;\r\n \u0026lt;/package\u0026gt;\r\n\t\r\n\u0026lt;/struts\u0026gt;\u003c/pre\u003e \n \u003ch2\u003e 4. 實例 \u003c/h2\u003e \n \u003cdiv\u003e\n 訪問動作URL時,JSONDataAction屬性將被轉換成JSON格式。 \n \u003c/div\u003e \n \u003cp\u003e \u003cem\u003ehttp://localhost:8080/struts2json/getJSONResult.action\u003cbr\u003e \u003cimg src=\"https://asset.1ju.org/cmsstatic/struts2json-1.png\" alt=\"Struts2和JSON實例\"\u003e\u003cbr\u003e \u003c/em\u003e \u003c/p\u003e \n \u003cp\u003e JSON 格式 … \u003c/p\u003e \n \u003cpre\u003e{\r\n \"lists\":[\"list-1\",\"list-2\",\"list-3\",\"list-4\",\"list-5\"],\r\n \"maps\":\r\n {\r\n \"key4\":\"value4\",\"key3\":\"value3\",\"key5\":\"value5\",\"key2\":\"value2\",\"key1\":\"value1\"\r\n },\r\n \"number1\":123456789,\r\n \"numberarray1\":[1,2,3,4,5,6,7,8,9],\r\n \"string1\":\"A\",\r\n \"stringarray1\":[\"A1\",\"B1\"]\r\n}\u0026nbsp;\u003c/pre\u003e \n \u003cdiv\u003e\n 希望這個簡單的例子可以瞭解JSON插件在Struts2是如何工作的有一個總體的思路。不過,還是有很多有用的參數不包括在這裏,請務必閱讀\u0026nbsp; \n \u003ca href=\"http://struts.apache.org/docs/json-plugin.html\"\u003eStruts2 JSON插件文檔\u003c/a\u003e\u0026nbsp;以獲取更多詳細信息。 \n \u003c/div\u003e \n \u003cdiv\u003e \n \u003cbr\u003e \n \u003c/div\u003e \n \u003cdiv\u003e\n 下載源代碼(struts2json)\u0026nbsp;–\u0026nbsp; \n \u003ca href=\"http://pan.baidu.com/s/1bnv8l9X\"\u003ehttp://pan.baidu.com/s/1bnv8l9X\u003c/a\u003e \n \u003c/div\u003e \n \u003cdiv\u003e \n \u003cbr\u003e \n \u003c/div\u003e \n\u003c/div\u003e \n\u003cbr\u003e"])</script><script>self.__next_f.push([1,"d:[\"$\",\"div\",null,{\"className\":\"page-content\",\"children\":[\"$\",\"div\",null,{\"className\":\"container\",\"children\":[\"$\",\"div\",null,{\"className\":\"row\",\"children\":[[\"$\",\"$L10\",null,{\"tutorial\":{\"state\":\"archived\",\"_id\":\"59fd7e211e18b40005ab9e68\",\"key\":\"struts-2\",\"indexUrl\":\"index\",\"parent\":\"59fbe1e297472d0010f2526c\",\"description\":\"Apache的Struts2是一個優雅的,可擴展的框架,用於創建企業準備的Java Web應用程序。該框架旨在簡化整個開發週期,從構建,部署,維護應用程序隨着時間的推移。 Apache的Struts2最初被稱爲WebWork2。\",\"url\":\"struts-2\",\"name\":\"Struts2教學\",\"__v\":0,\"sections\":[{\"order\":0,\"_id\":\"59fd7e211e18b40005ab9e69\",\"isDefault\":false,\"name\":\"Struts2教程\",\"sortedPosts\":[{\"order\":0,\"_id\":\"5fcf8cefd5dd8e00183d72fb\",\"post\":{\"meta\":{\"description\":\"Apache的Struts2是一個優雅的,可擴展的框架,用於創建企業準備的Java Web應用程序。該框架旨在簡化整個開發週期,從構建,部署,維護應用程序隨着時間的推移。 Apache的Struts2最初被稱爲WebWork2。\",\"keywords\":\"Struts2,Struts2教程,Struts2標籤,Struts2攔截器,Struts中文\"},\"content\":{\"extended\":\"$11\"},\"state\":\"published\",\"views\":963,\"order\":0,\"_id\":\"59fd7e211e18b40005ab9e6a\",\"key\":\"index-25\",\"url\":\"index\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2教學\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:45:21.888Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:14.367Z\"}},{\"order\":2,\"_id\":\"5fcf8cefd5dd8e00183d72fc\",\"post\":{\"meta\":{\"description\":\"Struts2是基於MVC設計模式的流行和成熟的Web應用程序框架。 Struts2 並不只是 Struts 1 下一個版本,但它是一個完全重寫的Struts架構。 WebWork框架開始了與Struts框架爲基礎,其目標是建立在\",\"keywords\":\"Struts2,入門\"},\"content\":{\"extended\":\"$12\"},\"state\":\"published\",\"views\":664,\"order\":2,\"_id\":\"59fd7e241e18b40005ab9e6b\",\"key\":\"struts2-quick-guide\",\"url\":\"struts2-quick-guide\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2快速入門\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:45:24.772Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:14.335Z\"}},{\"order\":3,\"_id\":\"5fcf8cefd5dd8e00183d72fd\",\"post\":{\"meta\":{\"description\":\"模型視圖控制器(ModelViewController)或MVC,MVC是俗稱,是一種軟件設計模式,用於開發Web應用程序。模型 - 視圖 - 控制器模式是由以下三個部分組成: Model- 模型是負責維護數據最低級別。\",\"keywords\":\"Struts2,基本,的,MVC,架構,模型,視圖,控制器,\"},\"content\":{\"extended\":\"\u003cp\u003e 模型視圖控制器(Model\u0026nbsp;View\u0026nbsp;Controller)或MVC,MVC是俗稱,是一種軟件設計模式,用於開發Web應用程序。模型 - 視圖 - 控制器模式是由以下三個部分組成:\u003c/p\u003e \\n\u003cul\u003e \\n \u003cli\u003e \u003cp\u003e Model\u0026nbsp;- 模型是負責維護數據最低級別。\u003c/p\u003e \u003c/li\u003e \\n \u003cli\u003e \u003cp\u003e View\u0026nbsp;- 這是負責向用戶顯示的全部或部分數據。\u003c/p\u003e \u003c/li\u003e \\n \u003cli\u003e \u003cp\u003e Controller\u0026nbsp;- 軟件代碼,控制模型和視圖之間的相互作用。\u003c/p\u003e \u003c/li\u003e \\n\u003c/ul\u003e \\n\u003cp\u003e MVC是受歡迎的,因爲它從用戶界面層,應用邏輯隔離,並支持關注點分離。在這裏,控制器接收所有請求的應用和模型準備視圖所需要的任何數據。查看,然後使用編制的數據由控制器生成最終像樣的迴應。 MVC抽象可以以圖形方式顯示如下。\u003c/p\u003e \\n\u003cimg alt=\\\"Struts MVC\\\" src=\\\"https://asset.1ju.org/cmsstatic/struts2-mvc-1.jpg\\\" title=\\\"Struts MVC\\\"\u003e \\n\u003ch2\u003e 模型\u003c/h2\u003e \\n\u003cp\u003e 該模型是負責管理應用程序的數據。它響應視圖的請求,也響應從控制器的指示進行自我更新。\u003c/p\u003e \\n\u003ch2\u003e 視圖\u003c/h2\u003e \\n\u003cp\u003e 在一個特定格式的數據,一個演示控制器的決定,顯示數據所引發的。他們是基於腳本的模板系統,如JSP,ASP,PHP,並且很容易整合AJAX技術。\u003c/p\u003e \\n\u003ch2\u003e 控制器\u003c/h2\u003e \\n\u003cp\u003e 該控制器負責響應用戶輸入和執行數據模型對象的相互作用。控制器接收輸入,驗證輸入,然後進行業務操作,修改數據模型的狀態。\u003c/p\u003e \\n\u003cp\u003e Struts2是一個基於MVC框架。在接下來的章節中,讓我們看看如何使用Struts2 的MVC方法內。\u003c/p\u003e \\n\u003cbr\u003e\"},\"state\":\"published\",\"views\":558,\"order\":3,\"_id\":\"59fd7e251e18b40005ab9e6c\",\"key\":\"basic-mvc-architecture\",\"url\":\"basic-mvc-architecture\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 MVC架構\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:45:25.117Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:14.222Z\"}},{\"order\":4,\"_id\":\"5fcf8cefd5dd8e00183d72fe\",\"post\":{\"meta\":{\"description\":\"Struts2是流行和成熟的基於MVC設計模式的Web應用程序框架。 Struts2不只是Struts1下一個版本,它是一個完全重寫的Struts架構。 WebWork框架開始以Struts框架爲基礎,其目標是提供一個加強和改\",\"keywords\":\"Struts2,是什麼,Struts2,是,流行,和,成熟,\"},\"content\":{\"extended\":\"$13\"},\"state\":\"published\",\"views\":590,\"order\":4,\"_id\":\"59fd7e251e18b40005ab9e6d\",\"key\":\"struts-overview\",\"url\":\"struts-overview\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 是什麼?\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:45:25.386Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:14.214Z\"}},{\"order\":5,\"_id\":\"5fcf8cefd5dd8e00183d72ff\",\"post\":{\"meta\":{\"description\":\"我們的首要任務是讓最低限度的Struts2應用程序運行。本章將指導您如何準備開發環境中開始使用Struts2。我假設你已經在機器上安裝JDK(5 +),Tomcat和Eclipse。如果還沒有安裝這些組件(\",\"keywords\":\"Struts2,環境,配置,我們,的,首要任務,是,讓,\"},\"content\":{\"extended\":\"$14\"},\"state\":\"published\",\"views\":710,\"order\":5,\"_id\":\"59fd7e261e18b40005ab9e6e\",\"key\":\"struts-environment-setup\",\"url\":\"struts-environment-setup\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 環境配置\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:45:26.239Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:14.201Z\"}},{\"order\":6,\"_id\":\"5fcf8cefd5dd8e00183d7300\",\"post\":{\"meta\":{\"description\":\"由高層次,Struts2是一個上拉型MVC(MVC2)框架。在Struts2的模型 - 視圖 - 控制器模式,實現以下五個核心部件: Actions Interceptors Value Stack / OGNL Results / Result types View technologies Struts 2 從傳統\",\"keywords\":\"Struts2,體系結構,由,高層次,Struts2,是,一\"},\"content\":{\"extended\":\"\u003cp\u003e 由高層次,Struts2是一個上拉型MVC(MVC2)框架。在Struts2的模型 - 視圖 - 控制器模式,實現以下五個核心部件:\u003c/p\u003e \\n\u003cul\u003e \\n \u003cli\u003e \u003cp\u003e Actions\u003c/p\u003e \u003c/li\u003e \\n \u003cli\u003e \u003cp\u003e Interceptors\u003c/p\u003e \u003c/li\u003e \\n \u003cli\u003e \u003cp\u003e Value Stack / OGNL\u003c/p\u003e \u003c/li\u003e \\n \u003cli\u003e \u003cp\u003e Results / Result types\u003c/p\u003e \u003c/li\u003e \\n \u003cli\u003e \u003cp\u003e View technologies\u003c/p\u003e \u003c/li\u003e \\n\u003c/ul\u003e \\n\u003cp\u003e Struts 2 從傳統的MVC框架操作需要的模型,而不是在控制器角色略有不同,雖然有一些重疊。\u003c/p\u003e \\n\u003cimg alt=\\\"Struts 2 Architecture\\\" src=\\\"https://asset.1ju.org/cmsstatic/struts2-2.gif\\\"\u003e \\n\u003cp\u003e 上面的圖描繪Struts2的高層體系結構模型,視圖和控制器。控制器實現一個Struts2的調度Servlet過濾器,以及攔截,模型是實施行動和結果類型和結果的組合視圖。值棧和OGNL提供的共同點,其他組件之間的連接和集成。\u003c/p\u003e \\n\u003cp\u003e 除了從上面的成分,會有很多的信息,涉及到配置。配置Web應用程序,以及配置的動作,攔截器,結果等。\u003c/p\u003e \\n\u003cp\u003e 這是MVC模式 Struts2的體系結構概述。我們將在後續章節中更詳細通過每個組件的介紹。\u003c/p\u003e \\n\u003ch2\u003e 請求的生命週期:\u003c/h2\u003e \\n\u003cp\u003e 根據上述雙字母組合,可以在Struts 2解釋用戶的請求生命週期,如下所示:\u003c/p\u003e \\n\u003cul\u003e \\n \u003cli\u003e \u003cp\u003e 用戶發送請求到服務器的某些資源的請求(即頁面)。\u003c/p\u003e \u003c/li\u003e \\n \u003cli\u003e \u003cp\u003e FilterDispatcher\u0026nbsp;查看請求,然後確定適當的動作。\u003c/p\u003e \u003c/li\u003e \\n \u003cli\u003e \u003cp\u003e 配置的攔截功能,適用於如驗證,文件上傳等。\u003c/p\u003e \u003c/li\u003e \\n \u003cli\u003e \u003cp\u003e 所選的動作會執行,以執行所請求的操作。\u003c/p\u003e \u003c/li\u003e \\n \u003cli\u003e \u003cp\u003e 同樣,配置的攔截器做任何後期處理,如果需要的話。\u003c/p\u003e \u003c/li\u003e \\n \u003cli\u003e \u003cp\u003e 最後其結果由視圖準備,並且將結果返回給用戶。\u003c/p\u003e \u003c/li\u003e \\n\u003c/ul\u003e \\n\u003cbr\u003e\"},\"state\":\"published\",\"views\":513,\"order\":6,\"_id\":\"59fd7e261e18b40005ab9e6f\",\"key\":\"struts-architecture\",\"url\":\"struts-architecture\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 體系結構\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:45:26.690Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:14.169Z\"}},{\"order\":7,\"_id\":\"5fcf8cefd5dd8e00183d7301\",\"post\":{\"meta\":{\"description\":\"前面我們已經學習了Struts2 的架構,當點擊一個超鏈接或提交一個HTML表單在Struts2 的 Web應用程序,輸入所收集被髮送到一個 Java 類稱爲操作控制器。當動作執行後,結果選擇了一個資源\",\"keywords\":\"Struts2,Hello,World,實例,前面,我們,已\"},\"content\":{\"extended\":\"$15\"},\"state\":\"published\",\"views\":506,\"order\":7,\"_id\":\"59fd7e271e18b40005ab9e70\",\"key\":\"struts-examples\",\"url\":\"struts-examples\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 Hello World 實例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:45:27.479Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:14.159Z\"}},{\"order\":8,\"_id\":\"5fcf8cefd5dd8e00183d7302\",\"post\":{\"meta\":{\"description\":\"本章將帶你通過一個Struts2應用程序所需的基本配置。在這裏,我們將看到在一些重要的配置文件,將配置文件:web.xml ,struts.xml,struts-config.xml和struts.properties 使用web.xml和struts.xml的配\",\"keywords\":\"Struts2,配置文件,本章,將,帶你,通過,一個,\"},\"content\":{\"extended\":\"$16\"},\"state\":\"published\",\"views\":733,\"order\":8,\"_id\":\"59fd7e271e18b40005ab9e71\",\"key\":\"struts-configuration\",\"url\":\"struts-configuration\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 配置文件\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:45:27.796Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:14.124Z\"}},{\"order\":9,\"_id\":\"5fcf8cefd5dd8e00183d7303\",\"post\":{\"meta\":{\"description\":\"動作是Struts2框架的核心,因爲他們的任何MVC(模型 - 視圖 - 控制器)框架。每個URL將被映射到一個特定的動作,它提供了來自用戶的請求提供服務所需的處理邏輯。 但動作也提供其他\",\"keywords\":\"Struts2,Action,動作,動作,是,Struts2\"},\"content\":{\"extended\":\"$17\"},\"state\":\"published\",\"views\":662,\"order\":9,\"_id\":\"59fd7e731e18b40005ab9e72\",\"key\":\"struts-actions\",\"url\":\"struts-actions\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 Action/動作\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:43.660Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:14.096Z\"}},{\"order\":10,\"_id\":\"5fcf8cefd5dd8e00183d7304\",\"post\":{\"meta\":{\"description\":\"攔截器的概念是Servlet過濾器或JDK代理類一樣的。攔截器允許橫切功能分開實現的動作,以及框架。使用攔截器,可以實現如下: 提供預處理行動之前被稱爲邏輯。 提供後處理邏輯動作\",\"keywords\":\"Struts2,攔截,器,攔截,器,的,概念,是,Servl\"},\"content\":{\"extended\":\"$18\"},\"state\":\"published\",\"views\":495,\"order\":10,\"_id\":\"59fd7e741e18b40005ab9e73\",\"key\":\"struts-interceptors\",\"url\":\"struts-interceptors\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 攔截器\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:44.316Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:14.026Z\"}},{\"order\":11,\"_id\":\"5fcf8cefd5dd8e00183d7305\",\"post\":{\"meta\":{\"description\":\"正如前面提到的,results標籤在Struts2的MVC框架的視圖中所扮演的角色。動作是負責執行業務邏輯。執行業務邏輯後,接下來的步驟是使用results標籤顯示的視圖。 經常有一些附帶導航規則\",\"keywords\":\"Struts2,結果,和,類型,正如,前面,提到,的,res\"},\"content\":{\"extended\":\"$19\"},\"state\":\"published\",\"views\":423,\"order\":11,\"_id\":\"59fd7e741e18b40005ab9e74\",\"key\":\"struts-result-types\",\"url\":\"struts-result-types\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 結果和結果類型\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:44.816Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.943Z\"}},{\"order\":12,\"_id\":\"5fcf8cefd5dd8e00183d7306\",\"post\":{\"meta\":{\"description\":\"值棧: 值棧是一個集合中的幾個對象保持下列對象提供的順序: SN 對象 Description 1 Temporary Objects There are various temporary objects which are created during execution of a page. For example the current iterat\",\"keywords\":\"Struts2,值棧,OGNL,值棧,是,一個,集合,中的,\"},\"content\":{\"extended\":\"$1a\"},\"state\":\"published\",\"views\":514,\"order\":12,\"_id\":\"59fd7e751e18b40005ab9e75\",\"key\":\"struts-value-stack-ognl\",\"url\":\"struts-value-stack-ognl\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 值棧/OGNL\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:45.195Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.924Z\"}},{\"order\":13,\"_id\":\"5fcf8cefd5dd8e00183d7307\",\"post\":{\"meta\":{\"description\":\"Struts 2框架提供了內置支持處理文件上傳使用基於HTML表單的文件上傳。上傳一個文件時,它通常會被存儲在一個臨時目錄中,他們應該由Action類進行處理或移動到一個永久的目錄,以確\",\"keywords\":\"Struts2,文件,上傳,Struts,框架,提供,了,內\"},\"content\":{\"extended\":\"$1b\"},\"state\":\"published\",\"views\":541,\"order\":13,\"_id\":\"59fd7e751e18b40005ab9e76\",\"key\":\"struts-file-uploads\",\"url\":\"struts-file-uploads\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 文件上傳\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:45.746Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.883Z\"}},{\"order\":14,\"_id\":\"5fcf8cefd5dd8e00183d7308\",\"post\":{\"meta\":{\"description\":\"本章將教如何使用Struts 2的簡單的步驟來訪問數據庫。 Struts是一個MVC框架,而不是一個數據庫框架,但它提供了極好的支持JPA/ Hibernate集成。我們將看看在的Hibernate集成在後面的章節,\",\"keywords\":\"Struts2,MySQL,數據庫,訪問,本章,將,教,如何\"},\"content\":{\"extended\":\"$1c\"},\"state\":\"published\",\"views\":500,\"order\":14,\"_id\":\"59fd7e761e18b40005ab9e77\",\"key\":\"struts-database-access\",\"url\":\"struts-database-access\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 MySQL數據庫訪問\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:46.369Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.820Z\"}},{\"order\":15,\"_id\":\"5fcf8cefd5dd8e00183d7309\",\"post\":{\"meta\":{\"description\":\"本章將教你如何使用Struts2 的應用程序發送電子郵件。對於此練習中,需要下載並安裝將mail.jar 從 JavaMail API1.4.4,並將 mail.jar文件放置在WEB-INF\\\\lib文件夾,然後繼續遵循的標準步驟創建動\",\"keywords\":\"Struts2,發送,郵件,Email,本章,將,教你,如何\"},\"content\":{\"extended\":\"$1d\"},\"state\":\"published\",\"views\":573,\"order\":15,\"_id\":\"59fd7e761e18b40005ab9e78\",\"key\":\"struts-sending-email\",\"url\":\"struts-sending-email\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 發送郵件Email\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:46.918Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.759Z\"}},{\"order\":16,\"_id\":\"5fcf8cefd5dd8e00183d730a\",\"post\":{\"meta\":{\"description\":\"現在,我們將看看如何的Struts驗證框架。在Struts的核心有驗證框架,協助應用程序的運行規則來執行驗證執行之前的操作方法。 通常是使用 Javascript 來實現客戶端驗證。但不應單獨依賴\",\"keywords\":\"Struts2,驗證,框架,現在,我們將,看看,如何,的,\"},\"content\":{\"extended\":\"$1e\"},\"state\":\"published\",\"views\":509,\"order\":16,\"_id\":\"59fd7e771e18b40005ab9e79\",\"key\":\"struts-validations\",\"url\":\"struts-validations\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 驗證框架\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:47.554Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.704Z\"}},{\"order\":17,\"_id\":\"5fcf8cefd5dd8e00183d730b\",\"post\":{\"meta\":{\"description\":\"以下是的各類字段級和非字段級驗證在Struts2列表: date validator: field name = birthday field-validator type = date param name = min 01/01/1990 /param param name = max 01/01/2000 /param message Birthday must be within ${mi\",\"keywords\":\"Struts2,基於,XML,校驗,以下,是的,各類,字段,\"},\"content\":{\"extended\":\"$1f\"},\"state\":\"published\",\"views\":473,\"order\":17,\"_id\":\"59fd7e771e18b40005ab9e7a\",\"key\":\"xml-based-validators\",\"url\":\"xml-based-validators\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 基於XML校驗\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:47.822Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.649Z\"}},{\"order\":18,\"_id\":\"5fcf8cefd5dd8e00183d730c\",\"post\":{\"meta\":{\"description\":\"國際化(i18n)是規劃和實施的產品和服務,使他們能很容易地適應特定的本地語言和文化的過程中,這個過程被稱爲本地化。國際化的過程有時也被稱爲翻譯或本地化啓用。國際化是縮\",\"keywords\":\"Struts2,本地化,國際化,i18n,國際化,i18n,\"},\"content\":{\"extended\":\"$20\"},\"state\":\"published\",\"views\":506,\"order\":18,\"_id\":\"59fd7e781e18b40005ab9e7b\",\"key\":\"struts-localization\",\"url\":\"struts-localization\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 本地化/國際化(i18n)\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:48.663Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.624Z\"}},{\"order\":19,\"_id\":\"5fcf8cefd5dd8e00183d730d\",\"post\":{\"meta\":{\"description\":\"在HTTP請求中的一切都被視爲一個String由協議。這包括數字,布爾值,整數,日期,小數和一切。每一件事情是一個字符串,將根據HTTP。然而,Struts類可以有任何數據類型的屬性。Stru\",\"keywords\":\"Struts2,類型,轉換,在,HTTP,請求,中的,一切,\"},\"content\":{\"extended\":\"$21\"},\"state\":\"published\",\"views\":432,\"order\":19,\"_id\":\"59fd7e791e18b40005ab9e7c\",\"key\":\"struts-type-conversion\",\"url\":\"struts-type-conversion\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 類型轉換\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:49.248Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.560Z\"}},{\"order\":20,\"_id\":\"5fcf8cefd5dd8e00183d730e\",\"post\":{\"meta\":{\"description\":\"實際本章教程開始之前,讓我們看看由http://struts.apache.org給出的幾個定義: Term Description tag A small piece of code executed from within JSP, FreeMarker, or Velocity. template A bit of code, usually written in Fre\",\"keywords\":\"Struts2,主題,和,模板,實際,本章,教程,開始,\"},\"content\":{\"extended\":\"$22\"},\"state\":\"published\",\"views\":570,\"order\":20,\"_id\":\"59fd7e791e18b40005ab9e7d\",\"key\":\"struts-themes-templates\",\"url\":\"struts-themes-templates\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 主題和模板\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:49.820Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.528Z\"}},{\"order\":21,\"_id\":\"5fcf8cefd5dd8e00183d730f\",\"post\":{\"meta\":{\"description\":\"Struts提供了一個更簡單的方式來處理未捕獲的異常,並將用戶重定向到一個專門的錯誤頁面。您可以輕鬆地Struts配置到不同的異常有不同的錯誤頁面。 Struts的異常處理所使用的exceptio\",\"keywords\":\"Struts2,異常,處理,Struts,提供,了,一個,更\"},\"content\":{\"extended\":\"$23\"},\"state\":\"published\",\"views\":410,\"order\":21,\"_id\":\"59fd7e7a1e18b40005ab9e7e\",\"key\":\"struts-exception-handling\",\"url\":\"struts-exception-handling\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 異常處理\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:50.527Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.492Z\"}},{\"order\":22,\"_id\":\"5fcf8cefd5dd8e00183d7310\",\"post\":{\"meta\":{\"description\":\"正如前面提到的,Struts提供了兩種形式的配置。傳統的方式是使用對所有配置struts.xml文件。到目前爲止,我們已經看到了這樣的例子很多。 Struts配置的另一種方法是使用Java5註釋功能。\",\"keywords\":\"Struts2,註釋,正如,前面,提到,的,Struts,提\"},\"content\":{\"extended\":\"$24\"},\"state\":\"published\",\"views\":494,\"order\":22,\"_id\":\"59fd7e7b1e18b40005ab9e7f\",\"key\":\"struts-annotations\",\"url\":\"struts-annotations\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 註釋\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:51.166Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.459Z\"}},{\"order\":23,\"_id\":\"5fcf8cefd5dd8e00183d7311\",\"post\":{\"meta\":{\"description\":\"Struts 2 應用程序可以使用Java5註釋作爲替代XML和Java屬性配置。這裏是清單的不同的類別有關的最重要的註解: 命名空間註釋(動作註釋): @ Namespace註釋允許在Action類中,而不是基於零\",\"keywords\":\"Struts2,註釋,類型,Struts,應用程序,可以,使\"},\"content\":{\"extended\":\"$25\"},\"state\":\"published\",\"views\":453,\"order\":23,\"_id\":\"59fd7e7b1e18b40005ab9e80\",\"key\":\"struts-annotations-types\",\"url\":\"struts-annotations-types\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 註釋類型\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:51.439Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.422Z\"}},{\"order\":24,\"_id\":\"5fcf8cefd5dd8e00183d7312\",\"post\":{\"meta\":{\"description\":\"Struts 2 的標籤有一組標籤,更容易控制流程頁面執行。以下是重要的Struts2控制標籤列表: if /else 標籤: 這些標籤執行可在每一種語言找到的一種基本條件流程。 If標籤可用於本身或與\",\"keywords\":\"Struts2,控件,標籤,Struts,的,標,簽有,一組\"},\"content\":{\"extended\":\"$26\"},\"state\":\"published\",\"views\":472,\"order\":24,\"_id\":\"59fd7e7b1e18b40005ab9e81\",\"key\":\"struts-control-tags\",\"url\":\"struts-control-tags\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 控件標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:51.746Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.349Z\"}},{\"order\":25,\"_id\":\"5fcf8cefd5dd8e00183d7313\",\"post\":{\"meta\":{\"description\":\"創建動作類: 首先,讓我們創建一個簡單的類叫做Employee.java,它看起來像: package com . tutorialspoint . struts2 ; import java . util . ArrayList ; import java . util . List ; import org . apache . struts2 . util\",\"keywords\":\"Struts2,iterator,標籤,創建,動作類,首先,\"},\"content\":{\"extended\":\"$27\"},\"state\":\"published\",\"views\":803,\"order\":25,\"_id\":\"59fd7e7c1e18b40005ab9e82\",\"key\":\"struts-iterator-tags\",\"url\":\"struts-iterator-tags\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 iterator標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:52.242Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.329Z\"}},{\"order\":26,\"_id\":\"5fcf8cefd5dd8e00183d7314\",\"post\":{\"meta\":{\"description\":\"創建動作類: package com . tutorialspoint . struts2 ; public class HelloWorldAction { private String name ; public String execute () throws Exception { return success ; } public String getName () { return name ; } public void setName\",\"keywords\":\"Struts2,else,標籤,創建,動作類,package\"},\"content\":{\"extended\":\"$28\"},\"state\":\"published\",\"views\":611,\"order\":26,\"_id\":\"59fd7e7c1e18b40005ab9e83\",\"key\":\"struts-if-else-tags\",\"url\":\"struts-if-else-tags\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 if/else標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:52.755Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.258Z\"}},{\"order\":27,\"_id\":\"5fcf8cefd5dd8e00183d7315\",\"post\":{\"meta\":{\"description\":\"如果有兩個列表A和B的值,A1,A2和B1,B2。合併列表,會給出A1,B1,A2,B2。 創建動作類: 首先,讓我們創建一個簡單的類叫做Employee.java,它看起來像: package com . tutorialspoint . struts2\",\"keywords\":\"Struts2,merge,標籤,如果,有,兩個,列表,和,\"},\"content\":{\"extended\":\"$29\"},\"state\":\"published\",\"views\":445,\"order\":27,\"_id\":\"59fd7e7d1e18b40005ab9e84\",\"key\":\"struts-merge-tag\",\"url\":\"struts-merge-tag\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 merge標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:53.169Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.229Z\"}},{\"order\":28,\"_id\":\"5fcf8cefd5dd8e00183d7316\",\"post\":{\"meta\":{\"description\":\"說,如果有兩個列表A和B的值A1,A2和B1,B2。合併列表,會給你的A1,A2,B1,B2,而append 名單,會有A1,A2,B1,B2。 創建動作類: 首先,讓我們創建一個簡單的類叫做Employee.java,它看起\",\"keywords\":\"Struts2,append,標籤,說,如果,有,兩個,列表\"},\"content\":{\"extended\":\"$2a\"},\"state\":\"published\",\"views\":552,\"order\":28,\"_id\":\"59fd7e7d1e18b40005ab9e85\",\"key\":\"struts-append-tag\",\"url\":\"struts-append-tag\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 append標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:53.565Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.158Z\"}},{\"order\":29,\"_id\":\"5fcf8cefd5dd8e00183d7317\",\"post\":{\"meta\":{\"description\":\"我們經常遇到的一些情況,必須創建列表或數組上遍歷列表。可以創建列表或數組使用scriptlet或者可以使用generator標籤。tag. 創建action類: package com . tutorialspoint . struts2 ; public class Hel\",\"keywords\":\"Struts2,generator,標籤,我們,經常,遇到,\"},\"content\":{\"extended\":\"$2b\"},\"state\":\"published\",\"views\":510,\"order\":29,\"_id\":\"59fd7e7d1e18b40005ab9e86\",\"key\":\"struts-generator-tag\",\"url\":\"struts-generator-tag\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 generator標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:53.944Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.782Z\"}},{\"order\":30,\"_id\":\"5fcf8cefd5dd8e00183d7318\",\"post\":{\"meta\":{\"description\":\"Struts 2 的數據標籤主要用於操作頁面上顯示的數據。下面列出的是重要的數據標籤: action標籤: 此標記使開發人員能夠直接從JSP頁面調用動作指定動作的名稱和一個可選的命名空間。\",\"keywords\":\"Struts2,數據,標籤,Struts,的,數據,標籤,主\"},\"content\":{\"extended\":\"$2c\"},\"state\":\"published\",\"views\":421,\"order\":30,\"_id\":\"59fd7e7e1e18b40005ab9e87\",\"key\":\"struts-data-tags\",\"url\":\"struts-data-tags\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 數據標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:54.214Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.762Z\"}},{\"order\":31,\"_id\":\"5fcf8cefd5dd8e00183d7319\",\"post\":{\"meta\":{\"description\":\"action標記允許程序員從視圖頁面執行動作。他們可以做到這一點通過指定的動作名稱。他們可以設置的executeResult參數設置爲true,在視圖中直接呈現結果。或者他們可以將此參數設置爲\",\"keywords\":\"Struts2,action,標籤,action,標記,允許\"},\"content\":{\"extended\":\"$2d\"},\"state\":\"published\",\"views\":551,\"order\":31,\"_id\":\"59fd7e7e1e18b40005ab9e88\",\"key\":\"struts-action-tag\",\"url\":\"struts-action-tag\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 action標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:54.755Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.734Z\"}},{\"order\":32,\"_id\":\"5fcf8cefd5dd8e00183d731a\",\"post\":{\"meta\":{\"description\":\"Struts 的include標籤和JSP include標記非常相似,它很少使用。我們已經看到了如何將一個Struts動作到一個jsp使用s:action標籤的輸出。 s:include標籤略有不同。它可以進入一個jsp輸出包括一個\",\"keywords\":\"Struts2,include,標籤,Struts,的,in\"},\"content\":{\"extended\":\"$2e\"},\"state\":\"published\",\"views\":434,\"order\":32,\"_id\":\"59fd7e7f1e18b40005ab9e89\",\"key\":\"struts-include-tag\",\"url\":\"struts-include-tag\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 include標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:55.145Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.681Z\"}},{\"order\":33,\"_id\":\"5fcf8cefd5dd8e00183d731b\",\"post\":{\"meta\":{\"description\":\"bean標籤的設置和push標籤的組合,它可以創建一個新的對象實例,然後設置變量的值。然後,它的bean可以在值棧,因此,它可用於在JSP頁面。 bean標籤需要一個Java Bean來工作。所以,標\",\"keywords\":\"Struts2,bean,標籤,bean,標籤,的,設置,和\"},\"content\":{\"extended\":\"$2f\"},\"state\":\"published\",\"views\":512,\"order\":33,\"_id\":\"59fd7e7f1e18b40005ab9e8a\",\"key\":\"struts-bean-tag\",\"url\":\"struts-bean-tag\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 bean 標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:55.555Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.659Z\"}},{\"order\":34,\"_id\":\"5fcf8cefd5dd8e00183d731c\",\"post\":{\"meta\":{\"description\":\"date標籤允許在一個快速和容易的方式格式化日期。用戶可以指定自定義的格式(如DD/ MM / YYYY HH:MM),可以產生容易可讀的符號(如2小時,14分鐘),或預定義的格式就可以求助於鍵\",\"keywords\":\"Struts2,date,標籤,date,標籤,允許,在,一\"},\"content\":{\"extended\":\"$30\"},\"state\":\"published\",\"views\":490,\"order\":34,\"_id\":\"59fd7e7f1e18b40005ab9e8b\",\"key\":\"struts-date-tag\",\"url\":\"struts-date-tag\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 date 標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:55.987Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.614Z\"}},{\"order\":35,\"_id\":\"5fcf8cefd5dd8e00183d731d\",\"post\":{\"meta\":{\"description\":\"param標籤可用於參數其他標籤。包括標籤和bean標籤,這種標籤的例子。讓我們以同樣的例子我們已經討論,同時討論bean標籤。 創建動作類: package com . tutorialspoint . struts2 ; public class\",\"keywords\":\"Struts2,param,標籤,param,標籤,可,用於\"},\"content\":{\"extended\":\"$31\"},\"state\":\"published\",\"views\":456,\"order\":35,\"_id\":\"59fd7e801e18b40005ab9e8c\",\"key\":\"struts-param-tag\",\"url\":\"struts-param-tag\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 param 標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:56.368Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.594Z\"}},{\"order\":36,\"_id\":\"5fcf8cefd5dd8e00183d731e\",\"post\":{\"meta\":{\"description\":\"property標籤是用來獲取屬性的值,這將默認堆棧的頂部,如果沒有指定。這個例子顯示了三個簡單的數據標記 - 即set,push和property的用法。 創建動作類: 對於這個練習,讓我們重用的例\",\"keywords\":\"Struts2,property,標籤,property,標\"},\"content\":{\"extended\":\"$32\"},\"state\":\"published\",\"views\":552,\"order\":36,\"_id\":\"59fd7e801e18b40005ab9e8d\",\"key\":\"struts-property-tag\",\"url\":\"struts-property-tag\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 property 標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:56.793Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.570Z\"}},{\"order\":37,\"_id\":\"5fcf8cefd5dd8e00183d731f\",\"post\":{\"meta\":{\"description\":\"property標籤是用來獲取屬性的值,這將默認堆棧的頂部,如果沒有指定。這個例子顯示了三個簡單的數據標記 - 即set,push和property的用法。 創建動作類: 對於這個練習,讓我們重用的例\",\"keywords\":\"Struts2,set,標籤,property,標籤,是,用\"},\"content\":{\"extended\":\"$33\"},\"state\":\"published\",\"views\":475,\"order\":37,\"_id\":\"59fd7e811e18b40005ab9e8e\",\"key\":\"struts-set-tag\",\"url\":\"struts-set-tag\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 set 標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:57.186Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.522Z\"}},{\"order\":38,\"_id\":\"5fcf8cefd5dd8e00183d7320\",\"post\":{\"meta\":{\"description\":\"text 標籤是一個通用的標記,用來渲染一個i18n的文本消息。按照三個步驟: 該消息必須在一個資源包,它與作爲動作具有相同的名稱。在實踐中,這意味着,應該爲類具有相同名稱的\",\"keywords\":\"Struts2,text,標籤,text,標籤,是,一個,通\"},\"content\":{\"extended\":\"$34\"},\"state\":\"published\",\"views\":608,\"order\":38,\"_id\":\"59fd7e811e18b40005ab9e8f\",\"key\":\"struts-text-tag\",\"url\":\"struts-text-tag\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 text 標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:57.573Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.495Z\"}},{\"order\":39,\"_id\":\"5fcf8cefd5dd8e00183d7321\",\"post\":{\"meta\":{\"description\":\"URL標籤是負責生成URL字符串。這樣做的好處是,你可以提供參數標籤。我們通過一個例子來說明使用的URL標籤。 創建動作類: package com . tutorialspoint . struts2 ; public class HelloWorldAction {\",\"keywords\":\"Struts2,url,標籤,URL,標籤,是,負責,生成,\"},\"content\":{\"extended\":\"$35\"},\"state\":\"published\",\"views\":442,\"order\":39,\"_id\":\"59fd7e811e18b40005ab9e90\",\"key\":\"struts-url-tag\",\"url\":\"struts-url-tag\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 url標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:57.972Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.473Z\"}},{\"order\":40,\"_id\":\"5fcf8cefd5dd8e00183d7322\",\"post\":{\"meta\":{\"description\":\"form 標籤的列表是Struts的UI標籤的一個子集。這些標籤可以幫助渲染中需要Struts Web應用程序和用戶界面可以分爲三類。本章將帶你通過所有三種類型的UI標籤: 簡單UI標籤: 我們已經使\",\"keywords\":\"Struts2,表單,標籤,form,標籤,的,列表,是,S\"},\"content\":{\"extended\":\"$36\"},\"state\":\"published\",\"views\":469,\"order\":40,\"_id\":\"59fd7e821e18b40005ab9e91\",\"key\":\"struts-form-tags\",\"url\":\"struts-form-tags\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 表單標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:58.679Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.452Z\"}},{\"order\":41,\"_id\":\"5fcf8cefd5dd8e00183d7323\",\"post\":{\"meta\":{\"description\":\"Struts使用Dojo框架的 AJAX 標記實現。首先,這個例子中,你需要添加 struts2-dojo-plugin-2.2.3.jar。你可以得到這個文件的lib文件夾struts2的下載(C:\\\\struts-2.2.3-all\\\\struts-2.2.3\\\\lib\\\\struts2-dojo-plugin-2.2\",\"keywords\":\"Struts2,Ajax,標籤,Struts,使用,Dojo\"},\"content\":{\"extended\":\"$37\"},\"state\":\"published\",\"views\":516,\"order\":41,\"_id\":\"59fd7e831e18b40005ab9e92\",\"key\":\"struts-ajax-tags\",\"url\":\"struts-ajax-tags\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 Ajax 標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:59.098Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.402Z\"}},{\"order\":42,\"_id\":\"5fcf8cefd5dd8e00183d7324\",\"post\":{\"meta\":{\"description\":\"Spring是一個流行的Web框架,它提供易於集成與很多常見的網絡任務。所以,問題是,爲什麼我們需要Spring,當我們有Struts2?Spring是超過一個MVC框架 - 它提供了許多其它好用的東西,這是\",\"keywords\":\"Struts2,和,Spring,集成,Spring,是,一\"},\"content\":{\"extended\":\"$38\"},\"state\":\"published\",\"views\":574,\"order\":42,\"_id\":\"59fd7e831e18b40005ab9e93\",\"key\":\"struts-spring\",\"url\":\"struts-spring\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2和Spring集成\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:59.757Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.387Z\"}},{\"order\":43,\"_id\":\"5fcf8cefd5dd8e00183d7325\",\"post\":{\"meta\":{\"description\":\"在本章中,讓我們通過Struts2的集成Tiles框架所涉及的步驟。 Apache的Tiles是一個內置的模板框架來簡化Web應用程序用戶界面的開發。 首先,我們需要從 Apache Tiles 網站下載的files jar文件。\",\"keywords\":\"Struts2,和,Tiles,集成,在,本章,中,讓,我們\"},\"content\":{\"extended\":\"$39\"},\"state\":\"published\",\"views\":493,\"order\":43,\"_id\":\"59fd7e841e18b40005ab9e94\",\"key\":\"struts-tiles\",\"url\":\"struts-tiles\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2和Tiles集成\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:00.236Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.360Z\"}},{\"order\":44,\"_id\":\"5fcf8cefd5dd8e00183d7326\",\"post\":{\"meta\":{\"description\":\"Hibernate是一個高性能的對象/關係持久性和查詢服務許可下的開源GNU通用公共許可證(LGPL),並免費下載。在這一章中,我們要學習如何實現Struts2與Hibernate集成。如果你不熟悉與Hibern\",\"keywords\":\"Struts2,和,Hibernate,集成,Hiberna\"},\"content\":{\"extended\":\"$3a\"},\"state\":\"published\",\"views\":484,\"order\":44,\"_id\":\"59fd7e841e18b40005ab9e95\",\"key\":\"struts-hibernate\",\"url\":\"struts-hibernate\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2和Hibernate集成\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:00.737Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.303Z\"}},{\"order\":45,\"_id\":\"5fcf8cefd5dd8e00183d7327\",\"post\":{\"meta\":{\"description\":\"在這個例子中,我們將學習如何在Struts 2中創建一個Hello World例子。 使用以下庫或工具: MyEclipse 10 Struts 2.1 1. 創建一個Web項目工程 啓動打開 MyEclipse,創建一個Web工程名稱爲:struts2-xm\",\"keywords\":\"Struts2,hello world,XML\"},\"content\":{\"extended\":\"$3b\"},\"state\":\"published\",\"views\":797,\"order\":45,\"_id\":\"59fd7e851e18b40005ab9e96\",\"key\":\"struts-2-hello-world-example\",\"url\":\"struts-2-hello-world-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts 2 hello world (XML版本)\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:01.902Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.225Z\"}},{\"order\":46,\"_id\":\"5fcf8cefd5dd8e00183d7328\",\"post\":{\"meta\":{\"description\":\"在這個教程,我們重複使用以前 STRUST2 HelloWorld(XML版本)的例子,並將其轉換成註解版本。 Struts2註解概念 Struts2註解是由Struts2的約定插件的支持,所以,必須要了解其背後的「掃描方\",\"keywords\":\"Struts2,註解,示例\"},\"content\":{\"extended\":\"$3c\"},\"state\":\"published\",\"views\":546,\"order\":46,\"_id\":\"59fd7e861e18b40005ab9e97\",\"key\":\"struts-2-hello-world-annotation-example\",\"url\":\"struts-2-hello-world-annotation-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2註解示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:02.626Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.212Z\"}},{\"order\":47,\"_id\":\"5fcf8cefd5dd8e00183d7329\",\"post\":{\"meta\":{\"description\":\"在Struts 2中,@ResultPath 註解用於控制Struts2找到存儲的結果或JSP頁面。默認情況下,它會找到結果頁在「WEB-INF/content/」 文件夾。 不知道爲什麼在Struts2註解設置 「WEB-INF/content/」 作爲默認\",\"keywords\":\"Struts2,ResultPath,註釋,示例\"},\"content\":{\"extended\":\"$3d\"},\"state\":\"published\",\"views\":478,\"order\":47,\"_id\":\"59fd7e861e18b40005ab9e98\",\"key\":\"struts-2-resultpath-annotation-example\",\"url\":\"struts-2-resultpath-annotation-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 @ResultPath註釋示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:02.894Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.199Z\"}},{\"order\":48,\"_id\":\"5fcf8cefd5dd8e00183d732a\",\"post\":{\"meta\":{\"description\":\"Struts2自帶有「包含文件」功能,包含多個Struts配置文件合併爲一個單元。 單個Struts配置文件 讓我們來看看一個糟糕的 Struts2 配置示例。 struts.xml ?xml version=\",\"keywords\":\"Struts2,include,包含,配置文件\"},\"content\":{\"extended\":\"$3e\"},\"state\":\"published\",\"views\":523,\"order\":48,\"_id\":\"59fd7e871e18b40005ab9e99\",\"key\":\"struts-2-include-multiple-struts-configuration-files\",\"url\":\"struts-2-include-multiple-struts-configuration-files\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 include(包含)多個配置文件\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:03.345Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.191Z\"}},{\"order\":49,\"_id\":\"5fcf8cefd5dd8e00183d732b\",\"post\":{\"meta\":{\"description\":\"Struts2的命名空間是一個新的概念,用來處理多個模塊。由下式給出一個命名空間的每個模塊。此外,它還可以用來避免位於不同的模塊相同的操作名稱之間的衝突。 下載代碼 – Strut\",\"keywords\":\"Struts2,命名空間,配置,解釋\"},\"content\":{\"extended\":\"$3f\"},\"state\":\"published\",\"views\":520,\"order\":49,\"_id\":\"59fd7e871e18b40005ab9e9a\",\"key\":\"struts-2-namespace-configuration-example-and-explanation\",\"url\":\"struts-2-namespace-configuration-example-and-explanation\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2命名空間配置和解釋\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:03.943Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.183Z\"}},{\"order\":50,\"_id\":\"5fcf8cefd5dd8e00183d732c\",\"post\":{\"meta\":{\"description\":\"在Struts2開發中,這應該是第一個學習配置的值。爲了啓用 Struts2 的開發模式,可以通過自動配置顯著增加Struts2的開發速度和屬性文件加載,以及額外的日誌和調試功能。 自動重新加載\",\"keywords\":\"Struts2,開發者模式\"},\"content\":{\"extended\":\"$40\"},\"state\":\"published\",\"views\":560,\"order\":50,\"_id\":\"59fd7e881e18b40005ab9e9b\",\"key\":\"struts-2-development-mode-example\",\"url\":\"struts-2-development-mode-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2開發者模式\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:04.210Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.172Z\"}},{\"order\":51,\"_id\":\"5fcf8cefd5dd8e00183d732d\",\"post\":{\"content\":{\"extended\":\"$41\"},\"state\":\"published\",\"views\":490,\"order\":51,\"_id\":\"5f75eb2f4607db0007804f31\",\"title\":\"如何刪除Struts2動作的後綴擴展名\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2020-10-01T14:43:59.553Z\",\"section\":\"59fd7e211e18b40005ab9e69\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"url\":\"how-to-remove-the-action-suffix-extension-in-struts-2\",\"key\":\"how-to-remove-the-action-suffix-extension-in-struts-2\",\"createdAt\":\"2020-10-01T14:43:59.557Z\",\"updatedAt\":\"2020-10-13T08:25:58.089Z\",\"__v\":0}},{\"order\":52,\"_id\":\"5fcf8cefd5dd8e00183d732e\",\"post\":{\"meta\":{\"description\":\"在Struts2中,會花大部分的時間用在用動作來處理工作。動作類包含業務邏輯,獲取資源包,保存數據,驗證,並選擇應發回給用戶的視圖的結果頁面。這是Struts2的核心,所以必須要了\",\"keywords\":\"Struts2,動作\"},\"content\":{\"extended\":\"$42\"},\"state\":\"published\",\"views\":389,\"order\":52,\"_id\":\"59fd7e881e18b40005ab9e9c\",\"key\":\"working-with-struts-2-actions\",\"url\":\"working-with-struts-2-actions\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"使用Struts2動作\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:04.778Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.164Z\"}},{\"order\":53,\"_id\":\"5fcf8cefd5dd8e00183d732f\",\"post\":{\"meta\":{\"description\":\"本教程顯示使用Struts2的 ActionError 和 ActionMessage 類。 源代碼下載 – Struts2-ActionError-ActionMessage-Example.zip 1.ActionError–是用來發送錯誤信息反饋給用戶- 通過s:actionerror/來顯示。 s:if test=\",\"keywords\":\"Struts2,ActionError,ActionMessage,示例\"},\"content\":{\"extended\":\"$43\"},\"state\":\"published\",\"views\":515,\"order\":53,\"_id\":\"59fd7e891e18b40005ab9e9d\",\"key\":\"struts-2-actionerror-actionmessage-example\",\"url\":\"struts-2-actionerror-actionmessage-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2的ActionError&ActionMessage示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:05.676Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.154Z\"}},{\"order\":54,\"_id\":\"5fcf8cefd5dd8e00183d7330\",\"post\":{\"meta\":{\"description\":\"這裏我們創建一個web工程爲:struts2-modeldrive ,用於講解演示這一章內容的學習。 如果一個動作實現了「模型驅動」接口,它就獲得了表單數據自動傳輸到對象的額外能力。請參見下面\",\"keywords\":\"Struts2,模型驅動,實例\"},\"content\":{\"extended\":\"$44\"},\"state\":\"published\",\"views\":481,\"order\":54,\"_id\":\"59fd7e8a1e18b40005ab9e9e\",\"key\":\"struts-2-modeldriven-example\",\"url\":\"struts-2-modeldriven-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2模型驅動實例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:06.508Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.143Z\"}},{\"order\":55,\"_id\":\"5fcf8cefd5dd8e00183d7331\",\"post\":{\"content\":{\"extended\":\"$45\"},\"state\":\"published\",\"views\":422,\"order\":55,\"_id\":\"5f75eb2f4607db0007804f32\",\"title\":\"Struts2映射攔截動作\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2020-10-01T14:43:59.571Z\",\"section\":\"59fd7e211e18b40005ab9e69\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"url\":\"struts-2-mapping-interceptors-to-action\",\"key\":\"struts-2-mapping-interceptors-to-action\",\"createdAt\":\"2020-10-01T14:43:59.574Z\",\"updatedAt\":\"2020-10-13T08:25:58.083Z\",\"__v\":0}},{\"order\":56,\"_id\":\"5fcf8cefd5dd8e00183d7332\",\"post\":{\"content\":{\"extended\":\"$46\"},\"state\":\"published\",\"views\":414,\"order\":56,\"_id\":\"5f75eb2f4607db0007804f33\",\"title\":\"Struts2重寫攔截器參數\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2020-10-01T14:43:59.596Z\",\"section\":\"59fd7e211e18b40005ab9e69\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"url\":\"struts-2-override-the-interceptor-parameters\",\"key\":\"struts-2-override-the-interceptor-parameters\",\"createdAt\":\"2020-10-01T14:43:59.599Z\",\"updatedAt\":\"2020-10-13T08:25:58.075Z\",\"__v\":0}},{\"order\":57,\"_id\":\"5fcf8cefd5dd8e00183d7333\",\"post\":{\"content\":{\"extended\":\"$47\"},\"state\":\"published\",\"views\":431,\"order\":57,\"_id\":\"5f75eb2f4607db0007804f34\",\"title\":\"Struts2攔截器棧的例子\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2020-10-01T14:43:59.615Z\",\"section\":\"59fd7e211e18b40005ab9e69\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"url\":\"struts-2-interceptor-stack-example\",\"key\":\"struts-2-interceptor-stack-example\",\"createdAt\":\"2020-10-01T14:43:59.618Z\",\"updatedAt\":\"2020-10-13T08:25:58.064Z\",\"__v\":0}},{\"order\":58,\"_id\":\"5fcf8cefd5dd8e00183d7334\",\"post\":{\"meta\":{\"description\":\"在Struts2中附帶一個名爲「execAndWait」一個非常有趣的「執行和等待」攔截器,這是一個非常方便的攔截器長時間運行操作在後臺,顯示用戶的自定義的等待頁面。在本教程中,它顯示了\",\"keywords\":\"Struts2,execAndWait,攔截器,例子\"},\"content\":{\"extended\":\"$48\"},\"state\":\"published\",\"views\":403,\"order\":58,\"_id\":\"59fd7e8b1e18b40005ab9e9f\",\"key\":\"struts-2-execandwait-interceptor-example\",\"url\":\"struts-2-execandwait-interceptor-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 execAndWait攔截器例子\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:07.868Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.133Z\"}},{\"order\":59,\"_id\":\"5fcf8cefd5dd8e00183d7335\",\"post\":{\"meta\":{\"description\":\"爲了比較直觀的學習,這裏創建一個web工程爲:struts2textfield。 在Struts2中,s:textfield文本範例,例如,可以聲明「s:textfield」鍵屬性或標籤和名稱屬性。 s:textfield key=\",\"keywords\":\"Struts2,textfield,文本,示例,爲了,比較,直觀,的,\"},\"content\":{\"extended\":\"$49\"},\"state\":\"published\",\"views\":717,\"order\":59,\"_id\":\"59fd7e8c1e18b40005ab9ea0\",\"key\":\"struts-2-stextfield-textbox-example\",\"url\":\"struts-2-stextfield-textbox-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:textfield\u003e文本示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:08.581Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.104Z\"}},{\"order\":60,\"_id\":\"5fcf8cefd5dd8e00183d7336\",\"post\":{\"meta\":{\"description\":\"在這一章節中,我們創建一個Web工程爲: struts2passwd,演示 s:password的使用。 在Struts2中,可以使用s:password來創建HTML密碼字段。例如,可以聲明「s:password」鍵屬性或者標籤和名稱屬性。\",\"keywords\":\"Struts2,password,密碼,示例\"},\"content\":{\"extended\":\"$4a\"},\"state\":\"published\",\"views\":473,\"order\":60,\"_id\":\"59fd7e8d1e18b40005ab9ea1\",\"key\":\"struts-2-spassword-password-example\",\"url\":\"struts-2-spassword-password-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:password\u003e密碼示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:09.158Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.095Z\"}},{\"order\":61,\"_id\":\"5fcf8cefd5dd8e00183d7337\",\"post\":{\"meta\":{\"description\":\"在這一章節中,我們創建一個Web工程爲:struts2hidden,演示s:hidden的使用。完整的工程目錄結構如下: 在Struts2中可以使用s:hidden標籤來創建一個HTML隱藏字段。 s:hidden name=\",\"keywords\":\"Struts2,hidden,隱藏值,例子\"},\"content\":{\"extended\":\"$4b\"},\"state\":\"published\",\"views\":653,\"order\":61,\"_id\":\"59fd7e8d1e18b40005ab9ea2\",\"key\":\"struts-2-shidden-hidden-value-example\",\"url\":\"struts-2-shidden-hidden-value-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:hidden\u003e隱藏值例子\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:09.882Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.085Z\"}},{\"order\":62,\"_id\":\"5fcf8cefd5dd8e00183d7338\",\"post\":{\"content\":{\"extended\":\"$4c\"},\"state\":\"published\",\"views\":455,\"order\":62,\"_id\":\"5f75eb314607db0007804f35\",\"title\":\"Struts2 \u003cs:textarea\u003e文本域實例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2020-10-01T14:44:01.432Z\",\"section\":\"59fd7e211e18b40005ab9e69\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"url\":\"struts-2-stextarea-textarea-example\",\"key\":\"struts-2-stextarea-textarea-example\",\"createdAt\":\"2020-10-01T14:44:01.436Z\",\"updatedAt\":\"2020-10-13T08:25:58.055Z\",\"__v\":0}},{\"order\":63,\"_id\":\"5fcf8cefd5dd8e00183d7339\",\"post\":{\"meta\":{\"description\":\"在Struts2,可以使用s:radio標籤來創建一個HTML單選按鈕。有很多方法來填充數據到單選按鈕,可以通過List, OGNL 或 Object。請檢看下面的例子就知道了。 Struts2 s:radio 示例 舉個例子來說明如\",\"keywords\":\"Struts2,radio,單選按鈕,例子\"},\"content\":{\"extended\":\"$4d\"},\"state\":\"published\",\"views\":525,\"order\":63,\"_id\":\"59fd7e8e1e18b40005ab9ea3\",\"key\":\"struts-2-sradio-radio-button-example\",\"url\":\"struts-2-sradio-radio-button-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:radio\u003e單選按鈕例子\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:10.878Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.076Z\"}},{\"order\":64,\"_id\":\"5fcf8cefd5dd8e00183d733a\",\"post\":{\"meta\":{\"description\":\"下面是幾個Struts2的例子來說明如何通過List, OGNL 和對象生成一個單選按鈕默認值(預先選擇)。 1. 列表 - List 在Java代碼中創建一個列表返回單選按鈕的值。 //...ListString genders = new Arra\",\"keywords\":\"Struts2,單選,預選,按鈕值\"},\"content\":{\"extended\":\"$4e\"},\"state\":\"published\",\"views\":561,\"order\":64,\"_id\":\"59fd7e8f1e18b40005ab9ea4\",\"key\":\"how-to-preselect-a-radio-button-value-in-struts-2\",\"url\":\"how-to-preselect-a-radio-button-value-in-struts-2\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2單選預選按鈕值\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:11.151Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.066Z\"}},{\"order\":65,\"_id\":\"5fcf8cefd5dd8e00183d733b\",\"post\":{\"meta\":{\"description\":\"在Struts2,可以使用s:checkbox標籤來創建一個HTML複選框。fieldValue=」true」是將要提交的複選框的實際值。 s:checkbox name=\",\"keywords\":\"Struts2,checkbox,複選框,例子\"},\"content\":{\"extended\":\"$4f\"},\"state\":\"published\",\"views\":724,\"order\":65,\"_id\":\"59fd7e901e18b40005ab9ea5\",\"key\":\"struts-2-scheckbox-checkbox-example\",\"url\":\"struts-2-scheckbox-checkbox-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:checkbox\u003e複選框例子\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:12.269Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.058Z\"}},{\"order\":66,\"_id\":\"5fcf8cefd5dd8e00183d733c\",\"post\":{\"meta\":{\"description\":\"在Struts2,可以通過s:checkboxlist標籤創建多個複選框具有相同名稱。棘手的問題是如何設置的默認值在多個複選框。例如,複選框以「紅色」,「黃色」,「藍色」,「綠色」選項的列表\",\"keywords\":\"Struts2,設置,複選框,缺省值\"},\"content\":{\"extended\":\"$50\"},\"state\":\"published\",\"views\":410,\"order\":66,\"_id\":\"59fd7e911e18b40005ab9ea6\",\"key\":\"how-to-set-default-value-for-multiple-checkboxes-in-struts-2\",\"url\":\"how-to-set-default-value-for-multiple-checkboxes-in-struts-2\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2設置多個複選框缺省值\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:13.170Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.048Z\"}},{\"order\":67,\"_id\":\"5fcf8cefd5dd8e00183d733d\",\"post\":{\"meta\":{\"description\":\"在Struts2,可以使用s:checkboxlist標籤來使用相同的名稱來創建多個複選框。唯一的問題是如何把握變量中的多個檢查值? 例如, public ListString getColors() {colors = new ArrayListString();colors.add(\",\"keywords\":\"Struts2,checkboxlist,複選框\"},\"content\":{\"extended\":\"$51\"},\"state\":\"published\",\"views\":411,\"order\":67,\"_id\":\"59fd7e911e18b40005ab9ea7\",\"key\":\"struts-2-scheckboxlist-multiple-check-boxes-example\",\"url\":\"struts-2-scheckboxlist-multiple-check-boxes-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:checkboxlist\u003e多個複選框例子\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:13.899Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.039Z\"}},{\"order\":68,\"_id\":\"5fcf8cefd5dd8e00183d733e\",\"post\":{\"content\":{\"extended\":\"$52\"},\"state\":\"published\",\"views\":491,\"order\":68,\"_id\":\"5f75eb344607db0007804f36\",\"title\":\"Struts2 \u003cs:select\u003e下拉框例子\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2020-10-01T14:44:04.396Z\",\"section\":\"59fd7e211e18b40005ab9e69\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"url\":\"struts-2-sselect-drop-down-box-example\",\"key\":\"struts-2-sselect-drop-down-box-example\",\"createdAt\":\"2020-10-01T14:44:04.399Z\",\"updatedAt\":\"2020-10-13T08:25:58.040Z\",\"__v\":0}},{\"order\":69,\"_id\":\"5fcf8cefd5dd8e00183d733f\",\"post\":{\"meta\":{\"description\":\"在Struts2中,HTML下拉框可以通過s:select標籤呈現。要自動選擇一個下拉框的默認值,只是聲明s:select值」屬性標記,並設置相應的默認值。 這裏創建一個Web工程:strut2autoselectdropdown,來演\",\"keywords\":\"Struts2,自動選擇,下拉框\"},\"content\":{\"extended\":\"$53\"},\"state\":\"published\",\"views\":433,\"order\":69,\"_id\":\"59fd7e921e18b40005ab9ea8\",\"key\":\"how-to-auto-select-drop-down-box-value-in-struts-2\",\"url\":\"how-to-auto-select-drop-down-box-value-in-struts-2\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2自動選擇下拉框的值\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:14.932Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.030Z\"}},{\"order\":70,\"_id\":\"5fcf8cefd5dd8e00183d7340\",\"post\":{\"meta\":{\"description\":\"在Struts2, s:combobox標籤是一個下拉列表單文本框組合在一起,允許用戶直接輸入一個值在文本框中,或選擇從下拉列表中選擇值,並選定值將自動填充到文本框中。 如果下拉列表和組合\",\"keywords\":\"Struts2,combobox,組合框,例子\"},\"content\":{\"extended\":\"$54\"},\"state\":\"published\",\"views\":533,\"order\":70,\"_id\":\"59fd7e931e18b40005ab9ea9\",\"key\":\"struts-2-scombobox-combo-box-example\",\"url\":\"struts-2-scombobox-combo-box-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:combobox\u003e組合框的例子\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:15.655Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.023Z\"}},{\"order\":71,\"_id\":\"5fcf8cefd5dd8e00183d7341\",\"post\":{\"meta\":{\"description\":\"s:head標籤是用來輸出如編碼,CSS或JavaScript文件的HTML頭信息。請參見下面的代碼片段: %@ taglib prefix=\",\"keywords\":\"Struts2,head,示例\"},\"content\":{\"extended\":\"$55\"},\"state\":\"published\",\"views\":404,\"order\":71,\"_id\":\"59fd7e931e18b40005ab9eaa\",\"key\":\"struts-2-shead-example\",\"url\":\"struts-2-shead-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:head\u003e示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:15.921Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.012Z\"}},{\"order\":72,\"_id\":\"5fcf8cefd5dd8e00183d7342\",\"post\":{\"meta\":{\"description\":\"在Struts2, s:file 標籤用於創建一個HTML文件上傳組件,允許用戶從本地磁盤選擇文件,並將其上傳到服務器。在本教程中,您將創建與文件上傳組件JSP頁面,設置最大大小和允許上傳文件\",\"keywords\":\"Struts2,文件,上傳y,例子\"},\"content\":{\"extended\":\"$56\"},\"state\":\"published\",\"views\":471,\"order\":72,\"_id\":\"59fd7e941e18b40005ab9eab\",\"key\":\"struts-2-file-upload-example\",\"url\":\"struts-2-file-upload-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2文件上傳例子\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:16.832Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.005Z\"}},{\"order\":73,\"_id\":\"5fcf8cefd5dd8e00183d7343\",\"post\":{\"meta\":{\"description\":\"在上章節 Struts2 文件上傳示例 , 用戶允許選擇一個文件並上傳到服務器。在本教程中,您將學習如何允許用戶將多個文件上傳到服務器。 1. 動作類 在Action類,可以使用列表或數組以存\",\"keywords\":\"Struts2,上傳,多個文件,例子\"},\"content\":{\"extended\":\"$57\"},\"state\":\"published\",\"views\":448,\"order\":73,\"_id\":\"59fd7e951e18b40005ab9eac\",\"key\":\"struts-2-upload-multiple-files-example\",\"url\":\"struts-2-upload-multiple-files-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2上傳多個文件例子\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:17.592Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.992Z\"}},{\"order\":74,\"_id\":\"5fcf8cefd5dd8e00183d7344\",\"post\":{\"meta\":{\"description\":\"在Struts2,s:doubleselect標籤用於創建兩個HTML下拉框,第一個下拉列表中選擇後,第二個下拉列表將根據第一個選擇發生相應的變化。一個非常典型的例子是「國家」,「國家」下拉選項,\",\"keywords\":\"Struts2,doubleselect,示例\"},\"content\":{\"extended\":\"$58\"},\"state\":\"published\",\"views\":422,\"order\":74,\"_id\":\"59fd7e961e18b40005ab9ead\",\"key\":\"struts-2-sdoubleselect-example\",\"url\":\"struts-2-sdoubleselect-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:doubleselect\u003e示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:18.296Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.981Z\"}},{\"order\":75,\"_id\":\"5fcf8cefd5dd8e00183d7345\",\"post\":{\"meta\":{\"description\":\"在Struts2,S:updownselect標籤用於創建一個帶有按鈕的HTML選擇組件向上或向下移動在選擇組件的選項。當提交表單時,所有的選擇方案將提交在它們的排列順序。 s:updownselect 示例 s:updow\",\"keywords\":\"Struts2,updownselect,示例\"},\"content\":{\"extended\":\"$59\"},\"state\":\"published\",\"views\":507,\"order\":75,\"_id\":\"59fd7e971e18b40005ab9eae\",\"key\":\"struts-2-updownselect-example\",\"url\":\"struts-2-updownselect-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:updownselect\u003e示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:19.025Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.950Z\"}},{\"order\":76,\"_id\":\"5fcf8cefd5dd8e00183d7346\",\"post\":{\"meta\":{\"description\":\"在Struts2中,選項選擇組件是兩個「updownselect」選擇部件在左,右側對齊,在它們中間,包含按鈕來移動自己的選擇選項。通過s:optiontransferselect標籤這可以創建。 s:optiontransferselect labe\",\"keywords\":\"Struts2,optiontransferselect,示例\"},\"content\":{\"extended\":\"$5a\"},\"state\":\"published\",\"views\":467,\"order\":76,\"_id\":\"59fd7e971e18b40005ab9eaf\",\"key\":\"struts-2-optiontransferselect-example\",\"url\":\"struts-2-optiontransferselect-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:optiontransferselect\u003e示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:19.747Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.939Z\"}},{\"order\":77,\"_id\":\"5fcf8cefd5dd8e00183d7347\",\"post\":{\"meta\":{\"description\":\"在Struts2,dojo ajax標籤「sx:datetimepicker」將呈現一個文本框和追加後面的日曆圖標,點擊日曆圖標會提示的日期時間選擇器組件。 要創建一個日期時間接組成部分,確保: 1. 下載 struts\",\"keywords\":\"Struts2,datetimepicker,示例\"},\"content\":{\"extended\":\"$5b\"},\"state\":\"published\",\"views\":461,\"order\":77,\"_id\":\"59fd7e981e18b40005ab9eb0\",\"key\":\"struts-2-datetimepicker-example\",\"url\":\"struts-2-datetimepicker-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003csx:datetimepicker\u003e示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:20.463Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.926Z\"}},{\"order\":78,\"_id\":\"5fcf8cefd5dd8e00183d7348\",\"post\":{\"meta\":{\"description\":\"在Struts2,sx:autocompleter標記是一個組合框,當在用戶輸入文本框會自動提示下拉的提示菜單。 This feature is implemented by dojo library, So, make sure you include 「 struts2-dojo-plugin.jar 」 as dependency\",\"keywords\":\"Struts2,autocompleter,自動提示,例子\"},\"content\":{\"extended\":\"$5c\"},\"state\":\"published\",\"views\":451,\"order\":78,\"_id\":\"59fd7e991e18b40005ab9eb1\",\"key\":\"struts-2-autocompleter-example\",\"url\":\"struts-2-autocompleter-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003csx:autocompleter\u003e自動提示例子\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:21.172Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.913Z\"}},{\"order\":79,\"_id\":\"5fcf8cefd5dd8e00183d7349\",\"post\":{\"meta\":{\"description\":\"在上一章 Struts2 autocompleter例子 ,已經瞭解如何通過Java列表,ONGL表達生成 autocompleter 選擇選項組件列表。另外,也有可能產生通過JSON數據選擇的選擇也是如此。 在開始之前,請確保您\",\"keywords\":\"Struts2,autocompleter,JSON,例子\"},\"content\":{\"extended\":\"$5d\"},\"state\":\"published\",\"views\":437,\"order\":79,\"_id\":\"59fd7e991e18b40005ab9eb2\",\"key\":\"struts-2-autocompleter-json-example\",\"url\":\"struts-2-autocompleter-json-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 autocompleter+JSON例子\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:21.739Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.900Z\"}},{\"order\":80,\"_id\":\"5fcf8cefd5dd8e00183d734a\",\"post\":{\"meta\":{\"description\":\"Struts2迭代器標籤用來迭代一個值,它可以是任何java.util.Collection或java.util.Iterator的值。在本教程中,您將創建一個列表變量,使用迭代器標籤來遍歷,並得到使用IteratorStatus迭代狀態。\",\"keywords\":\"Struts2,iterator,迭代器,標籤,示例\"},\"content\":{\"extended\":\"$5e\"},\"state\":\"published\",\"views\":420,\"order\":80,\"_id\":\"59fd7e9a1e18b40005ab9eb3\",\"key\":\"struts-2-iterator-tag-example\",\"url\":\"struts-2-iterator-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:iterator\u003e迭代器標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:22.322Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.890Z\"}},{\"order\":81,\"_id\":\"5fcf8cefd5dd8e00183d734b\",\"post\":{\"meta\":{\"description\":\"Struts2 s:if, s:elseif, s:else標籤示例用於執行基本的條件檢查。這裏創建一個Web工程:strut2iftag,來演示在多個複選框如何設置的默認值,整個項目的結構如下圖所示: s:if 標籤可以單獨使\",\"keywords\":\"Struts2,if,elseif,else,標籤,示例\"},\"content\":{\"extended\":\"$5f\"},\"state\":\"published\",\"views\":513,\"order\":81,\"_id\":\"59fd7e9a1e18b40005ab9eb4\",\"key\":\"struts-2-if-elseif-else-tag-example\",\"url\":\"struts-2-if-elseif-else-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 if,elseif,else標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:22.839Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.881Z\"}},{\"order\":82,\"_id\":\"5fcf8cefd5dd8e00183d734c\",\"post\":{\"meta\":{\"description\":\"Struts2 的append(追加)標籤被用來組合幾個迭代器(以列表或映射創建)成一個單一的迭代器。這裏創建一個Web工程:struts2appendtag,來演示在多個複選框如何設置的默認值,整個項目的\",\"keywords\":\"struts2,append,標籤,示例\"},\"content\":{\"extended\":\"$60\"},\"state\":\"published\",\"views\":415,\"order\":82,\"_id\":\"59fd7e9b1e18b40005ab9eb5\",\"key\":\"struts-2-append-tag-example\",\"url\":\"struts-2-append-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"struts2 \u003cs:append\u003e標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:23.378Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.871Z\"}},{\"order\":83,\"_id\":\"5fcf8cefd5dd8e00183d734d\",\"post\":{\"meta\":{\"description\":\"Struts2 s:generator標記用於基於在頁中提供「val」屬性,以產生一個迭代。這裏創建一個Web工程:struts2generatortag,來演示在多個複選框如何設置的默認值,整個項目的結構如下圖所示: 在\",\"keywords\":\"Struts2,generator,標籤,示例\"},\"content\":{\"extended\":\"$61\"},\"state\":\"published\",\"views\":433,\"order\":83,\"_id\":\"59fd7e9b1e18b40005ab9eb6\",\"key\":\"struts-2-generator-tag-example\",\"url\":\"struts-2-generator-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:generator\u003e標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:23.892Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.860Z\"}},{\"order\":84,\"_id\":\"5fcf8cefd5dd8e00183d734e\",\"post\":{\"meta\":{\"description\":\"Struts2merge標籤用來合併幾個迭代器(由列表或映射創建)成一個迭代器。這裏創建一個Web工程:struts2mergetag,來演示在多個複選框如何設置的默認值,整個項目的結構如下圖所示: 在本\",\"keywords\":\"Struts2,merge,標籤,示例\"},\"content\":{\"extended\":\"$62\"},\"state\":\"published\",\"views\":433,\"order\":84,\"_id\":\"59fd7e9c1e18b40005ab9eb7\",\"key\":\"struts-2-merge-tag-example\",\"url\":\"struts-2-merge-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:merge\u003e標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:24.411Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.851Z\"}},{\"order\":85,\"_id\":\"5fcf8cefd5dd8e00183d734f\",\"post\":{\"meta\":{\"description\":\"Struts2的s:sort標籤使用java.util.Comparator來排序列表,這裏創建一個Web工程:struts2sorttag,來演示在多個複選框如何設置的默認值,整個項目的結構如下圖所示: 在本教程中,將創建6個Pe\",\"keywords\":\"Struts2,sort,標籤,示例\"},\"content\":{\"extended\":\"$63\"},\"state\":\"published\",\"views\":439,\"order\":85,\"_id\":\"59fd7e9c1e18b40005ab9eb8\",\"key\":\"struts-2-sort-tag-example\",\"url\":\"struts-2-sort-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:sort\u003e標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:24.944Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.841Z\"}},{\"order\":86,\"_id\":\"5fcf8cefd5dd8e00183d7350\",\"post\":{\"meta\":{\"description\":\"Struts2s:subset標籤用來輸出一個iterator元素的子集或部分。在本教程中,將創建一個「數字」列表中,包含了10個元素(從 1 - 10),並使用s:subset標記「start count」屬性和判定方法,以輸出一個\",\"keywords\":\"Struts2,subset,標籤,示例\"},\"content\":{\"extended\":\"$64\"},\"state\":\"published\",\"views\":445,\"order\":86,\"_id\":\"59fd7e9d1e18b40005ab9eb9\",\"key\":\"struts-2-subset-tag-example\",\"url\":\"struts-2-subset-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:subset\u003e標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:25.448Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.814Z\"}},{\"order\":87,\"_id\":\"5fcf8cefd5dd8e00183d7351\",\"post\":{\"meta\":{\"description\":\"Struts2 s:a標籤用於渲染一個 HTML 的「a」 標籤。最好的做法是使用s:url標籤來創建URL,並將其嵌入到a標籤。例如, s:url value=\",\"keywords\":\"Struts2,標籤,示例\"},\"content\":{\"extended\":\"$65\"},\"state\":\"published\",\"views\":404,\"order\":87,\"_id\":\"59fd7e9d1e18b40005ab9eba\",\"key\":\"struts-2-a-tag-example\",\"url\":\"struts-2-a-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:a\u003e標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:25.895Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.807Z\"}},{\"order\":88,\"_id\":\"5fcf8cefd5dd8e00183d7352\",\"post\":{\"meta\":{\"description\":\"Struts2 的「action」標籤是用來直接從JSP頁面中調用Action類。如果「executeResult」屬性設置爲true,則結果頁的內容將直接在當前網頁渲染。 這是用一個完整的例子很好地說明: 1. 動作 Ac\",\"keywords\":\"Struts2,action,標籤\"},\"content\":{\"extended\":\"$66\"},\"state\":\"published\",\"views\":449,\"order\":88,\"_id\":\"59fd7e9e1e18b40005ab9ebb\",\"key\":\"struts-2-action-tag-example\",\"url\":\"struts-2-action-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:action\u003e標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:26.347Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.800Z\"}},{\"order\":89,\"_id\":\"5fcf8cefd5dd8e00183d7353\",\"post\":{\"meta\":{\"description\":\"Struts2的s:bean標籤用於在JSP頁面中實例化一個類。 在本教程中,將使用s:bean標籤,以實例化一個helloBean的類, 通過「param」元素設置其屬性,並打印出它的值。 1. 簡單Bean 一個簡單的類\",\"keywords\":\"Struts2,bean,標籤,示例,Struts2,的,bean,標籤,用於,\"},\"content\":{\"extended\":\"$67\"},\"state\":\"published\",\"views\":494,\"order\":89,\"_id\":\"59fd7e9e1e18b40005ab9ebc\",\"key\":\"struts-2-bean-tag-example\",\"url\":\"struts-2-bean-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:bean\u003e標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:26.736Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.793Z\"}},{\"order\":90,\"_id\":\"5fcf8cefd5dd8e00183d7354\",\"post\":{\"meta\":{\"description\":\"Struts2的s:date標籤用於格式化Date對象,它有兩種方法: 自定義格式 (如:yyyy-MM-dd) 「nice」屬性來格式化日期到一個易於閱讀的符號,如,「此日期162天前」。 在本教程中,它顯示瞭如何\",\"keywords\":\"Struts2,date,標籤\"},\"content\":{\"extended\":\"$68\"},\"state\":\"published\",\"views\":405,\"order\":90,\"_id\":\"59fd7e9f1e18b40005ab9ebd\",\"key\":\"struts-2-date-tag-example\",\"url\":\"struts-2-date-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:date\u003e標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:27.169Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.786Z\"}},{\"order\":91,\"_id\":\"5fcf8cefd5dd8e00183d7355\",\"post\":{\"meta\":{\"description\":\"在Struts2在s:debug標籤是一個非常有用的調試標記輸出「值棧」的內容,並在網頁中「堆棧上下文」的詳細信息。在本教程,在JSP頁面中顯示如何使用s:debug標籤。 1. 動作 一個簡單的Acti\",\"keywords\":\"Struts2,debug,標籤\"},\"content\":{\"extended\":\"$69\"},\"state\":\"published\",\"views\":447,\"order\":91,\"_id\":\"59fd7e9f1e18b40005ab9ebe\",\"key\":\"struts-2-debug-tag-example\",\"url\":\"struts-2-debug-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:debug\u003e標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:27.657Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.777Z\"}},{\"order\":92,\"_id\":\"5fcf8cefd5dd8e00183d7356\",\"post\":{\"meta\":{\"description\":\"Struts2s:include標籤用於直接包含JSP或HTML頁面到當前頁面。 參見下面s:include標籤的例子。 1. 動作 一個簡單的動作類只做轉發任務。 IncludeTagAction.java package com.mkyong.common.action;import com.ope\",\"keywords\":\"Struts2,include,標籤\"},\"content\":{\"extended\":\"$6a\"},\"state\":\"published\",\"views\":473,\"order\":92,\"_id\":\"59fd7ea01e18b40005ab9ebf\",\"key\":\"struts-2-include-tag-example\",\"url\":\"struts-2-include-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:include\u003e標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:28.074Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.769Z\"}},{\"order\":93,\"_id\":\"5fcf8cefd5dd8e00183d7357\",\"post\":{\"meta\":{\"description\":\"Struts2s:i18n標籤是用來從聲明的資源包獲得消息, 不只是使用當前操作相關聯的資源包。看下面一個完整的s:i18n標籤的例子: 1. 動作 Action類轉發請求。 I18nTagAction.java package com.mkyong.co\",\"keywords\":\"Struts2,i18n,標籤,示例\"},\"content\":{\"extended\":\"$6b\"},\"state\":\"published\",\"views\":388,\"order\":93,\"_id\":\"59fd7ea01e18b40005ab9ec0\",\"key\":\"struts-2-i18n-tag-example\",\"url\":\"struts-2-i18n-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:i18n\u003e標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:28.496Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.760Z\"}},{\"order\":94,\"_id\":\"5fcf8cefd5dd8e00183d7358\",\"post\":{\"meta\":{\"description\":\"Struts2 s: param 標籤被用來參數化其他標籤。 但是,當稱明s:param標籤,「參數值」可以有兩種定義方式: 「value」 屬性 param標籤的開始和結束之間的文本 例如, param name=\",\"keywords\":\"Struts2,param,示例,標籤\"},\"content\":{\"extended\":\"$6c\"},\"state\":\"published\",\"views\":524,\"order\":94,\"_id\":\"59fd7ea01e18b40005ab9ec1\",\"key\":\"struts-2-param-tag-example\",\"url\":\"struts-2-param-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:param\u003e標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:28.932Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.749Z\"}},{\"order\":95,\"_id\":\"5fcf8cefd5dd8e00183d7359\",\"post\":{\"meta\":{\"description\":\"Struts2的s:property標籤是用來從一個類獲得屬性值,如果沒有指定,這將默認爲當前Action類(堆棧的頂部)屬性。在本教程中,它展示瞭如何使用s:property標籤,以從目前Action類獲得其他\",\"keywords\":\"Struts2,property,標籤,實例\"},\"content\":{\"extended\":\"$6d\"},\"state\":\"published\",\"views\":919,\"order\":95,\"_id\":\"59fd7ea11e18b40005ab9ec2\",\"key\":\"struts-2-property-tag-example\",\"url\":\"struts-2-property-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:property\u003e標籤實例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:29.367Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.738Z\"}},{\"order\":96,\"_id\":\"5fcf8cefd5dd8e00183d735a\",\"post\":{\"meta\":{\"description\":\"Struts2s:push標籤被用來將值推到堆棧的頂部,以便它可以容易地訪問或參考。看到一個完整的s:push標記示例: 1. 動作 Action類只轉發請求。 PushTagAction.java package com.mkyong.common.action;import\",\"keywords\":\"Struts2,push,標籤,示例\"},\"content\":{\"extended\":\"$6e\"},\"state\":\"published\",\"views\":449,\"order\":96,\"_id\":\"59fd7ea11e18b40005ab9ec3\",\"key\":\"struts-2-push-tag-example\",\"url\":\"struts-2-push-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:push\u003e標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:29.793Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.728Z\"}},{\"order\":97,\"_id\":\"5fcf8cefd5dd8e00183d735b\",\"post\":{\"meta\":{\"description\":\"Struts2s:set標籤用於分配值在指定範圍內的變量(應用,會話,請求,頁面,或動作),默認的範圍是動作。下面來看一個完整的s:set標籤的例子: 「value」是指任何硬編碼字符串,屬性\",\"keywords\":\"Struts2,set,標籤,示例\"},\"content\":{\"extended\":\"$6f\"},\"state\":\"published\",\"views\":621,\"order\":97,\"_id\":\"59fd7ea21e18b40005ab9ec4\",\"key\":\"struts-2-set-tag-example\",\"url\":\"struts-2-set-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:set\u003e標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:30.215Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.719Z\"}},{\"order\":98,\"_id\":\"5fcf8cefd5dd8e00183d735c\",\"post\":{\"meta\":{\"description\":\"Struts2s:text標籤是用來從資源包獲取捆綁動作類的消息。並按照三個序列: 顯示來自資源包的消息,按照 Struts2的資源包搜索順序 。 如果未在資源包中找到消息,則標籤的本身會被顯示\",\"keywords\":\"Struts2,texttag,標籤,示例\"},\"content\":{\"extended\":\"$70\"},\"state\":\"published\",\"views\":427,\"order\":98,\"_id\":\"59fd7ea21e18b40005ab9ec5\",\"key\":\"struts-2-text-tag-example\",\"url\":\"struts-2-text-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:texttag\u003e標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:30.481Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.710Z\"}},{\"order\":99,\"_id\":\"5fcf8cefd5dd8e00183d735d\",\"post\":{\"meta\":{\"description\":\"Struts2s:url標籤被用來創建一個URL,並輸出它作爲文本格式。它從不通過自己的工作,但它可以提供URL鏈接到其他標籤,如s:a創建超鏈接或img渲染圖像。在本教程中,它顯示 Struts2s:url標籤\",\"keywords\":\"Struts2,url,標籤,示例\"},\"content\":{\"extended\":\"$71\"},\"state\":\"published\",\"views\":439,\"order\":99,\"_id\":\"59fd7ea21e18b40005ab9ec6\",\"key\":\"struts-2-url-tag-example\",\"url\":\"struts-2-url-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:url\u003e標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:30.911Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.699Z\"}},{\"order\":100,\"_id\":\"5fcf8cefd5dd8e00183d735e\",\"post\":{\"meta\":{\"description\":\"要使用資源包從屬性文件檢索消息,必須瞭解Struts2的資源包搜索順序: 資源包搜索順序 資源包中搜索按以下順序: ActionClass.properties Interface.properties BaseClass.properties ModelDriven’s model\",\"keywords\":\"Struts2,資源包,使用,示例\"},\"content\":{\"extended\":\"$72\"},\"state\":\"published\",\"views\":418,\"order\":100,\"_id\":\"59fd7ea31e18b40005ab9ec7\",\"key\":\"struts-2-resource-bundle-example\",\"url\":\"struts-2-resource-bundle-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2資源包使用示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:31.480Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.669Z\"}},{\"order\":101,\"_id\":\"5fcf8cefd5dd8e00183d735f\",\"post\":{\"meta\":{\"description\":\"Struts2的國際化(I18N)和本地化(i10n)或多語言的例子,來說明如何使用資源包來顯示不同語言的消息。在這個例子中,您將創建一個簡單的登錄屏幕,通過Struts2的UI組件顯示來自資源\",\"keywords\":\"Struts2,本地化,國際化\"},\"content\":{\"extended\":\"$73\"},\"state\":\"published\",\"views\":392,\"order\":101,\"_id\":\"59fd7ea41e18b40005ab9ec8\",\"key\":\"struts-2-i18n-or-localization-example\",\"url\":\"struts-2-i18n-or-localization-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2本地化和國際化\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:32.739Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.658Z\"}},{\"order\":102,\"_id\":\"5fcf8cefd5dd8e00183d7360\",\"post\":{\"meta\":{\"description\":\"在Struts2,在UI組件的「key」屬性來處理本地化的常用方法,也是編碼UI標籤的一個非常有效的方式。見下面兩種情況: 1. Properties屬性文件 屬性文件包含一條消息。 global.properties global\",\"keywords\":\"Struts2,key,鍵屬性,示例\"},\"content\":{\"extended\":\"$74\"},\"state\":\"published\",\"views\":418,\"order\":102,\"_id\":\"59fd7ea51e18b40005ab9ec9\",\"key\":\"struts-2-key-attribute-example\",\"url\":\"struts-2-key-attribute-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 key鍵屬性示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:33.005Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.647Z\"}},{\"order\":103,\"_id\":\"5fcf8cefd5dd8e00183d7361\",\"post\":{\"meta\":{\"description\":\"一個 Struts2 的國際化定位的問題,用來顯示中國漢字... 案例1:屬性有特殊字符的文件 屬性文件存儲用戶名,密碼信息,並以中文字符提交。此屬性文件以UTF-8格式創建的,但內容不使\",\"keywords\":\"Struts2,中文,本地化\"},\"content\":{\"extended\":\"$75\"},\"state\":\"published\",\"views\":432,\"order\":103,\"_id\":\"59fd7ea61e18b40005ab9eca\",\"key\":\"struts-2-chinese-localization-issue\",\"url\":\"struts-2-chinese-localization-issue\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2中文本地化問題\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:34.149Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.638Z\"}},{\"order\":104,\"_id\":\"5fcf8cefd5dd8e00183d7362\",\"post\":{\"meta\":{\"description\":\"通常情況下,您可能需要一個全局資源包(屬性文件)來存儲信息,可用於在應用程序中的所有類。 在Struts2,有三種方式來配置全局資源包: 1. struts.properties 配置全局資源包在「str\",\"keywords\":\"配置,Struts2,全局,資源包\"},\"content\":{\"extended\":\"$76\"},\"state\":\"published\",\"views\":439,\"order\":104,\"_id\":\"59fd7ea61e18b40005ab9ecb\",\"key\":\"how-to-configure-global-resource-bundle-in-struts-2\",\"url\":\"how-to-configure-global-resource-bundle-in-struts-2\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"如何配置Struts2全局資源包\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:34.418Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.626Z\"}},{\"order\":105,\"_id\":\"5fcf8cefd5dd8e00183d7363\",\"post\":{\"meta\":{\"description\":\"在本教程中,我們來學習Struts2和Spring的集成。 1. 工程結構 下面的圖是本教程的項目文件夾結構。 2. Spring監聽器 配置Spring監聽器「org.springframework.web.context.ContextLoaderListener」 到web.xml文\",\"keywords\":\"Struts2,Spring,集成,示例\"},\"content\":{\"extended\":\"$77\"},\"state\":\"published\",\"views\":464,\"order\":105,\"_id\":\"59fd7ea71e18b40005ab9ecc\",\"key\":\"struts-2-spring-integration-example\",\"url\":\"struts-2-spring-integration-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2+Spring集成實例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:35.188Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.617Z\"}},{\"order\":106,\"_id\":\"5fcf8cefd5dd8e00183d7364\",\"post\":{\"meta\":{\"description\":\"Struts2並沒有附帶任何現成「Struts2-Quartz.jar」之類的插件,黑客可能會使用標準的Servlet監聽將兩個框架鏈接在一起。請參閱它們的關係 Struts 2 -- (Listener)-- Quartz --- Scheduler task 在本教程中\",\"keywords\":\"Struts2,Quartz,調度,集成,實例\"},\"content\":{\"extended\":\"$78\"},\"state\":\"published\",\"views\":400,\"order\":106,\"_id\":\"59fd7ea71e18b40005ab9ecd\",\"key\":\"struts-2-quartz-scheduler-integration-example\",\"url\":\"struts-2-quartz-scheduler-integration-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2+Quartz2調度集成實例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:35.454Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.602Z\"}},{\"order\":107,\"_id\":\"5fcf8cefd5dd8e00183d7365\",\"post\":{\"meta\":{\"description\":\"在上篇 Struts2 + Hibernate集成 實例中,它使用servlet上下文監聽Hibernate的Session,而且把Struts2和Hibernate框架集成。 但是,總有一些東西要提高。在本教程中,我們將展示如何整合Struts2+Hiber\",\"keywords\":\"Struts2,Hibernate,Full,集成\"},\"content\":{\"extended\":\"$79\"},\"state\":\"published\",\"views\":415,\"order\":107,\"_id\":\"59fd7ef41e18b40005ab9ece\",\"key\":\"struts-2-hibernate-integration-with-full-hibernate-plugin\",\"url\":\"struts-2-hibernate-integration-with-full-hibernate-plugin\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2+Hibernate使用Full Hibernate Plugin集成\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:48:52.475Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.577Z\"}},{\"order\":108,\"_id\":\"5fcf8cefd5dd8e00183d7366\",\"post\":{\"meta\":{\"description\":\"在 Struts2 中,沒有官方的插件集成Hibernate框架。但是,可以通過以下步驟解決方法: 註冊一個自定義的ServletContextListener 在ServletContextListener類,初始化Hibernate會話,並將其存儲到servlet上\",\"keywords\":\"Struts2,Hibernate,集成,實例\"},\"content\":{\"extended\":\"$7a\"},\"state\":\"published\",\"views\":412,\"order\":108,\"_id\":\"59fd7ef51e18b40005ab9ecf\",\"key\":\"struts-2-hibernate-integration-example\",\"url\":\"struts-2-hibernate-integration-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2+Hibernate集成實例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:48:53.184Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.562Z\"}},{\"order\":109,\"_id\":\"5fcf8cefd5dd8e00183d7367\",\"post\":{\"meta\":{\"description\":\"在本教程中,它顯示的集成「Struts2 + Spring + Hibernate「,請務必檢查以下之前繼續學習教程。 Struts2 + Hibernate集成實例 Struts2 + Spring 集成實例 參見集成步驟總結: 獲取所有的依賴庫(很\",\"keywords\":\"Struts2,Spring,Hibernate,集成,實例\"},\"content\":{\"extended\":\"$7b\"},\"state\":\"published\",\"views\":394,\"order\":109,\"_id\":\"59fd7ef51e18b40005ab9ed0\",\"key\":\"struts-2-spring-hibernate-integration-example\",\"url\":\"struts-2-spring-hibernate-integration-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2+Spring+Hibernate集成實例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:48:53.976Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.528Z\"}},{\"order\":110,\"_id\":\"5fcf8cefd5dd8e00183d7368\",\"post\":{\"meta\":{\"description\":\"在本教程中,我們學習如何將log4j框架在Struts2的Web應用程序集成。所有需要做的有: 包含 log4j.jar 作爲項目依賴 創建一個 log4j.properties 文件,並把它放入 classpath 的根目錄-放到資源文件\",\"keywords\":\"Struts2,Log4j,集成\"},\"content\":{\"extended\":\"$7c\"},\"state\":\"published\",\"views\":427,\"order\":110,\"_id\":\"59fd7ef61e18b40005ab9ed1\",\"key\":\"struts-2-log4j-integration-example\",\"url\":\"struts-2-log4j-integration-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2+Log4j集成\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:48:54.862Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.512Z\"}},{\"order\":111,\"_id\":\"5fcf8cefd5dd8e00183d7369\",\"post\":{\"meta\":{\"description\":\"在Struts2的開發時,很多人會問爲什麼有些聲明過濾器類是「FilterDispatcher「; 而有一些又是「StrutsPrepareAndExecuteFilter「?但兩者都可以正常使用,並有什麼區別? 1. FilterDispatcher 示例 ...f\",\"keywords\":\"FilterDispatcher,struts2,StrutsPrepareAndExecuteFilter\"},\"content\":{\"extended\":\"$7d\"},\"state\":\"published\",\"views\":414,\"order\":111,\"_id\":\"59fd7ef71e18b40005ab9ed2\",\"key\":\"difference-between-struts-2-filterdispatcher-and-strutsprepareandexecutefilter\",\"url\":\"difference-between-struts-2-filterdispatcher-and-strutsprepareandexecutefilter\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2的FilterDispatcher和StrutsPrepareAndExecuteFilter有什麼不同?\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:48:55.133Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.502Z\"}},{\"order\":112,\"_id\":\"5fcf8cefd5dd8e00183d736a\",\"post\":{\"meta\":{\"description\":\"在Struts2中,可以使用以下兩種方法來獲取HttpServletRequest對象。 1. ServletActionContext 直接從 org.apache.struts2.ServletActionContext 獲取 HttpServletRequest 對象。 import javax.servlet.http.HttpServletRequest;im\",\"keywords\":\"Struts2,獲取,HttpServletRequest,實例\"},\"content\":{\"extended\":\"$7e\"},\"state\":\"published\",\"views\":475,\"order\":112,\"_id\":\"59fd7ef71e18b40005ab9ed3\",\"key\":\"how-to-get-the-httpservletrequest-in-struts-2\",\"url\":\"how-to-get-the-httpservletrequest-in-struts-2\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2獲取HttpServletRequest實例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:48:55.441Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.495Z\"}},{\"order\":113,\"_id\":\"5fcf8cefd5dd8e00183d736b\",\"post\":{\"meta\":{\"description\":\"在Struts2中,可以用以下兩種方式來獲取HttpServletResponse對象。 1. ServletActionContext 通過ServletActionContext類來訪問HttpServletResponse。 package com.mkyong.common.action;import javax.servlet.http.HttpServletResp\",\"keywords\":\"Struts2,獲取,HttpServletResponse,實例\"},\"content\":{\"extended\":\"$7f\"},\"state\":\"published\",\"views\":536,\"order\":113,\"_id\":\"59fd7ef71e18b40005ab9ed4\",\"key\":\"how-to-get-the-httpservletresponse-in-struts-2\",\"url\":\"how-to-get-the-httpservletresponse-in-struts-2\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2獲取HttpServletResponse實例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:48:55.745Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.489Z\"}},{\"order\":114,\"_id\":\"5fcf8cefd5dd8e00183d736c\",\"post\":{\"meta\":{\"description\":\"在Struts2中,可以使用以下兩種方法來獲取ServletContext對象。 1. ServletActionContext 直接從 org.apache.struts2.ServletActionContext 獲取 ServletContext 對象。 import javax.servlet.ServletContext;import org.apache.s\",\"keywords\":\"獲取,ServletContext,對象\"},\"content\":{\"extended\":\"$80\"},\"state\":\"published\",\"views\":489,\"order\":114,\"_id\":\"59fd7ef81e18b40005ab9ed5\",\"key\":\"how-to-get-the-servletcontext-in-struts-2\",\"url\":\"how-to-get-the-servletcontext-in-struts-2\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"如何獲取ServletContext對象\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:48:56.049Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.482Z\"}},{\"order\":115,\"_id\":\"5fcf8cefd5dd8e00183d736d\",\"post\":{\"meta\":{\"description\":\"在某些情況下,可能需要一個Action類分配一些預定義或靜態的參數值。 爲動作定義靜態參數 在Struts2,可以在 struts.xml文件中的通過param標記進行配置,例如, struts.xml struts constant name\",\"keywords\":\"Struts2,配置,Action類,靜態,參數\"},\"content\":{\"extended\":\"$81\"},\"state\":\"published\",\"views\":434,\"order\":115,\"_id\":\"59fd7ef81e18b40005ab9ed6\",\"key\":\"struts-2-configure-static-parameter-for-action-class\",\"url\":\"struts-2-configure-static-parameter-for-action-class\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2配置Action類的靜態參數\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:48:56.518Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.476Z\"}},{\"order\":116,\"_id\":\"5fcf8cefd5dd8e00183d736e\",\"post\":{\"meta\":{\"description\":\"這是一個Struts2的例子來說明使用定製返回類型,允許用戶下載文件。web工程的文件夾結構如下所示: 1. Action 在Action類中,聲明一個InputStream的數據類型和getter方法。 DownloadAction.java p\",\"keywords\":\"Struts2,下載文件,實例\"},\"content\":{\"extended\":\"$82\"},\"state\":\"published\",\"views\":664,\"order\":116,\"_id\":\"59fd7ef91e18b40005ab9ed7\",\"key\":\"struts-2-download-file-example\",\"url\":\"struts-2-download-file-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2下載文件實例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:48:57.269Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.468Z\"}},{\"order\":117,\"_id\":\"5fcf8cefd5dd8e00183d736f\",\"post\":{\"meta\":{\"description\":\"在這個Struts2例子,將學習如何通過「struts2-json-plugin.jar」庫將對象轉換爲JSON格式的數據。 1. Action (JSON) 這是一個將被轉換成JSON格式的 Action 類。 package com.mkyong.common.action;import java.util\",\"keywords\":\"Struts2,JSON,實例\"},\"content\":{\"extended\":\"$83\"},\"state\":\"published\",\"views\":491,\"order\":117,\"_id\":\"59fd7ef91e18b40005ab9ed8\",\"key\":\"struts-2-and-json-example\",\"url\":\"struts-2-and-json-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2和JSON實例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:48:57.714Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.459Z\"}}]}]},\"post\":{\"meta\":{\"description\":\"Struts2 的「action」標籤是用來直接從JSP頁面中調用Action類。如果「executeResult」屬性設置爲true,則結果頁的內容將直接在當前網頁渲染。 這是用一個完整的例子很好地說明: 1. 動作 Ac\",\"keywords\":\"Struts2,action,標籤\"},\"content\":{\"extended\":\"$84\",\"markdown\":\"$85\",\"html\":\"$86\"},\"state\":\"published\",\"views\":449,\"order\":88,\"_id\":\"59fd7e9e1e18b40005ab9ebb\",\"key\":\"struts-2-action-tag-example\",\"url\":\"struts-2-action-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:action\u003e標籤示例\",\"author\":{\"isPublic\":true,\"isOrganiser\":false,\"isAdmin\":true,\"isVerified\":false,\"isOpen\":false,\"_id\":\"59fa8cb8a31fb7001009c4bb\",\"email\":\"inkebook@outlook.com\",\"password\":\"$$2a$10$94Vw.V1wl1cC4R5SnV54ZOrUfeS0F42MdiV4fkJtjonMaKVuaxBe.\",\"isProtected\":false,\"__v\":0,\"photo\":{\"exists\":false,\"folder\":null},\"url\":\"/member/undefined\",\"_\":{\"name\":{},\"email\":{},\"password\":{},\"resetPasswordKey\":{},\"isPublic\":{},\"isOrganiser\":{},\"photo\":{},\"github\":{},\"twitter\":{},\"website\":{},\"bio\":{},\"gravatar\":{},\"isAdmin\":{},\"isVerified\":{},\"isOpen\":{},\"createdAt\":{},\"createdBy\":{},\"updatedAt\":{},\"updatedBy\":{}},\"id\":\"59fa8cb8a31fb7001009c4bb\"},\"publishedDate\":\"2017-11-04T08:47:26.347Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.800Z\",\"updatedAtPretty\":\"2020年10月13日\",\"_\":{\"title\":{},\"state\":{},\"author\":{},\"publishedDate\":{},\"meta\":{\"keywords\":{},\"description\":{}},\"content\":{\"markdown\":{}},\"categories\":{},\"views\":{},\"ratingCount\":{},\"ratingAvg\":{},\"section\":{},\"tutorial\":{},\"url\":{},\"order\":{},\"createdAt\":{},\"createdBy\":{},\"updatedAt\":{},\"updatedBy\":{}},\"id\":\"59fd7e9e1e18b40005ab9ebb\"}}],[\"$\",\"div\",null,{\"className\":\"col-12 col-sm-8\",\"children\":[[\"$\",\"$L87\",null,{}],[\"$\",\"div\",null,{\"className\":\"book card\",\"children\":[[\"$\",\"div\",null,{\"className\":\"card-header\",\"children\":[\"$\",\"div\",null,{\"className\":\"row\",\"children\":[[\"$\",\"div\",null,{\"className\":\"col\",\"children\":[[\"$\",\"svg\",null,{\"aria-hidden\":\"true\",\"focusable\":\"false\",\"data-prefix\":\"fas\",\"data-icon\":\"arrow-left\",\"className\":\"svg-inline--fa fa-arrow-left \",\"role\":\"img\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 448 512\",\"style\":{},\"children\":[\"$\",\"path\",null,{\"fill\":\"currentColor\",\"d\":\"M9.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.2 288 416 288c17.7 0 32-14.3 32-32s-14.3-32-32-32l-306.7 0L214.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z\",\"style\":{}}]}],[\"$\",\"$Lf\",null,{\"href\":\"/struts-2/struts-2-a-tag-example\",\"children\":\"Struts2 \u003cs:a\u003e標籤示例\"}]]}],[\"$\",\"div\",null,{\"className\":\"col text-md-end\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/struts-2/struts-2-bean-tag-example\",\"children\":[[\"$\",\"svg\",null,{\"aria-hidden\":\"true\",\"focusable\":\"false\",\"data-prefix\":\"fas\",\"data-icon\":\"arrow-right\",\"className\":\"svg-inline--fa fa-arrow-right \",\"role\":\"img\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 448 512\",\"style\":{},\"children\":[\"$\",\"path\",null,{\"fill\":\"currentColor\",\"d\":\"M438.6 278.6c12.5-12.5 12.5-32.8 0-45.3l-160-160c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L338.8 224 32 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l306.7 0L233.4 393.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l160-160z\",\"style\":{}}]}],\"Struts2 \u003cs:bean\u003e標籤示例\"]}]}]]}]}],[\"$\",\"div\",null,{\"className\":\"card-body p-lg-30\",\"children\":[[\"$\",\"div\",null,{\"className\":\"row\",\"children\":[\"$\",\"div\",null,{\"className\":\"col-12 col-lg-9 col-sm-8\",\"children\":[[\"$\",\"h1\",null,{\"className\":\"h2 title\",\"children\":\"Struts2 \u003cs:action\u003e標籤示例\"}],[\"$\",\"div\",null,{\"className\":\"blog-post__byline mb-3\",\"children\":[\"$\",\"div\",null,{\"className\":\"d-sm-inline-block\",\"children\":[[\"$\",\"span\",null,{\"className\":\"split-dot\"}],[\"$\",\"span\",null,{\"className\":\"text-secondary\",\"children\":[\"瀏覽人數:\",[\"$\",\"span\",null,{\"children\":\"449\"}]]}],[\"$\",\"span\",null,{\"className\":\"split-dot\"}],[\"$\",\"span\",null,{\"className\":\"text-secondary\",\"children\":\"最近更新:\"}],[\"$\",\"time\",null,{\"className\":\"text-secondary\",\"dateTime\":\"2020-10-13T08:28:11.800Z\",\"children\":[\"最近更新:\",\"2020年10月13日\"]}]]}]}],\"$undefined\"]}]}],[\"$\",\"article\",null,{\"className\":\"full-post fmt\",\"children\":[[\"$\",\"div\",null,{\"className\":\"row\",\"children\":[\"$\",\"div\",null,{\"className\":\"col\",\"children\":[\"$\",\"$L88\",null,{\"content\":\"$89\"}]}]}],[\"$\",\"div\",null,{\"className\":\"functional-area-bottom\",\"children\":[\"$\",\"div\",null,{\"className\":\"text-center\",\"children\":[\"$\",\"$L8a\",null,{\"post\":{\"meta\":{\"description\":\"Struts2 的「action」標籤是用來直接從JSP頁面中調用Action類。如果「executeResult」屬性設置爲true,則結果頁的內容將直接在當前網頁渲染。 這是用一個完整的例子很好地說明: 1. 動作 Ac\",\"keywords\":\"Struts2,action,標籤\"},\"content\":{\"extended\":\"$8b\",\"markdown\":\"$8c\",\"html\":\"$8d\"},\"state\":\"published\",\"views\":449,\"order\":88,\"_id\":\"59fd7e9e1e18b40005ab9ebb\",\"key\":\"struts-2-action-tag-example\",\"url\":\"struts-2-action-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:action\u003e標籤示例\",\"author\":{\"isPublic\":true,\"isOrganiser\":false,\"isAdmin\":true,\"isVerified\":false,\"isOpen\":false,\"_id\":\"59fa8cb8a31fb7001009c4bb\",\"email\":\"inkebook@outlook.com\",\"password\":\"$$2a$10$94Vw.V1wl1cC4R5SnV54ZOrUfeS0F42MdiV4fkJtjonMaKVuaxBe.\",\"isProtected\":false,\"__v\":0,\"photo\":{\"exists\":false,\"folder\":null},\"url\":\"/member/undefined\",\"_\":{\"name\":{},\"email\":{},\"password\":{},\"resetPasswordKey\":{},\"isPublic\":{},\"isOrganiser\":{},\"photo\":{},\"github\":{},\"twitter\":{},\"website\":{},\"bio\":{},\"gravatar\":{},\"isAdmin\":{},\"isVerified\":{},\"isOpen\":{},\"createdAt\":{},\"createdBy\":{},\"updatedAt\":{},\"updatedBy\":{}},\"id\":\"59fa8cb8a31fb7001009c4bb\"},\"publishedDate\":\"2017-11-04T08:47:26.347Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.800Z\",\"updatedAtPretty\":\"2020年10月13日\",\"_\":{\"title\":{},\"state\":{},\"author\":{},\"publishedDate\":{},\"meta\":{\"keywords\":{},\"description\":{}},\"content\":{\"markdown\":{}},\"categories\":{},\"views\":{},\"ratingCount\":{},\"ratingAvg\":{},\"section\":{},\"tutorial\":{},\"url\":{},\"order\":{},\"createdAt\":{},\"createdBy\":{},\"updatedAt\":{},\"updatedBy\":{}},\"id\":\"59fd7e9e1e18b40005ab9ebb\"},\"tutorial\":{\"state\":\"archived\",\"_id\":\"59fd7e211e18b40005ab9e68\",\"key\":\"struts-2\",\"indexUrl\":\"index\",\"parent\":\"59fbe1e297472d0010f2526c\",\"description\":\"Apache的Struts2是一個優雅的,可擴展的框架,用於創建企業準備的Java Web應用程序。該框架旨在簡化整個開發週期,從構建,部署,維護應用程序隨着時間的推移。 Apache的Struts2最初被稱爲WebWork2。\",\"url\":\"struts-2\",\"name\":\"Struts2教學\",\"__v\":0,\"sections\":[{\"order\":0,\"_id\":\"59fd7e211e18b40005ab9e69\",\"isDefault\":false,\"name\":\"Struts2教程\",\"sortedPosts\":[{\"order\":0,\"_id\":\"5fcf8cefd5dd8e00183d72fb\",\"post\":{\"meta\":{\"description\":\"Apache的Struts2是一個優雅的,可擴展的框架,用於創建企業準備的Java Web應用程序。該框架旨在簡化整個開發週期,從構建,部署,維護應用程序隨着時間的推移。 Apache的Struts2最初被稱爲WebWork2。\",\"keywords\":\"Struts2,Struts2教程,Struts2標籤,Struts2攔截器,Struts中文\"},\"content\":{\"extended\":\"$8e\"},\"state\":\"published\",\"views\":963,\"order\":0,\"_id\":\"59fd7e211e18b40005ab9e6a\",\"key\":\"index-25\",\"url\":\"index\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2教學\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:45:21.888Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:14.367Z\"}},{\"order\":2,\"_id\":\"5fcf8cefd5dd8e00183d72fc\",\"post\":{\"meta\":{\"description\":\"Struts2是基於MVC設計模式的流行和成熟的Web應用程序框架。 Struts2 並不只是 Struts 1 下一個版本,但它是一個完全重寫的Struts架構。 WebWork框架開始了與Struts框架爲基礎,其目標是建立在\",\"keywords\":\"Struts2,入門\"},\"content\":{\"extended\":\"$8f\"},\"state\":\"published\",\"views\":664,\"order\":2,\"_id\":\"59fd7e241e18b40005ab9e6b\",\"key\":\"struts2-quick-guide\",\"url\":\"struts2-quick-guide\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2快速入門\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:45:24.772Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:14.335Z\"}},{\"order\":3,\"_id\":\"5fcf8cefd5dd8e00183d72fd\",\"post\":{\"meta\":{\"description\":\"模型視圖控制器(ModelViewController)或MVC,MVC是俗稱,是一種軟件設計模式,用於開發Web應用程序。模型 - 視圖 - 控制器模式是由以下三個部分組成: Model- 模型是負責維護數據最低級別。\",\"keywords\":\"Struts2,基本,的,MVC,架構,模型,視圖,控制器,\"},\"content\":{\"extended\":\"\u003cp\u003e 模型視圖控制器(Model\u0026nbsp;View\u0026nbsp;Controller)或MVC,MVC是俗稱,是一種軟件設計模式,用於開發Web應用程序。模型 - 視圖 - 控制器模式是由以下三個部分組成:\u003c/p\u003e \\n\u003cul\u003e \\n \u003cli\u003e \u003cp\u003e Model\u0026nbsp;- 模型是負責維護數據最低級別。\u003c/p\u003e \u003c/li\u003e \\n \u003cli\u003e \u003cp\u003e View\u0026nbsp;- 這是負責向用戶顯示的全部或部分數據。\u003c/p\u003e \u003c/li\u003e \\n \u003cli\u003e \u003cp\u003e Controller\u0026nbsp;- 軟件代碼,控制模型和視圖之間的相互作用。\u003c/p\u003e \u003c/li\u003e \\n\u003c/ul\u003e \\n\u003cp\u003e MVC是受歡迎的,因爲它從用戶界面層,應用邏輯隔離,並支持關注點分離。在這裏,控制器接收所有請求的應用和模型準備視圖所需要的任何數據。查看,然後使用編制的數據由控制器生成最終像樣的迴應。 MVC抽象可以以圖形方式顯示如下。\u003c/p\u003e \\n\u003cimg alt=\\\"Struts MVC\\\" src=\\\"https://asset.1ju.org/cmsstatic/struts2-mvc-1.jpg\\\" title=\\\"Struts MVC\\\"\u003e \\n\u003ch2\u003e 模型\u003c/h2\u003e \\n\u003cp\u003e 該模型是負責管理應用程序的數據。它響應視圖的請求,也響應從控制器的指示進行自我更新。\u003c/p\u003e \\n\u003ch2\u003e 視圖\u003c/h2\u003e \\n\u003cp\u003e 在一個特定格式的數據,一個演示控制器的決定,顯示數據所引發的。他們是基於腳本的模板系統,如JSP,ASP,PHP,並且很容易整合AJAX技術。\u003c/p\u003e \\n\u003ch2\u003e 控制器\u003c/h2\u003e \\n\u003cp\u003e 該控制器負責響應用戶輸入和執行數據模型對象的相互作用。控制器接收輸入,驗證輸入,然後進行業務操作,修改數據模型的狀態。\u003c/p\u003e \\n\u003cp\u003e Struts2是一個基於MVC框架。在接下來的章節中,讓我們看看如何使用Struts2 的MVC方法內。\u003c/p\u003e \\n\u003cbr\u003e\"},\"state\":\"published\",\"views\":558,\"order\":3,\"_id\":\"59fd7e251e18b40005ab9e6c\",\"key\":\"basic-mvc-architecture\",\"url\":\"basic-mvc-architecture\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 MVC架構\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:45:25.117Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:14.222Z\"}},{\"order\":4,\"_id\":\"5fcf8cefd5dd8e00183d72fe\",\"post\":{\"meta\":{\"description\":\"Struts2是流行和成熟的基於MVC設計模式的Web應用程序框架。 Struts2不只是Struts1下一個版本,它是一個完全重寫的Struts架構。 WebWork框架開始以Struts框架爲基礎,其目標是提供一個加強和改\",\"keywords\":\"Struts2,是什麼,Struts2,是,流行,和,成熟,\"},\"content\":{\"extended\":\"$90\"},\"state\":\"published\",\"views\":590,\"order\":4,\"_id\":\"59fd7e251e18b40005ab9e6d\",\"key\":\"struts-overview\",\"url\":\"struts-overview\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 是什麼?\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:45:25.386Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:14.214Z\"}},{\"order\":5,\"_id\":\"5fcf8cefd5dd8e00183d72ff\",\"post\":{\"meta\":{\"description\":\"我們的首要任務是讓最低限度的Struts2應用程序運行。本章將指導您如何準備開發環境中開始使用Struts2。我假設你已經在機器上安裝JDK(5 +),Tomcat和Eclipse。如果還沒有安裝這些組件(\",\"keywords\":\"Struts2,環境,配置,我們,的,首要任務,是,讓,\"},\"content\":{\"extended\":\"$91\"},\"state\":\"published\",\"views\":710,\"order\":5,\"_id\":\"59fd7e261e18b40005ab9e6e\",\"key\":\"struts-environment-setup\",\"url\":\"struts-environment-setup\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 環境配置\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:45:26.239Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:14.201Z\"}},{\"order\":6,\"_id\":\"5fcf8cefd5dd8e00183d7300\",\"post\":{\"meta\":{\"description\":\"由高層次,Struts2是一個上拉型MVC(MVC2)框架。在Struts2的模型 - 視圖 - 控制器模式,實現以下五個核心部件: Actions Interceptors Value Stack / OGNL Results / Result types View technologies Struts 2 從傳統\",\"keywords\":\"Struts2,體系結構,由,高層次,Struts2,是,一\"},\"content\":{\"extended\":\"\u003cp\u003e 由高層次,Struts2是一個上拉型MVC(MVC2)框架。在Struts2的模型 - 視圖 - 控制器模式,實現以下五個核心部件:\u003c/p\u003e \\n\u003cul\u003e \\n \u003cli\u003e \u003cp\u003e Actions\u003c/p\u003e \u003c/li\u003e \\n \u003cli\u003e \u003cp\u003e Interceptors\u003c/p\u003e \u003c/li\u003e \\n \u003cli\u003e \u003cp\u003e Value Stack / OGNL\u003c/p\u003e \u003c/li\u003e \\n \u003cli\u003e \u003cp\u003e Results / Result types\u003c/p\u003e \u003c/li\u003e \\n \u003cli\u003e \u003cp\u003e View technologies\u003c/p\u003e \u003c/li\u003e \\n\u003c/ul\u003e \\n\u003cp\u003e Struts 2 從傳統的MVC框架操作需要的模型,而不是在控制器角色略有不同,雖然有一些重疊。\u003c/p\u003e \\n\u003cimg alt=\\\"Struts 2 Architecture\\\" src=\\\"https://asset.1ju.org/cmsstatic/struts2-2.gif\\\"\u003e \\n\u003cp\u003e 上面的圖描繪Struts2的高層體系結構模型,視圖和控制器。控制器實現一個Struts2的調度Servlet過濾器,以及攔截,模型是實施行動和結果類型和結果的組合視圖。值棧和OGNL提供的共同點,其他組件之間的連接和集成。\u003c/p\u003e \\n\u003cp\u003e 除了從上面的成分,會有很多的信息,涉及到配置。配置Web應用程序,以及配置的動作,攔截器,結果等。\u003c/p\u003e \\n\u003cp\u003e 這是MVC模式 Struts2的體系結構概述。我們將在後續章節中更詳細通過每個組件的介紹。\u003c/p\u003e \\n\u003ch2\u003e 請求的生命週期:\u003c/h2\u003e \\n\u003cp\u003e 根據上述雙字母組合,可以在Struts 2解釋用戶的請求生命週期,如下所示:\u003c/p\u003e \\n\u003cul\u003e \\n \u003cli\u003e \u003cp\u003e 用戶發送請求到服務器的某些資源的請求(即頁面)。\u003c/p\u003e \u003c/li\u003e \\n \u003cli\u003e \u003cp\u003e FilterDispatcher\u0026nbsp;查看請求,然後確定適當的動作。\u003c/p\u003e \u003c/li\u003e \\n \u003cli\u003e \u003cp\u003e 配置的攔截功能,適用於如驗證,文件上傳等。\u003c/p\u003e \u003c/li\u003e \\n \u003cli\u003e \u003cp\u003e 所選的動作會執行,以執行所請求的操作。\u003c/p\u003e \u003c/li\u003e \\n \u003cli\u003e \u003cp\u003e 同樣,配置的攔截器做任何後期處理,如果需要的話。\u003c/p\u003e \u003c/li\u003e \\n \u003cli\u003e \u003cp\u003e 最後其結果由視圖準備,並且將結果返回給用戶。\u003c/p\u003e \u003c/li\u003e \\n\u003c/ul\u003e \\n\u003cbr\u003e\"},\"state\":\"published\",\"views\":513,\"order\":6,\"_id\":\"59fd7e261e18b40005ab9e6f\",\"key\":\"struts-architecture\",\"url\":\"struts-architecture\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 體系結構\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:45:26.690Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:14.169Z\"}},{\"order\":7,\"_id\":\"5fcf8cefd5dd8e00183d7301\",\"post\":{\"meta\":{\"description\":\"前面我們已經學習了Struts2 的架構,當點擊一個超鏈接或提交一個HTML表單在Struts2 的 Web應用程序,輸入所收集被髮送到一個 Java 類稱爲操作控制器。當動作執行後,結果選擇了一個資源\",\"keywords\":\"Struts2,Hello,World,實例,前面,我們,已\"},\"content\":{\"extended\":\"$92\"},\"state\":\"published\",\"views\":506,\"order\":7,\"_id\":\"59fd7e271e18b40005ab9e70\",\"key\":\"struts-examples\",\"url\":\"struts-examples\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 Hello World 實例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:45:27.479Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:14.159Z\"}},{\"order\":8,\"_id\":\"5fcf8cefd5dd8e00183d7302\",\"post\":{\"meta\":{\"description\":\"本章將帶你通過一個Struts2應用程序所需的基本配置。在這裏,我們將看到在一些重要的配置文件,將配置文件:web.xml ,struts.xml,struts-config.xml和struts.properties 使用web.xml和struts.xml的配\",\"keywords\":\"Struts2,配置文件,本章,將,帶你,通過,一個,\"},\"content\":{\"extended\":\"$93\"},\"state\":\"published\",\"views\":733,\"order\":8,\"_id\":\"59fd7e271e18b40005ab9e71\",\"key\":\"struts-configuration\",\"url\":\"struts-configuration\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 配置文件\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:45:27.796Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:14.124Z\"}},{\"order\":9,\"_id\":\"5fcf8cefd5dd8e00183d7303\",\"post\":{\"meta\":{\"description\":\"動作是Struts2框架的核心,因爲他們的任何MVC(模型 - 視圖 - 控制器)框架。每個URL將被映射到一個特定的動作,它提供了來自用戶的請求提供服務所需的處理邏輯。 但動作也提供其他\",\"keywords\":\"Struts2,Action,動作,動作,是,Struts2\"},\"content\":{\"extended\":\"$94\"},\"state\":\"published\",\"views\":662,\"order\":9,\"_id\":\"59fd7e731e18b40005ab9e72\",\"key\":\"struts-actions\",\"url\":\"struts-actions\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 Action/動作\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:43.660Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:14.096Z\"}},{\"order\":10,\"_id\":\"5fcf8cefd5dd8e00183d7304\",\"post\":{\"meta\":{\"description\":\"攔截器的概念是Servlet過濾器或JDK代理類一樣的。攔截器允許橫切功能分開實現的動作,以及框架。使用攔截器,可以實現如下: 提供預處理行動之前被稱爲邏輯。 提供後處理邏輯動作\",\"keywords\":\"Struts2,攔截,器,攔截,器,的,概念,是,Servl\"},\"content\":{\"extended\":\"$95\"},\"state\":\"published\",\"views\":495,\"order\":10,\"_id\":\"59fd7e741e18b40005ab9e73\",\"key\":\"struts-interceptors\",\"url\":\"struts-interceptors\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 攔截器\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:44.316Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:14.026Z\"}},{\"order\":11,\"_id\":\"5fcf8cefd5dd8e00183d7305\",\"post\":{\"meta\":{\"description\":\"正如前面提到的,results標籤在Struts2的MVC框架的視圖中所扮演的角色。動作是負責執行業務邏輯。執行業務邏輯後,接下來的步驟是使用results標籤顯示的視圖。 經常有一些附帶導航規則\",\"keywords\":\"Struts2,結果,和,類型,正如,前面,提到,的,res\"},\"content\":{\"extended\":\"$96\"},\"state\":\"published\",\"views\":423,\"order\":11,\"_id\":\"59fd7e741e18b40005ab9e74\",\"key\":\"struts-result-types\",\"url\":\"struts-result-types\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 結果和結果類型\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:44.816Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.943Z\"}},{\"order\":12,\"_id\":\"5fcf8cefd5dd8e00183d7306\",\"post\":{\"meta\":{\"description\":\"值棧: 值棧是一個集合中的幾個對象保持下列對象提供的順序: SN 對象 Description 1 Temporary Objects There are various temporary objects which are created during execution of a page. For example the current iterat\",\"keywords\":\"Struts2,值棧,OGNL,值棧,是,一個,集合,中的,\"},\"content\":{\"extended\":\"$97\"},\"state\":\"published\",\"views\":514,\"order\":12,\"_id\":\"59fd7e751e18b40005ab9e75\",\"key\":\"struts-value-stack-ognl\",\"url\":\"struts-value-stack-ognl\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 值棧/OGNL\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:45.195Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.924Z\"}},{\"order\":13,\"_id\":\"5fcf8cefd5dd8e00183d7307\",\"post\":{\"meta\":{\"description\":\"Struts 2框架提供了內置支持處理文件上傳使用基於HTML表單的文件上傳。上傳一個文件時,它通常會被存儲在一個臨時目錄中,他們應該由Action類進行處理或移動到一個永久的目錄,以確\",\"keywords\":\"Struts2,文件,上傳,Struts,框架,提供,了,內\"},\"content\":{\"extended\":\"$98\"},\"state\":\"published\",\"views\":541,\"order\":13,\"_id\":\"59fd7e751e18b40005ab9e76\",\"key\":\"struts-file-uploads\",\"url\":\"struts-file-uploads\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 文件上傳\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:45.746Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.883Z\"}},{\"order\":14,\"_id\":\"5fcf8cefd5dd8e00183d7308\",\"post\":{\"meta\":{\"description\":\"本章將教如何使用Struts 2的簡單的步驟來訪問數據庫。 Struts是一個MVC框架,而不是一個數據庫框架,但它提供了極好的支持JPA/ Hibernate集成。我們將看看在的Hibernate集成在後面的章節,\",\"keywords\":\"Struts2,MySQL,數據庫,訪問,本章,將,教,如何\"},\"content\":{\"extended\":\"$99\"},\"state\":\"published\",\"views\":500,\"order\":14,\"_id\":\"59fd7e761e18b40005ab9e77\",\"key\":\"struts-database-access\",\"url\":\"struts-database-access\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 MySQL數據庫訪問\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:46.369Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.820Z\"}},{\"order\":15,\"_id\":\"5fcf8cefd5dd8e00183d7309\",\"post\":{\"meta\":{\"description\":\"本章將教你如何使用Struts2 的應用程序發送電子郵件。對於此練習中,需要下載並安裝將mail.jar 從 JavaMail API1.4.4,並將 mail.jar文件放置在WEB-INF\\\\lib文件夾,然後繼續遵循的標準步驟創建動\",\"keywords\":\"Struts2,發送,郵件,Email,本章,將,教你,如何\"},\"content\":{\"extended\":\"$9a\"},\"state\":\"published\",\"views\":573,\"order\":15,\"_id\":\"59fd7e761e18b40005ab9e78\",\"key\":\"struts-sending-email\",\"url\":\"struts-sending-email\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 發送郵件Email\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:46.918Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.759Z\"}},{\"order\":16,\"_id\":\"5fcf8cefd5dd8e00183d730a\",\"post\":{\"meta\":{\"description\":\"現在,我們將看看如何的Struts驗證框架。在Struts的核心有驗證框架,協助應用程序的運行規則來執行驗證執行之前的操作方法。 通常是使用 Javascript 來實現客戶端驗證。但不應單獨依賴\",\"keywords\":\"Struts2,驗證,框架,現在,我們將,看看,如何,的,\"},\"content\":{\"extended\":\"$9b\"},\"state\":\"published\",\"views\":509,\"order\":16,\"_id\":\"59fd7e771e18b40005ab9e79\",\"key\":\"struts-validations\",\"url\":\"struts-validations\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 驗證框架\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:47.554Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.704Z\"}},{\"order\":17,\"_id\":\"5fcf8cefd5dd8e00183d730b\",\"post\":{\"meta\":{\"description\":\"以下是的各類字段級和非字段級驗證在Struts2列表: date validator: field name = birthday field-validator type = date param name = min 01/01/1990 /param param name = max 01/01/2000 /param message Birthday must be within ${mi\",\"keywords\":\"Struts2,基於,XML,校驗,以下,是的,各類,字段,\"},\"content\":{\"extended\":\"$9c\"},\"state\":\"published\",\"views\":473,\"order\":17,\"_id\":\"59fd7e771e18b40005ab9e7a\",\"key\":\"xml-based-validators\",\"url\":\"xml-based-validators\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 基於XML校驗\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:47.822Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.649Z\"}},{\"order\":18,\"_id\":\"5fcf8cefd5dd8e00183d730c\",\"post\":{\"meta\":{\"description\":\"國際化(i18n)是規劃和實施的產品和服務,使他們能很容易地適應特定的本地語言和文化的過程中,這個過程被稱爲本地化。國際化的過程有時也被稱爲翻譯或本地化啓用。國際化是縮\",\"keywords\":\"Struts2,本地化,國際化,i18n,國際化,i18n,\"},\"content\":{\"extended\":\"$9d\"},\"state\":\"published\",\"views\":506,\"order\":18,\"_id\":\"59fd7e781e18b40005ab9e7b\",\"key\":\"struts-localization\",\"url\":\"struts-localization\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 本地化/國際化(i18n)\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:48.663Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.624Z\"}},{\"order\":19,\"_id\":\"5fcf8cefd5dd8e00183d730d\",\"post\":{\"meta\":{\"description\":\"在HTTP請求中的一切都被視爲一個String由協議。這包括數字,布爾值,整數,日期,小數和一切。每一件事情是一個字符串,將根據HTTP。然而,Struts類可以有任何數據類型的屬性。Stru\",\"keywords\":\"Struts2,類型,轉換,在,HTTP,請求,中的,一切,\"},\"content\":{\"extended\":\"$9e\"},\"state\":\"published\",\"views\":432,\"order\":19,\"_id\":\"59fd7e791e18b40005ab9e7c\",\"key\":\"struts-type-conversion\",\"url\":\"struts-type-conversion\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 類型轉換\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:49.248Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.560Z\"}},{\"order\":20,\"_id\":\"5fcf8cefd5dd8e00183d730e\",\"post\":{\"meta\":{\"description\":\"實際本章教程開始之前,讓我們看看由http://struts.apache.org給出的幾個定義: Term Description tag A small piece of code executed from within JSP, FreeMarker, or Velocity. template A bit of code, usually written in Fre\",\"keywords\":\"Struts2,主題,和,模板,實際,本章,教程,開始,\"},\"content\":{\"extended\":\"$9f\"},\"state\":\"published\",\"views\":570,\"order\":20,\"_id\":\"59fd7e791e18b40005ab9e7d\",\"key\":\"struts-themes-templates\",\"url\":\"struts-themes-templates\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 主題和模板\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:49.820Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.528Z\"}},{\"order\":21,\"_id\":\"5fcf8cefd5dd8e00183d730f\",\"post\":{\"meta\":{\"description\":\"Struts提供了一個更簡單的方式來處理未捕獲的異常,並將用戶重定向到一個專門的錯誤頁面。您可以輕鬆地Struts配置到不同的異常有不同的錯誤頁面。 Struts的異常處理所使用的exceptio\",\"keywords\":\"Struts2,異常,處理,Struts,提供,了,一個,更\"},\"content\":{\"extended\":\"$a0\"},\"state\":\"published\",\"views\":410,\"order\":21,\"_id\":\"59fd7e7a1e18b40005ab9e7e\",\"key\":\"struts-exception-handling\",\"url\":\"struts-exception-handling\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 異常處理\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:50.527Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.492Z\"}},{\"order\":22,\"_id\":\"5fcf8cefd5dd8e00183d7310\",\"post\":{\"meta\":{\"description\":\"正如前面提到的,Struts提供了兩種形式的配置。傳統的方式是使用對所有配置struts.xml文件。到目前爲止,我們已經看到了這樣的例子很多。 Struts配置的另一種方法是使用Java5註釋功能。\",\"keywords\":\"Struts2,註釋,正如,前面,提到,的,Struts,提\"},\"content\":{\"extended\":\"$a1\"},\"state\":\"published\",\"views\":494,\"order\":22,\"_id\":\"59fd7e7b1e18b40005ab9e7f\",\"key\":\"struts-annotations\",\"url\":\"struts-annotations\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 註釋\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:51.166Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.459Z\"}},{\"order\":23,\"_id\":\"5fcf8cefd5dd8e00183d7311\",\"post\":{\"meta\":{\"description\":\"Struts 2 應用程序可以使用Java5註釋作爲替代XML和Java屬性配置。這裏是清單的不同的類別有關的最重要的註解: 命名空間註釋(動作註釋): @ Namespace註釋允許在Action類中,而不是基於零\",\"keywords\":\"Struts2,註釋,類型,Struts,應用程序,可以,使\"},\"content\":{\"extended\":\"$a2\"},\"state\":\"published\",\"views\":453,\"order\":23,\"_id\":\"59fd7e7b1e18b40005ab9e80\",\"key\":\"struts-annotations-types\",\"url\":\"struts-annotations-types\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 註釋類型\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:51.439Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.422Z\"}},{\"order\":24,\"_id\":\"5fcf8cefd5dd8e00183d7312\",\"post\":{\"meta\":{\"description\":\"Struts 2 的標籤有一組標籤,更容易控制流程頁面執行。以下是重要的Struts2控制標籤列表: if /else 標籤: 這些標籤執行可在每一種語言找到的一種基本條件流程。 If標籤可用於本身或與\",\"keywords\":\"Struts2,控件,標籤,Struts,的,標,簽有,一組\"},\"content\":{\"extended\":\"$a3\"},\"state\":\"published\",\"views\":472,\"order\":24,\"_id\":\"59fd7e7b1e18b40005ab9e81\",\"key\":\"struts-control-tags\",\"url\":\"struts-control-tags\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 控件標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:51.746Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.349Z\"}},{\"order\":25,\"_id\":\"5fcf8cefd5dd8e00183d7313\",\"post\":{\"meta\":{\"description\":\"創建動作類: 首先,讓我們創建一個簡單的類叫做Employee.java,它看起來像: package com . tutorialspoint . struts2 ; import java . util . ArrayList ; import java . util . List ; import org . apache . struts2 . util\",\"keywords\":\"Struts2,iterator,標籤,創建,動作類,首先,\"},\"content\":{\"extended\":\"$a4\"},\"state\":\"published\",\"views\":803,\"order\":25,\"_id\":\"59fd7e7c1e18b40005ab9e82\",\"key\":\"struts-iterator-tags\",\"url\":\"struts-iterator-tags\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 iterator標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:52.242Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.329Z\"}},{\"order\":26,\"_id\":\"5fcf8cefd5dd8e00183d7314\",\"post\":{\"meta\":{\"description\":\"創建動作類: package com . tutorialspoint . struts2 ; public class HelloWorldAction { private String name ; public String execute () throws Exception { return success ; } public String getName () { return name ; } public void setName\",\"keywords\":\"Struts2,else,標籤,創建,動作類,package\"},\"content\":{\"extended\":\"$a5\"},\"state\":\"published\",\"views\":611,\"order\":26,\"_id\":\"59fd7e7c1e18b40005ab9e83\",\"key\":\"struts-if-else-tags\",\"url\":\"struts-if-else-tags\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 if/else標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:52.755Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.258Z\"}},{\"order\":27,\"_id\":\"5fcf8cefd5dd8e00183d7315\",\"post\":{\"meta\":{\"description\":\"如果有兩個列表A和B的值,A1,A2和B1,B2。合併列表,會給出A1,B1,A2,B2。 創建動作類: 首先,讓我們創建一個簡單的類叫做Employee.java,它看起來像: package com . tutorialspoint . struts2\",\"keywords\":\"Struts2,merge,標籤,如果,有,兩個,列表,和,\"},\"content\":{\"extended\":\"$a6\"},\"state\":\"published\",\"views\":445,\"order\":27,\"_id\":\"59fd7e7d1e18b40005ab9e84\",\"key\":\"struts-merge-tag\",\"url\":\"struts-merge-tag\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 merge標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:53.169Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.229Z\"}},{\"order\":28,\"_id\":\"5fcf8cefd5dd8e00183d7316\",\"post\":{\"meta\":{\"description\":\"說,如果有兩個列表A和B的值A1,A2和B1,B2。合併列表,會給你的A1,A2,B1,B2,而append 名單,會有A1,A2,B1,B2。 創建動作類: 首先,讓我們創建一個簡單的類叫做Employee.java,它看起\",\"keywords\":\"Struts2,append,標籤,說,如果,有,兩個,列表\"},\"content\":{\"extended\":\"$a7\"},\"state\":\"published\",\"views\":552,\"order\":28,\"_id\":\"59fd7e7d1e18b40005ab9e85\",\"key\":\"struts-append-tag\",\"url\":\"struts-append-tag\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 append標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:53.565Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:13.158Z\"}},{\"order\":29,\"_id\":\"5fcf8cefd5dd8e00183d7317\",\"post\":{\"meta\":{\"description\":\"我們經常遇到的一些情況,必須創建列表或數組上遍歷列表。可以創建列表或數組使用scriptlet或者可以使用generator標籤。tag. 創建action類: package com . tutorialspoint . struts2 ; public class Hel\",\"keywords\":\"Struts2,generator,標籤,我們,經常,遇到,\"},\"content\":{\"extended\":\"$a8\"},\"state\":\"published\",\"views\":510,\"order\":29,\"_id\":\"59fd7e7d1e18b40005ab9e86\",\"key\":\"struts-generator-tag\",\"url\":\"struts-generator-tag\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 generator標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:53.944Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.782Z\"}},{\"order\":30,\"_id\":\"5fcf8cefd5dd8e00183d7318\",\"post\":{\"meta\":{\"description\":\"Struts 2 的數據標籤主要用於操作頁面上顯示的數據。下面列出的是重要的數據標籤: action標籤: 此標記使開發人員能夠直接從JSP頁面調用動作指定動作的名稱和一個可選的命名空間。\",\"keywords\":\"Struts2,數據,標籤,Struts,的,數據,標籤,主\"},\"content\":{\"extended\":\"$a9\"},\"state\":\"published\",\"views\":421,\"order\":30,\"_id\":\"59fd7e7e1e18b40005ab9e87\",\"key\":\"struts-data-tags\",\"url\":\"struts-data-tags\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 數據標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:54.214Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.762Z\"}},{\"order\":31,\"_id\":\"5fcf8cefd5dd8e00183d7319\",\"post\":{\"meta\":{\"description\":\"action標記允許程序員從視圖頁面執行動作。他們可以做到這一點通過指定的動作名稱。他們可以設置的executeResult參數設置爲true,在視圖中直接呈現結果。或者他們可以將此參數設置爲\",\"keywords\":\"Struts2,action,標籤,action,標記,允許\"},\"content\":{\"extended\":\"$aa\"},\"state\":\"published\",\"views\":551,\"order\":31,\"_id\":\"59fd7e7e1e18b40005ab9e88\",\"key\":\"struts-action-tag\",\"url\":\"struts-action-tag\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 action標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:54.755Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.734Z\"}},{\"order\":32,\"_id\":\"5fcf8cefd5dd8e00183d731a\",\"post\":{\"meta\":{\"description\":\"Struts 的include標籤和JSP include標記非常相似,它很少使用。我們已經看到了如何將一個Struts動作到一個jsp使用s:action標籤的輸出。 s:include標籤略有不同。它可以進入一個jsp輸出包括一個\",\"keywords\":\"Struts2,include,標籤,Struts,的,in\"},\"content\":{\"extended\":\"$ab\"},\"state\":\"published\",\"views\":434,\"order\":32,\"_id\":\"59fd7e7f1e18b40005ab9e89\",\"key\":\"struts-include-tag\",\"url\":\"struts-include-tag\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 include標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:55.145Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.681Z\"}},{\"order\":33,\"_id\":\"5fcf8cefd5dd8e00183d731b\",\"post\":{\"meta\":{\"description\":\"bean標籤的設置和push標籤的組合,它可以創建一個新的對象實例,然後設置變量的值。然後,它的bean可以在值棧,因此,它可用於在JSP頁面。 bean標籤需要一個Java Bean來工作。所以,標\",\"keywords\":\"Struts2,bean,標籤,bean,標籤,的,設置,和\"},\"content\":{\"extended\":\"$ac\"},\"state\":\"published\",\"views\":512,\"order\":33,\"_id\":\"59fd7e7f1e18b40005ab9e8a\",\"key\":\"struts-bean-tag\",\"url\":\"struts-bean-tag\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 bean 標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:55.555Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.659Z\"}},{\"order\":34,\"_id\":\"5fcf8cefd5dd8e00183d731c\",\"post\":{\"meta\":{\"description\":\"date標籤允許在一個快速和容易的方式格式化日期。用戶可以指定自定義的格式(如DD/ MM / YYYY HH:MM),可以產生容易可讀的符號(如2小時,14分鐘),或預定義的格式就可以求助於鍵\",\"keywords\":\"Struts2,date,標籤,date,標籤,允許,在,一\"},\"content\":{\"extended\":\"$ad\"},\"state\":\"published\",\"views\":490,\"order\":34,\"_id\":\"59fd7e7f1e18b40005ab9e8b\",\"key\":\"struts-date-tag\",\"url\":\"struts-date-tag\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 date 標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:55.987Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.614Z\"}},{\"order\":35,\"_id\":\"5fcf8cefd5dd8e00183d731d\",\"post\":{\"meta\":{\"description\":\"param標籤可用於參數其他標籤。包括標籤和bean標籤,這種標籤的例子。讓我們以同樣的例子我們已經討論,同時討論bean標籤。 創建動作類: package com . tutorialspoint . struts2 ; public class\",\"keywords\":\"Struts2,param,標籤,param,標籤,可,用於\"},\"content\":{\"extended\":\"$ae\"},\"state\":\"published\",\"views\":456,\"order\":35,\"_id\":\"59fd7e801e18b40005ab9e8c\",\"key\":\"struts-param-tag\",\"url\":\"struts-param-tag\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 param 標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:56.368Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.594Z\"}},{\"order\":36,\"_id\":\"5fcf8cefd5dd8e00183d731e\",\"post\":{\"meta\":{\"description\":\"property標籤是用來獲取屬性的值,這將默認堆棧的頂部,如果沒有指定。這個例子顯示了三個簡單的數據標記 - 即set,push和property的用法。 創建動作類: 對於這個練習,讓我們重用的例\",\"keywords\":\"Struts2,property,標籤,property,標\"},\"content\":{\"extended\":\"$af\"},\"state\":\"published\",\"views\":552,\"order\":36,\"_id\":\"59fd7e801e18b40005ab9e8d\",\"key\":\"struts-property-tag\",\"url\":\"struts-property-tag\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 property 標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:56.793Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.570Z\"}},{\"order\":37,\"_id\":\"5fcf8cefd5dd8e00183d731f\",\"post\":{\"meta\":{\"description\":\"property標籤是用來獲取屬性的值,這將默認堆棧的頂部,如果沒有指定。這個例子顯示了三個簡單的數據標記 - 即set,push和property的用法。 創建動作類: 對於這個練習,讓我們重用的例\",\"keywords\":\"Struts2,set,標籤,property,標籤,是,用\"},\"content\":{\"extended\":\"$b0\"},\"state\":\"published\",\"views\":475,\"order\":37,\"_id\":\"59fd7e811e18b40005ab9e8e\",\"key\":\"struts-set-tag\",\"url\":\"struts-set-tag\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 set 標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:57.186Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.522Z\"}},{\"order\":38,\"_id\":\"5fcf8cefd5dd8e00183d7320\",\"post\":{\"meta\":{\"description\":\"text 標籤是一個通用的標記,用來渲染一個i18n的文本消息。按照三個步驟: 該消息必須在一個資源包,它與作爲動作具有相同的名稱。在實踐中,這意味着,應該爲類具有相同名稱的\",\"keywords\":\"Struts2,text,標籤,text,標籤,是,一個,通\"},\"content\":{\"extended\":\"$b1\"},\"state\":\"published\",\"views\":608,\"order\":38,\"_id\":\"59fd7e811e18b40005ab9e8f\",\"key\":\"struts-text-tag\",\"url\":\"struts-text-tag\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 text 標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:57.573Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.495Z\"}},{\"order\":39,\"_id\":\"5fcf8cefd5dd8e00183d7321\",\"post\":{\"meta\":{\"description\":\"URL標籤是負責生成URL字符串。這樣做的好處是,你可以提供參數標籤。我們通過一個例子來說明使用的URL標籤。 創建動作類: package com . tutorialspoint . struts2 ; public class HelloWorldAction {\",\"keywords\":\"Struts2,url,標籤,URL,標籤,是,負責,生成,\"},\"content\":{\"extended\":\"$b2\"},\"state\":\"published\",\"views\":442,\"order\":39,\"_id\":\"59fd7e811e18b40005ab9e90\",\"key\":\"struts-url-tag\",\"url\":\"struts-url-tag\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 url標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:57.972Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.473Z\"}},{\"order\":40,\"_id\":\"5fcf8cefd5dd8e00183d7322\",\"post\":{\"meta\":{\"description\":\"form 標籤的列表是Struts的UI標籤的一個子集。這些標籤可以幫助渲染中需要Struts Web應用程序和用戶界面可以分爲三類。本章將帶你通過所有三種類型的UI標籤: 簡單UI標籤: 我們已經使\",\"keywords\":\"Struts2,表單,標籤,form,標籤,的,列表,是,S\"},\"content\":{\"extended\":\"$b3\"},\"state\":\"published\",\"views\":469,\"order\":40,\"_id\":\"59fd7e821e18b40005ab9e91\",\"key\":\"struts-form-tags\",\"url\":\"struts-form-tags\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 表單標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:58.679Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.452Z\"}},{\"order\":41,\"_id\":\"5fcf8cefd5dd8e00183d7323\",\"post\":{\"meta\":{\"description\":\"Struts使用Dojo框架的 AJAX 標記實現。首先,這個例子中,你需要添加 struts2-dojo-plugin-2.2.3.jar。你可以得到這個文件的lib文件夾struts2的下載(C:\\\\struts-2.2.3-all\\\\struts-2.2.3\\\\lib\\\\struts2-dojo-plugin-2.2\",\"keywords\":\"Struts2,Ajax,標籤,Struts,使用,Dojo\"},\"content\":{\"extended\":\"$b4\"},\"state\":\"published\",\"views\":516,\"order\":41,\"_id\":\"59fd7e831e18b40005ab9e92\",\"key\":\"struts-ajax-tags\",\"url\":\"struts-ajax-tags\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 Ajax 標籤\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:59.098Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.402Z\"}},{\"order\":42,\"_id\":\"5fcf8cefd5dd8e00183d7324\",\"post\":{\"meta\":{\"description\":\"Spring是一個流行的Web框架,它提供易於集成與很多常見的網絡任務。所以,問題是,爲什麼我們需要Spring,當我們有Struts2?Spring是超過一個MVC框架 - 它提供了許多其它好用的東西,這是\",\"keywords\":\"Struts2,和,Spring,集成,Spring,是,一\"},\"content\":{\"extended\":\"$b5\"},\"state\":\"published\",\"views\":574,\"order\":42,\"_id\":\"59fd7e831e18b40005ab9e93\",\"key\":\"struts-spring\",\"url\":\"struts-spring\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2和Spring集成\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:46:59.757Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.387Z\"}},{\"order\":43,\"_id\":\"5fcf8cefd5dd8e00183d7325\",\"post\":{\"meta\":{\"description\":\"在本章中,讓我們通過Struts2的集成Tiles框架所涉及的步驟。 Apache的Tiles是一個內置的模板框架來簡化Web應用程序用戶界面的開發。 首先,我們需要從 Apache Tiles 網站下載的files jar文件。\",\"keywords\":\"Struts2,和,Tiles,集成,在,本章,中,讓,我們\"},\"content\":{\"extended\":\"$b6\"},\"state\":\"published\",\"views\":493,\"order\":43,\"_id\":\"59fd7e841e18b40005ab9e94\",\"key\":\"struts-tiles\",\"url\":\"struts-tiles\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2和Tiles集成\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:00.236Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.360Z\"}},{\"order\":44,\"_id\":\"5fcf8cefd5dd8e00183d7326\",\"post\":{\"meta\":{\"description\":\"Hibernate是一個高性能的對象/關係持久性和查詢服務許可下的開源GNU通用公共許可證(LGPL),並免費下載。在這一章中,我們要學習如何實現Struts2與Hibernate集成。如果你不熟悉與Hibern\",\"keywords\":\"Struts2,和,Hibernate,集成,Hiberna\"},\"content\":{\"extended\":\"$b7\"},\"state\":\"published\",\"views\":484,\"order\":44,\"_id\":\"59fd7e841e18b40005ab9e95\",\"key\":\"struts-hibernate\",\"url\":\"struts-hibernate\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2和Hibernate集成\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:00.737Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.303Z\"}},{\"order\":45,\"_id\":\"5fcf8cefd5dd8e00183d7327\",\"post\":{\"meta\":{\"description\":\"在這個例子中,我們將學習如何在Struts 2中創建一個Hello World例子。 使用以下庫或工具: MyEclipse 10 Struts 2.1 1. 創建一個Web項目工程 啓動打開 MyEclipse,創建一個Web工程名稱爲:struts2-xm\",\"keywords\":\"Struts2,hello world,XML\"},\"content\":{\"extended\":\"$b8\"},\"state\":\"published\",\"views\":797,\"order\":45,\"_id\":\"59fd7e851e18b40005ab9e96\",\"key\":\"struts-2-hello-world-example\",\"url\":\"struts-2-hello-world-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts 2 hello world (XML版本)\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:01.902Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.225Z\"}},{\"order\":46,\"_id\":\"5fcf8cefd5dd8e00183d7328\",\"post\":{\"meta\":{\"description\":\"在這個教程,我們重複使用以前 STRUST2 HelloWorld(XML版本)的例子,並將其轉換成註解版本。 Struts2註解概念 Struts2註解是由Struts2的約定插件的支持,所以,必須要了解其背後的「掃描方\",\"keywords\":\"Struts2,註解,示例\"},\"content\":{\"extended\":\"$b9\"},\"state\":\"published\",\"views\":546,\"order\":46,\"_id\":\"59fd7e861e18b40005ab9e97\",\"key\":\"struts-2-hello-world-annotation-example\",\"url\":\"struts-2-hello-world-annotation-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2註解示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:02.626Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.212Z\"}},{\"order\":47,\"_id\":\"5fcf8cefd5dd8e00183d7329\",\"post\":{\"meta\":{\"description\":\"在Struts 2中,@ResultPath 註解用於控制Struts2找到存儲的結果或JSP頁面。默認情況下,它會找到結果頁在「WEB-INF/content/」 文件夾。 不知道爲什麼在Struts2註解設置 「WEB-INF/content/」 作爲默認\",\"keywords\":\"Struts2,ResultPath,註釋,示例\"},\"content\":{\"extended\":\"$ba\"},\"state\":\"published\",\"views\":478,\"order\":47,\"_id\":\"59fd7e861e18b40005ab9e98\",\"key\":\"struts-2-resultpath-annotation-example\",\"url\":\"struts-2-resultpath-annotation-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 @ResultPath註釋示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:02.894Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.199Z\"}},{\"order\":48,\"_id\":\"5fcf8cefd5dd8e00183d732a\",\"post\":{\"meta\":{\"description\":\"Struts2自帶有「包含文件」功能,包含多個Struts配置文件合併爲一個單元。 單個Struts配置文件 讓我們來看看一個糟糕的 Struts2 配置示例。 struts.xml ?xml version=\",\"keywords\":\"Struts2,include,包含,配置文件\"},\"content\":{\"extended\":\"$bb\"},\"state\":\"published\",\"views\":523,\"order\":48,\"_id\":\"59fd7e871e18b40005ab9e99\",\"key\":\"struts-2-include-multiple-struts-configuration-files\",\"url\":\"struts-2-include-multiple-struts-configuration-files\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 include(包含)多個配置文件\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:03.345Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.191Z\"}},{\"order\":49,\"_id\":\"5fcf8cefd5dd8e00183d732b\",\"post\":{\"meta\":{\"description\":\"Struts2的命名空間是一個新的概念,用來處理多個模塊。由下式給出一個命名空間的每個模塊。此外,它還可以用來避免位於不同的模塊相同的操作名稱之間的衝突。 下載代碼 – Strut\",\"keywords\":\"Struts2,命名空間,配置,解釋\"},\"content\":{\"extended\":\"$bc\"},\"state\":\"published\",\"views\":520,\"order\":49,\"_id\":\"59fd7e871e18b40005ab9e9a\",\"key\":\"struts-2-namespace-configuration-example-and-explanation\",\"url\":\"struts-2-namespace-configuration-example-and-explanation\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2命名空間配置和解釋\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:03.943Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.183Z\"}},{\"order\":50,\"_id\":\"5fcf8cefd5dd8e00183d732c\",\"post\":{\"meta\":{\"description\":\"在Struts2開發中,這應該是第一個學習配置的值。爲了啓用 Struts2 的開發模式,可以通過自動配置顯著增加Struts2的開發速度和屬性文件加載,以及額外的日誌和調試功能。 自動重新加載\",\"keywords\":\"Struts2,開發者模式\"},\"content\":{\"extended\":\"$bd\"},\"state\":\"published\",\"views\":560,\"order\":50,\"_id\":\"59fd7e881e18b40005ab9e9b\",\"key\":\"struts-2-development-mode-example\",\"url\":\"struts-2-development-mode-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2開發者模式\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:04.210Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.172Z\"}},{\"order\":51,\"_id\":\"5fcf8cefd5dd8e00183d732d\",\"post\":{\"content\":{\"extended\":\"$be\"},\"state\":\"published\",\"views\":490,\"order\":51,\"_id\":\"5f75eb2f4607db0007804f31\",\"title\":\"如何刪除Struts2動作的後綴擴展名\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2020-10-01T14:43:59.553Z\",\"section\":\"59fd7e211e18b40005ab9e69\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"url\":\"how-to-remove-the-action-suffix-extension-in-struts-2\",\"key\":\"how-to-remove-the-action-suffix-extension-in-struts-2\",\"createdAt\":\"2020-10-01T14:43:59.557Z\",\"updatedAt\":\"2020-10-13T08:25:58.089Z\",\"__v\":0}},{\"order\":52,\"_id\":\"5fcf8cefd5dd8e00183d732e\",\"post\":{\"meta\":{\"description\":\"在Struts2中,會花大部分的時間用在用動作來處理工作。動作類包含業務邏輯,獲取資源包,保存數據,驗證,並選擇應發回給用戶的視圖的結果頁面。這是Struts2的核心,所以必須要了\",\"keywords\":\"Struts2,動作\"},\"content\":{\"extended\":\"$bf\"},\"state\":\"published\",\"views\":389,\"order\":52,\"_id\":\"59fd7e881e18b40005ab9e9c\",\"key\":\"working-with-struts-2-actions\",\"url\":\"working-with-struts-2-actions\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"使用Struts2動作\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:04.778Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.164Z\"}},{\"order\":53,\"_id\":\"5fcf8cefd5dd8e00183d732f\",\"post\":{\"meta\":{\"description\":\"本教程顯示使用Struts2的 ActionError 和 ActionMessage 類。 源代碼下載 – Struts2-ActionError-ActionMessage-Example.zip 1.ActionError–是用來發送錯誤信息反饋給用戶- 通過s:actionerror/來顯示。 s:if test=\",\"keywords\":\"Struts2,ActionError,ActionMessage,示例\"},\"content\":{\"extended\":\"$c0\"},\"state\":\"published\",\"views\":515,\"order\":53,\"_id\":\"59fd7e891e18b40005ab9e9d\",\"key\":\"struts-2-actionerror-actionmessage-example\",\"url\":\"struts-2-actionerror-actionmessage-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2的ActionError&ActionMessage示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:05.676Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.154Z\"}},{\"order\":54,\"_id\":\"5fcf8cefd5dd8e00183d7330\",\"post\":{\"meta\":{\"description\":\"這裏我們創建一個web工程爲:struts2-modeldrive ,用於講解演示這一章內容的學習。 如果一個動作實現了「模型驅動」接口,它就獲得了表單數據自動傳輸到對象的額外能力。請參見下面\",\"keywords\":\"Struts2,模型驅動,實例\"},\"content\":{\"extended\":\"$c1\"},\"state\":\"published\",\"views\":481,\"order\":54,\"_id\":\"59fd7e8a1e18b40005ab9e9e\",\"key\":\"struts-2-modeldriven-example\",\"url\":\"struts-2-modeldriven-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2模型驅動實例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:06.508Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.143Z\"}},{\"order\":55,\"_id\":\"5fcf8cefd5dd8e00183d7331\",\"post\":{\"content\":{\"extended\":\"$c2\"},\"state\":\"published\",\"views\":422,\"order\":55,\"_id\":\"5f75eb2f4607db0007804f32\",\"title\":\"Struts2映射攔截動作\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2020-10-01T14:43:59.571Z\",\"section\":\"59fd7e211e18b40005ab9e69\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"url\":\"struts-2-mapping-interceptors-to-action\",\"key\":\"struts-2-mapping-interceptors-to-action\",\"createdAt\":\"2020-10-01T14:43:59.574Z\",\"updatedAt\":\"2020-10-13T08:25:58.083Z\",\"__v\":0}},{\"order\":56,\"_id\":\"5fcf8cefd5dd8e00183d7332\",\"post\":{\"content\":{\"extended\":\"$c3\"},\"state\":\"published\",\"views\":414,\"order\":56,\"_id\":\"5f75eb2f4607db0007804f33\",\"title\":\"Struts2重寫攔截器參數\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2020-10-01T14:43:59.596Z\",\"section\":\"59fd7e211e18b40005ab9e69\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"url\":\"struts-2-override-the-interceptor-parameters\",\"key\":\"struts-2-override-the-interceptor-parameters\",\"createdAt\":\"2020-10-01T14:43:59.599Z\",\"updatedAt\":\"2020-10-13T08:25:58.075Z\",\"__v\":0}},{\"order\":57,\"_id\":\"5fcf8cefd5dd8e00183d7333\",\"post\":{\"content\":{\"extended\":\"$c4\"},\"state\":\"published\",\"views\":431,\"order\":57,\"_id\":\"5f75eb2f4607db0007804f34\",\"title\":\"Struts2攔截器棧的例子\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2020-10-01T14:43:59.615Z\",\"section\":\"59fd7e211e18b40005ab9e69\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"url\":\"struts-2-interceptor-stack-example\",\"key\":\"struts-2-interceptor-stack-example\",\"createdAt\":\"2020-10-01T14:43:59.618Z\",\"updatedAt\":\"2020-10-13T08:25:58.064Z\",\"__v\":0}},{\"order\":58,\"_id\":\"5fcf8cefd5dd8e00183d7334\",\"post\":{\"meta\":{\"description\":\"在Struts2中附帶一個名爲「execAndWait」一個非常有趣的「執行和等待」攔截器,這是一個非常方便的攔截器長時間運行操作在後臺,顯示用戶的自定義的等待頁面。在本教程中,它顯示了\",\"keywords\":\"Struts2,execAndWait,攔截器,例子\"},\"content\":{\"extended\":\"$c5\"},\"state\":\"published\",\"views\":403,\"order\":58,\"_id\":\"59fd7e8b1e18b40005ab9e9f\",\"key\":\"struts-2-execandwait-interceptor-example\",\"url\":\"struts-2-execandwait-interceptor-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 execAndWait攔截器例子\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:07.868Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.133Z\"}},{\"order\":59,\"_id\":\"5fcf8cefd5dd8e00183d7335\",\"post\":{\"meta\":{\"description\":\"爲了比較直觀的學習,這裏創建一個web工程爲:struts2textfield。 在Struts2中,s:textfield文本範例,例如,可以聲明「s:textfield」鍵屬性或標籤和名稱屬性。 s:textfield key=\",\"keywords\":\"Struts2,textfield,文本,示例,爲了,比較,直觀,的,\"},\"content\":{\"extended\":\"$c6\"},\"state\":\"published\",\"views\":717,\"order\":59,\"_id\":\"59fd7e8c1e18b40005ab9ea0\",\"key\":\"struts-2-stextfield-textbox-example\",\"url\":\"struts-2-stextfield-textbox-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:textfield\u003e文本示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:08.581Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.104Z\"}},{\"order\":60,\"_id\":\"5fcf8cefd5dd8e00183d7336\",\"post\":{\"meta\":{\"description\":\"在這一章節中,我們創建一個Web工程爲: struts2passwd,演示 s:password的使用。 在Struts2中,可以使用s:password來創建HTML密碼字段。例如,可以聲明「s:password」鍵屬性或者標籤和名稱屬性。\",\"keywords\":\"Struts2,password,密碼,示例\"},\"content\":{\"extended\":\"$c7\"},\"state\":\"published\",\"views\":473,\"order\":60,\"_id\":\"59fd7e8d1e18b40005ab9ea1\",\"key\":\"struts-2-spassword-password-example\",\"url\":\"struts-2-spassword-password-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:password\u003e密碼示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:09.158Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.095Z\"}},{\"order\":61,\"_id\":\"5fcf8cefd5dd8e00183d7337\",\"post\":{\"meta\":{\"description\":\"在這一章節中,我們創建一個Web工程爲:struts2hidden,演示s:hidden的使用。完整的工程目錄結構如下: 在Struts2中可以使用s:hidden標籤來創建一個HTML隱藏字段。 s:hidden name=\",\"keywords\":\"Struts2,hidden,隱藏值,例子\"},\"content\":{\"extended\":\"$c8\"},\"state\":\"published\",\"views\":653,\"order\":61,\"_id\":\"59fd7e8d1e18b40005ab9ea2\",\"key\":\"struts-2-shidden-hidden-value-example\",\"url\":\"struts-2-shidden-hidden-value-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:hidden\u003e隱藏值例子\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:09.882Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.085Z\"}},{\"order\":62,\"_id\":\"5fcf8cefd5dd8e00183d7338\",\"post\":{\"content\":{\"extended\":\"$c9\"},\"state\":\"published\",\"views\":455,\"order\":62,\"_id\":\"5f75eb314607db0007804f35\",\"title\":\"Struts2 \u003cs:textarea\u003e文本域實例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2020-10-01T14:44:01.432Z\",\"section\":\"59fd7e211e18b40005ab9e69\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"url\":\"struts-2-stextarea-textarea-example\",\"key\":\"struts-2-stextarea-textarea-example\",\"createdAt\":\"2020-10-01T14:44:01.436Z\",\"updatedAt\":\"2020-10-13T08:25:58.055Z\",\"__v\":0}},{\"order\":63,\"_id\":\"5fcf8cefd5dd8e00183d7339\",\"post\":{\"meta\":{\"description\":\"在Struts2,可以使用s:radio標籤來創建一個HTML單選按鈕。有很多方法來填充數據到單選按鈕,可以通過List, OGNL 或 Object。請檢看下面的例子就知道了。 Struts2 s:radio 示例 舉個例子來說明如\",\"keywords\":\"Struts2,radio,單選按鈕,例子\"},\"content\":{\"extended\":\"$ca\"},\"state\":\"published\",\"views\":525,\"order\":63,\"_id\":\"59fd7e8e1e18b40005ab9ea3\",\"key\":\"struts-2-sradio-radio-button-example\",\"url\":\"struts-2-sradio-radio-button-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:radio\u003e單選按鈕例子\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:10.878Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.076Z\"}},{\"order\":64,\"_id\":\"5fcf8cefd5dd8e00183d733a\",\"post\":{\"meta\":{\"description\":\"下面是幾個Struts2的例子來說明如何通過List, OGNL 和對象生成一個單選按鈕默認值(預先選擇)。 1. 列表 - List 在Java代碼中創建一個列表返回單選按鈕的值。 //...ListString genders = new Arra\",\"keywords\":\"Struts2,單選,預選,按鈕值\"},\"content\":{\"extended\":\"$cb\"},\"state\":\"published\",\"views\":561,\"order\":64,\"_id\":\"59fd7e8f1e18b40005ab9ea4\",\"key\":\"how-to-preselect-a-radio-button-value-in-struts-2\",\"url\":\"how-to-preselect-a-radio-button-value-in-struts-2\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2單選預選按鈕值\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:11.151Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.066Z\"}},{\"order\":65,\"_id\":\"5fcf8cefd5dd8e00183d733b\",\"post\":{\"meta\":{\"description\":\"在Struts2,可以使用s:checkbox標籤來創建一個HTML複選框。fieldValue=」true」是將要提交的複選框的實際值。 s:checkbox name=\",\"keywords\":\"Struts2,checkbox,複選框,例子\"},\"content\":{\"extended\":\"$cc\"},\"state\":\"published\",\"views\":724,\"order\":65,\"_id\":\"59fd7e901e18b40005ab9ea5\",\"key\":\"struts-2-scheckbox-checkbox-example\",\"url\":\"struts-2-scheckbox-checkbox-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:checkbox\u003e複選框例子\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:12.269Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.058Z\"}},{\"order\":66,\"_id\":\"5fcf8cefd5dd8e00183d733c\",\"post\":{\"meta\":{\"description\":\"在Struts2,可以通過s:checkboxlist標籤創建多個複選框具有相同名稱。棘手的問題是如何設置的默認值在多個複選框。例如,複選框以「紅色」,「黃色」,「藍色」,「綠色」選項的列表\",\"keywords\":\"Struts2,設置,複選框,缺省值\"},\"content\":{\"extended\":\"$cd\"},\"state\":\"published\",\"views\":410,\"order\":66,\"_id\":\"59fd7e911e18b40005ab9ea6\",\"key\":\"how-to-set-default-value-for-multiple-checkboxes-in-struts-2\",\"url\":\"how-to-set-default-value-for-multiple-checkboxes-in-struts-2\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2設置多個複選框缺省值\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:13.170Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.048Z\"}},{\"order\":67,\"_id\":\"5fcf8cefd5dd8e00183d733d\",\"post\":{\"meta\":{\"description\":\"在Struts2,可以使用s:checkboxlist標籤來使用相同的名稱來創建多個複選框。唯一的問題是如何把握變量中的多個檢查值? 例如, public ListString getColors() {colors = new ArrayListString();colors.add(\",\"keywords\":\"Struts2,checkboxlist,複選框\"},\"content\":{\"extended\":\"$ce\"},\"state\":\"published\",\"views\":411,\"order\":67,\"_id\":\"59fd7e911e18b40005ab9ea7\",\"key\":\"struts-2-scheckboxlist-multiple-check-boxes-example\",\"url\":\"struts-2-scheckboxlist-multiple-check-boxes-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:checkboxlist\u003e多個複選框例子\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:13.899Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.039Z\"}},{\"order\":68,\"_id\":\"5fcf8cefd5dd8e00183d733e\",\"post\":{\"content\":{\"extended\":\"$cf\"},\"state\":\"published\",\"views\":491,\"order\":68,\"_id\":\"5f75eb344607db0007804f36\",\"title\":\"Struts2 \u003cs:select\u003e下拉框例子\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2020-10-01T14:44:04.396Z\",\"section\":\"59fd7e211e18b40005ab9e69\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"url\":\"struts-2-sselect-drop-down-box-example\",\"key\":\"struts-2-sselect-drop-down-box-example\",\"createdAt\":\"2020-10-01T14:44:04.399Z\",\"updatedAt\":\"2020-10-13T08:25:58.040Z\",\"__v\":0}},{\"order\":69,\"_id\":\"5fcf8cefd5dd8e00183d733f\",\"post\":{\"meta\":{\"description\":\"在Struts2中,HTML下拉框可以通過s:select標籤呈現。要自動選擇一個下拉框的默認值,只是聲明s:select值」屬性標記,並設置相應的默認值。 這裏創建一個Web工程:strut2autoselectdropdown,來演\",\"keywords\":\"Struts2,自動選擇,下拉框\"},\"content\":{\"extended\":\"$d0\"},\"state\":\"published\",\"views\":433,\"order\":69,\"_id\":\"59fd7e921e18b40005ab9ea8\",\"key\":\"how-to-auto-select-drop-down-box-value-in-struts-2\",\"url\":\"how-to-auto-select-drop-down-box-value-in-struts-2\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2自動選擇下拉框的值\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:14.932Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.030Z\"}},{\"order\":70,\"_id\":\"5fcf8cefd5dd8e00183d7340\",\"post\":{\"meta\":{\"description\":\"在Struts2, s:combobox標籤是一個下拉列表單文本框組合在一起,允許用戶直接輸入一個值在文本框中,或選擇從下拉列表中選擇值,並選定值將自動填充到文本框中。 如果下拉列表和組合\",\"keywords\":\"Struts2,combobox,組合框,例子\"},\"content\":{\"extended\":\"$d1\"},\"state\":\"published\",\"views\":533,\"order\":70,\"_id\":\"59fd7e931e18b40005ab9ea9\",\"key\":\"struts-2-scombobox-combo-box-example\",\"url\":\"struts-2-scombobox-combo-box-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:combobox\u003e組合框的例子\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:15.655Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.023Z\"}},{\"order\":71,\"_id\":\"5fcf8cefd5dd8e00183d7341\",\"post\":{\"meta\":{\"description\":\"s:head標籤是用來輸出如編碼,CSS或JavaScript文件的HTML頭信息。請參見下面的代碼片段: %@ taglib prefix=\",\"keywords\":\"Struts2,head,示例\"},\"content\":{\"extended\":\"$d2\"},\"state\":\"published\",\"views\":404,\"order\":71,\"_id\":\"59fd7e931e18b40005ab9eaa\",\"key\":\"struts-2-shead-example\",\"url\":\"struts-2-shead-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:head\u003e示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:15.921Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.012Z\"}},{\"order\":72,\"_id\":\"5fcf8cefd5dd8e00183d7342\",\"post\":{\"meta\":{\"description\":\"在Struts2, s:file 標籤用於創建一個HTML文件上傳組件,允許用戶從本地磁盤選擇文件,並將其上傳到服務器。在本教程中,您將創建與文件上傳組件JSP頁面,設置最大大小和允許上傳文件\",\"keywords\":\"Struts2,文件,上傳y,例子\"},\"content\":{\"extended\":\"$d3\"},\"state\":\"published\",\"views\":471,\"order\":72,\"_id\":\"59fd7e941e18b40005ab9eab\",\"key\":\"struts-2-file-upload-example\",\"url\":\"struts-2-file-upload-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2文件上傳例子\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:16.832Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:12.005Z\"}},{\"order\":73,\"_id\":\"5fcf8cefd5dd8e00183d7343\",\"post\":{\"meta\":{\"description\":\"在上章節 Struts2 文件上傳示例 , 用戶允許選擇一個文件並上傳到服務器。在本教程中,您將學習如何允許用戶將多個文件上傳到服務器。 1. 動作類 在Action類,可以使用列表或數組以存\",\"keywords\":\"Struts2,上傳,多個文件,例子\"},\"content\":{\"extended\":\"$d4\"},\"state\":\"published\",\"views\":448,\"order\":73,\"_id\":\"59fd7e951e18b40005ab9eac\",\"key\":\"struts-2-upload-multiple-files-example\",\"url\":\"struts-2-upload-multiple-files-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2上傳多個文件例子\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:17.592Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.992Z\"}},{\"order\":74,\"_id\":\"5fcf8cefd5dd8e00183d7344\",\"post\":{\"meta\":{\"description\":\"在Struts2,s:doubleselect標籤用於創建兩個HTML下拉框,第一個下拉列表中選擇後,第二個下拉列表將根據第一個選擇發生相應的變化。一個非常典型的例子是「國家」,「國家」下拉選項,\",\"keywords\":\"Struts2,doubleselect,示例\"},\"content\":{\"extended\":\"$d5\"},\"state\":\"published\",\"views\":422,\"order\":74,\"_id\":\"59fd7e961e18b40005ab9ead\",\"key\":\"struts-2-sdoubleselect-example\",\"url\":\"struts-2-sdoubleselect-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:doubleselect\u003e示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:18.296Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.981Z\"}},{\"order\":75,\"_id\":\"5fcf8cefd5dd8e00183d7345\",\"post\":{\"meta\":{\"description\":\"在Struts2,S:updownselect標籤用於創建一個帶有按鈕的HTML選擇組件向上或向下移動在選擇組件的選項。當提交表單時,所有的選擇方案將提交在它們的排列順序。 s:updownselect 示例 s:updow\",\"keywords\":\"Struts2,updownselect,示例\"},\"content\":{\"extended\":\"$d6\"},\"state\":\"published\",\"views\":507,\"order\":75,\"_id\":\"59fd7e971e18b40005ab9eae\",\"key\":\"struts-2-updownselect-example\",\"url\":\"struts-2-updownselect-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:updownselect\u003e示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:19.025Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.950Z\"}},{\"order\":76,\"_id\":\"5fcf8cefd5dd8e00183d7346\",\"post\":{\"meta\":{\"description\":\"在Struts2中,選項選擇組件是兩個「updownselect」選擇部件在左,右側對齊,在它們中間,包含按鈕來移動自己的選擇選項。通過s:optiontransferselect標籤這可以創建。 s:optiontransferselect labe\",\"keywords\":\"Struts2,optiontransferselect,示例\"},\"content\":{\"extended\":\"$d7\"},\"state\":\"published\",\"views\":467,\"order\":76,\"_id\":\"59fd7e971e18b40005ab9eaf\",\"key\":\"struts-2-optiontransferselect-example\",\"url\":\"struts-2-optiontransferselect-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:optiontransferselect\u003e示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:19.747Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.939Z\"}},{\"order\":77,\"_id\":\"5fcf8cefd5dd8e00183d7347\",\"post\":{\"meta\":{\"description\":\"在Struts2,dojo ajax標籤「sx:datetimepicker」將呈現一個文本框和追加後面的日曆圖標,點擊日曆圖標會提示的日期時間選擇器組件。 要創建一個日期時間接組成部分,確保: 1. 下載 struts\",\"keywords\":\"Struts2,datetimepicker,示例\"},\"content\":{\"extended\":\"$d8\"},\"state\":\"published\",\"views\":461,\"order\":77,\"_id\":\"59fd7e981e18b40005ab9eb0\",\"key\":\"struts-2-datetimepicker-example\",\"url\":\"struts-2-datetimepicker-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003csx:datetimepicker\u003e示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:20.463Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.926Z\"}},{\"order\":78,\"_id\":\"5fcf8cefd5dd8e00183d7348\",\"post\":{\"meta\":{\"description\":\"在Struts2,sx:autocompleter標記是一個組合框,當在用戶輸入文本框會自動提示下拉的提示菜單。 This feature is implemented by dojo library, So, make sure you include 「 struts2-dojo-plugin.jar 」 as dependency\",\"keywords\":\"Struts2,autocompleter,自動提示,例子\"},\"content\":{\"extended\":\"$d9\"},\"state\":\"published\",\"views\":451,\"order\":78,\"_id\":\"59fd7e991e18b40005ab9eb1\",\"key\":\"struts-2-autocompleter-example\",\"url\":\"struts-2-autocompleter-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003csx:autocompleter\u003e自動提示例子\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:21.172Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.913Z\"}},{\"order\":79,\"_id\":\"5fcf8cefd5dd8e00183d7349\",\"post\":{\"meta\":{\"description\":\"在上一章 Struts2 autocompleter例子 ,已經瞭解如何通過Java列表,ONGL表達生成 autocompleter 選擇選項組件列表。另外,也有可能產生通過JSON數據選擇的選擇也是如此。 在開始之前,請確保您\",\"keywords\":\"Struts2,autocompleter,JSON,例子\"},\"content\":{\"extended\":\"$da\"},\"state\":\"published\",\"views\":437,\"order\":79,\"_id\":\"59fd7e991e18b40005ab9eb2\",\"key\":\"struts-2-autocompleter-json-example\",\"url\":\"struts-2-autocompleter-json-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 autocompleter+JSON例子\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:21.739Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.900Z\"}},{\"order\":80,\"_id\":\"5fcf8cefd5dd8e00183d734a\",\"post\":{\"meta\":{\"description\":\"Struts2迭代器標籤用來迭代一個值,它可以是任何java.util.Collection或java.util.Iterator的值。在本教程中,您將創建一個列表變量,使用迭代器標籤來遍歷,並得到使用IteratorStatus迭代狀態。\",\"keywords\":\"Struts2,iterator,迭代器,標籤,示例\"},\"content\":{\"extended\":\"$db\"},\"state\":\"published\",\"views\":420,\"order\":80,\"_id\":\"59fd7e9a1e18b40005ab9eb3\",\"key\":\"struts-2-iterator-tag-example\",\"url\":\"struts-2-iterator-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:iterator\u003e迭代器標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:22.322Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.890Z\"}},{\"order\":81,\"_id\":\"5fcf8cefd5dd8e00183d734b\",\"post\":{\"meta\":{\"description\":\"Struts2 s:if, s:elseif, s:else標籤示例用於執行基本的條件檢查。這裏創建一個Web工程:strut2iftag,來演示在多個複選框如何設置的默認值,整個項目的結構如下圖所示: s:if 標籤可以單獨使\",\"keywords\":\"Struts2,if,elseif,else,標籤,示例\"},\"content\":{\"extended\":\"$dc\"},\"state\":\"published\",\"views\":513,\"order\":81,\"_id\":\"59fd7e9a1e18b40005ab9eb4\",\"key\":\"struts-2-if-elseif-else-tag-example\",\"url\":\"struts-2-if-elseif-else-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 if,elseif,else標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:22.839Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.881Z\"}},{\"order\":82,\"_id\":\"5fcf8cefd5dd8e00183d734c\",\"post\":{\"meta\":{\"description\":\"Struts2 的append(追加)標籤被用來組合幾個迭代器(以列表或映射創建)成一個單一的迭代器。這裏創建一個Web工程:struts2appendtag,來演示在多個複選框如何設置的默認值,整個項目的\",\"keywords\":\"struts2,append,標籤,示例\"},\"content\":{\"extended\":\"$dd\"},\"state\":\"published\",\"views\":415,\"order\":82,\"_id\":\"59fd7e9b1e18b40005ab9eb5\",\"key\":\"struts-2-append-tag-example\",\"url\":\"struts-2-append-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"struts2 \u003cs:append\u003e標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:23.378Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.871Z\"}},{\"order\":83,\"_id\":\"5fcf8cefd5dd8e00183d734d\",\"post\":{\"meta\":{\"description\":\"Struts2 s:generator標記用於基於在頁中提供「val」屬性,以產生一個迭代。這裏創建一個Web工程:struts2generatortag,來演示在多個複選框如何設置的默認值,整個項目的結構如下圖所示: 在\",\"keywords\":\"Struts2,generator,標籤,示例\"},\"content\":{\"extended\":\"$de\"},\"state\":\"published\",\"views\":433,\"order\":83,\"_id\":\"59fd7e9b1e18b40005ab9eb6\",\"key\":\"struts-2-generator-tag-example\",\"url\":\"struts-2-generator-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:generator\u003e標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:23.892Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.860Z\"}},{\"order\":84,\"_id\":\"5fcf8cefd5dd8e00183d734e\",\"post\":{\"meta\":{\"description\":\"Struts2merge標籤用來合併幾個迭代器(由列表或映射創建)成一個迭代器。這裏創建一個Web工程:struts2mergetag,來演示在多個複選框如何設置的默認值,整個項目的結構如下圖所示: 在本\",\"keywords\":\"Struts2,merge,標籤,示例\"},\"content\":{\"extended\":\"$df\"},\"state\":\"published\",\"views\":433,\"order\":84,\"_id\":\"59fd7e9c1e18b40005ab9eb7\",\"key\":\"struts-2-merge-tag-example\",\"url\":\"struts-2-merge-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:merge\u003e標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:24.411Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.851Z\"}},{\"order\":85,\"_id\":\"5fcf8cefd5dd8e00183d734f\",\"post\":{\"meta\":{\"description\":\"Struts2的s:sort標籤使用java.util.Comparator來排序列表,這裏創建一個Web工程:struts2sorttag,來演示在多個複選框如何設置的默認值,整個項目的結構如下圖所示: 在本教程中,將創建6個Pe\",\"keywords\":\"Struts2,sort,標籤,示例\"},\"content\":{\"extended\":\"$e0\"},\"state\":\"published\",\"views\":439,\"order\":85,\"_id\":\"59fd7e9c1e18b40005ab9eb8\",\"key\":\"struts-2-sort-tag-example\",\"url\":\"struts-2-sort-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:sort\u003e標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:24.944Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.841Z\"}},{\"order\":86,\"_id\":\"5fcf8cefd5dd8e00183d7350\",\"post\":{\"meta\":{\"description\":\"Struts2s:subset標籤用來輸出一個iterator元素的子集或部分。在本教程中,將創建一個「數字」列表中,包含了10個元素(從 1 - 10),並使用s:subset標記「start count」屬性和判定方法,以輸出一個\",\"keywords\":\"Struts2,subset,標籤,示例\"},\"content\":{\"extended\":\"$e1\"},\"state\":\"published\",\"views\":445,\"order\":86,\"_id\":\"59fd7e9d1e18b40005ab9eb9\",\"key\":\"struts-2-subset-tag-example\",\"url\":\"struts-2-subset-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:subset\u003e標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:25.448Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.814Z\"}},{\"order\":87,\"_id\":\"5fcf8cefd5dd8e00183d7351\",\"post\":{\"meta\":{\"description\":\"Struts2 s:a標籤用於渲染一個 HTML 的「a」 標籤。最好的做法是使用s:url標籤來創建URL,並將其嵌入到a標籤。例如, s:url value=\",\"keywords\":\"Struts2,標籤,示例\"},\"content\":{\"extended\":\"$e2\"},\"state\":\"published\",\"views\":404,\"order\":87,\"_id\":\"59fd7e9d1e18b40005ab9eba\",\"key\":\"struts-2-a-tag-example\",\"url\":\"struts-2-a-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:a\u003e標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:25.895Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.807Z\"}},{\"order\":88,\"_id\":\"5fcf8cefd5dd8e00183d7352\",\"post\":{\"meta\":{\"description\":\"Struts2 的「action」標籤是用來直接從JSP頁面中調用Action類。如果「executeResult」屬性設置爲true,則結果頁的內容將直接在當前網頁渲染。 這是用一個完整的例子很好地說明: 1. 動作 Ac\",\"keywords\":\"Struts2,action,標籤\"},\"content\":{\"extended\":\"$e3\"},\"state\":\"published\",\"views\":449,\"order\":88,\"_id\":\"59fd7e9e1e18b40005ab9ebb\",\"key\":\"struts-2-action-tag-example\",\"url\":\"struts-2-action-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:action\u003e標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:26.347Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.800Z\"}},{\"order\":89,\"_id\":\"5fcf8cefd5dd8e00183d7353\",\"post\":{\"meta\":{\"description\":\"Struts2的s:bean標籤用於在JSP頁面中實例化一個類。 在本教程中,將使用s:bean標籤,以實例化一個helloBean的類, 通過「param」元素設置其屬性,並打印出它的值。 1. 簡單Bean 一個簡單的類\",\"keywords\":\"Struts2,bean,標籤,示例,Struts2,的,bean,標籤,用於,\"},\"content\":{\"extended\":\"$e4\"},\"state\":\"published\",\"views\":494,\"order\":89,\"_id\":\"59fd7e9e1e18b40005ab9ebc\",\"key\":\"struts-2-bean-tag-example\",\"url\":\"struts-2-bean-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:bean\u003e標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:26.736Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.793Z\"}},{\"order\":90,\"_id\":\"5fcf8cefd5dd8e00183d7354\",\"post\":{\"meta\":{\"description\":\"Struts2的s:date標籤用於格式化Date對象,它有兩種方法: 自定義格式 (如:yyyy-MM-dd) 「nice」屬性來格式化日期到一個易於閱讀的符號,如,「此日期162天前」。 在本教程中,它顯示瞭如何\",\"keywords\":\"Struts2,date,標籤\"},\"content\":{\"extended\":\"$e5\"},\"state\":\"published\",\"views\":405,\"order\":90,\"_id\":\"59fd7e9f1e18b40005ab9ebd\",\"key\":\"struts-2-date-tag-example\",\"url\":\"struts-2-date-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:date\u003e標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:27.169Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.786Z\"}},{\"order\":91,\"_id\":\"5fcf8cefd5dd8e00183d7355\",\"post\":{\"meta\":{\"description\":\"在Struts2在s:debug標籤是一個非常有用的調試標記輸出「值棧」的內容,並在網頁中「堆棧上下文」的詳細信息。在本教程,在JSP頁面中顯示如何使用s:debug標籤。 1. 動作 一個簡單的Acti\",\"keywords\":\"Struts2,debug,標籤\"},\"content\":{\"extended\":\"$e6\"},\"state\":\"published\",\"views\":447,\"order\":91,\"_id\":\"59fd7e9f1e18b40005ab9ebe\",\"key\":\"struts-2-debug-tag-example\",\"url\":\"struts-2-debug-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:debug\u003e標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:27.657Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.777Z\"}},{\"order\":92,\"_id\":\"5fcf8cefd5dd8e00183d7356\",\"post\":{\"meta\":{\"description\":\"Struts2s:include標籤用於直接包含JSP或HTML頁面到當前頁面。 參見下面s:include標籤的例子。 1. 動作 一個簡單的動作類只做轉發任務。 IncludeTagAction.java package com.mkyong.common.action;import com.ope\",\"keywords\":\"Struts2,include,標籤\"},\"content\":{\"extended\":\"$e7\"},\"state\":\"published\",\"views\":473,\"order\":92,\"_id\":\"59fd7ea01e18b40005ab9ebf\",\"key\":\"struts-2-include-tag-example\",\"url\":\"struts-2-include-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:include\u003e標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:28.074Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.769Z\"}},{\"order\":93,\"_id\":\"5fcf8cefd5dd8e00183d7357\",\"post\":{\"meta\":{\"description\":\"Struts2s:i18n標籤是用來從聲明的資源包獲得消息, 不只是使用當前操作相關聯的資源包。看下面一個完整的s:i18n標籤的例子: 1. 動作 Action類轉發請求。 I18nTagAction.java package com.mkyong.co\",\"keywords\":\"Struts2,i18n,標籤,示例\"},\"content\":{\"extended\":\"$e8\"},\"state\":\"published\",\"views\":388,\"order\":93,\"_id\":\"59fd7ea01e18b40005ab9ec0\",\"key\":\"struts-2-i18n-tag-example\",\"url\":\"struts-2-i18n-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:i18n\u003e標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:28.496Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.760Z\"}},{\"order\":94,\"_id\":\"5fcf8cefd5dd8e00183d7358\",\"post\":{\"meta\":{\"description\":\"Struts2 s: param 標籤被用來參數化其他標籤。 但是,當稱明s:param標籤,「參數值」可以有兩種定義方式: 「value」 屬性 param標籤的開始和結束之間的文本 例如, param name=\",\"keywords\":\"Struts2,param,示例,標籤\"},\"content\":{\"extended\":\"$e9\"},\"state\":\"published\",\"views\":524,\"order\":94,\"_id\":\"59fd7ea01e18b40005ab9ec1\",\"key\":\"struts-2-param-tag-example\",\"url\":\"struts-2-param-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:param\u003e標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:28.932Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.749Z\"}},{\"order\":95,\"_id\":\"5fcf8cefd5dd8e00183d7359\",\"post\":{\"meta\":{\"description\":\"Struts2的s:property標籤是用來從一個類獲得屬性值,如果沒有指定,這將默認爲當前Action類(堆棧的頂部)屬性。在本教程中,它展示瞭如何使用s:property標籤,以從目前Action類獲得其他\",\"keywords\":\"Struts2,property,標籤,實例\"},\"content\":{\"extended\":\"$ea\"},\"state\":\"published\",\"views\":919,\"order\":95,\"_id\":\"59fd7ea11e18b40005ab9ec2\",\"key\":\"struts-2-property-tag-example\",\"url\":\"struts-2-property-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:property\u003e標籤實例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:29.367Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.738Z\"}},{\"order\":96,\"_id\":\"5fcf8cefd5dd8e00183d735a\",\"post\":{\"meta\":{\"description\":\"Struts2s:push標籤被用來將值推到堆棧的頂部,以便它可以容易地訪問或參考。看到一個完整的s:push標記示例: 1. 動作 Action類只轉發請求。 PushTagAction.java package com.mkyong.common.action;import\",\"keywords\":\"Struts2,push,標籤,示例\"},\"content\":{\"extended\":\"$eb\"},\"state\":\"published\",\"views\":449,\"order\":96,\"_id\":\"59fd7ea11e18b40005ab9ec3\",\"key\":\"struts-2-push-tag-example\",\"url\":\"struts-2-push-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:push\u003e標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:29.793Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.728Z\"}},{\"order\":97,\"_id\":\"5fcf8cefd5dd8e00183d735b\",\"post\":{\"meta\":{\"description\":\"Struts2s:set標籤用於分配值在指定範圍內的變量(應用,會話,請求,頁面,或動作),默認的範圍是動作。下面來看一個完整的s:set標籤的例子: 「value」是指任何硬編碼字符串,屬性\",\"keywords\":\"Struts2,set,標籤,示例\"},\"content\":{\"extended\":\"$ec\"},\"state\":\"published\",\"views\":621,\"order\":97,\"_id\":\"59fd7ea21e18b40005ab9ec4\",\"key\":\"struts-2-set-tag-example\",\"url\":\"struts-2-set-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:set\u003e標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:30.215Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.719Z\"}},{\"order\":98,\"_id\":\"5fcf8cefd5dd8e00183d735c\",\"post\":{\"meta\":{\"description\":\"Struts2s:text標籤是用來從資源包獲取捆綁動作類的消息。並按照三個序列: 顯示來自資源包的消息,按照 Struts2的資源包搜索順序 。 如果未在資源包中找到消息,則標籤的本身會被顯示\",\"keywords\":\"Struts2,texttag,標籤,示例\"},\"content\":{\"extended\":\"$ed\"},\"state\":\"published\",\"views\":427,\"order\":98,\"_id\":\"59fd7ea21e18b40005ab9ec5\",\"key\":\"struts-2-text-tag-example\",\"url\":\"struts-2-text-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:texttag\u003e標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:30.481Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.710Z\"}},{\"order\":99,\"_id\":\"5fcf8cefd5dd8e00183d735d\",\"post\":{\"meta\":{\"description\":\"Struts2s:url標籤被用來創建一個URL,並輸出它作爲文本格式。它從不通過自己的工作,但它可以提供URL鏈接到其他標籤,如s:a創建超鏈接或img渲染圖像。在本教程中,它顯示 Struts2s:url標籤\",\"keywords\":\"Struts2,url,標籤,示例\"},\"content\":{\"extended\":\"$ee\"},\"state\":\"published\",\"views\":439,\"order\":99,\"_id\":\"59fd7ea21e18b40005ab9ec6\",\"key\":\"struts-2-url-tag-example\",\"url\":\"struts-2-url-tag-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 \u003cs:url\u003e標籤示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:30.911Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.699Z\"}},{\"order\":100,\"_id\":\"5fcf8cefd5dd8e00183d735e\",\"post\":{\"meta\":{\"description\":\"要使用資源包從屬性文件檢索消息,必須瞭解Struts2的資源包搜索順序: 資源包搜索順序 資源包中搜索按以下順序: ActionClass.properties Interface.properties BaseClass.properties ModelDriven’s model\",\"keywords\":\"Struts2,資源包,使用,示例\"},\"content\":{\"extended\":\"$ef\"},\"state\":\"published\",\"views\":418,\"order\":100,\"_id\":\"59fd7ea31e18b40005ab9ec7\",\"key\":\"struts-2-resource-bundle-example\",\"url\":\"struts-2-resource-bundle-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2資源包使用示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:31.480Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.669Z\"}},{\"order\":101,\"_id\":\"5fcf8cefd5dd8e00183d735f\",\"post\":{\"meta\":{\"description\":\"Struts2的國際化(I18N)和本地化(i10n)或多語言的例子,來說明如何使用資源包來顯示不同語言的消息。在這個例子中,您將創建一個簡單的登錄屏幕,通過Struts2的UI組件顯示來自資源\",\"keywords\":\"Struts2,本地化,國際化\"},\"content\":{\"extended\":\"$f0\"},\"state\":\"published\",\"views\":392,\"order\":101,\"_id\":\"59fd7ea41e18b40005ab9ec8\",\"key\":\"struts-2-i18n-or-localization-example\",\"url\":\"struts-2-i18n-or-localization-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2本地化和國際化\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:32.739Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.658Z\"}},{\"order\":102,\"_id\":\"5fcf8cefd5dd8e00183d7360\",\"post\":{\"meta\":{\"description\":\"在Struts2,在UI組件的「key」屬性來處理本地化的常用方法,也是編碼UI標籤的一個非常有效的方式。見下面兩種情況: 1. Properties屬性文件 屬性文件包含一條消息。 global.properties global\",\"keywords\":\"Struts2,key,鍵屬性,示例\"},\"content\":{\"extended\":\"$f1\"},\"state\":\"published\",\"views\":418,\"order\":102,\"_id\":\"59fd7ea51e18b40005ab9ec9\",\"key\":\"struts-2-key-attribute-example\",\"url\":\"struts-2-key-attribute-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2 key鍵屬性示例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:33.005Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.647Z\"}},{\"order\":103,\"_id\":\"5fcf8cefd5dd8e00183d7361\",\"post\":{\"meta\":{\"description\":\"一個 Struts2 的國際化定位的問題,用來顯示中國漢字... 案例1:屬性有特殊字符的文件 屬性文件存儲用戶名,密碼信息,並以中文字符提交。此屬性文件以UTF-8格式創建的,但內容不使\",\"keywords\":\"Struts2,中文,本地化\"},\"content\":{\"extended\":\"$f2\"},\"state\":\"published\",\"views\":432,\"order\":103,\"_id\":\"59fd7ea61e18b40005ab9eca\",\"key\":\"struts-2-chinese-localization-issue\",\"url\":\"struts-2-chinese-localization-issue\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2中文本地化問題\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:34.149Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.638Z\"}},{\"order\":104,\"_id\":\"5fcf8cefd5dd8e00183d7362\",\"post\":{\"meta\":{\"description\":\"通常情況下,您可能需要一個全局資源包(屬性文件)來存儲信息,可用於在應用程序中的所有類。 在Struts2,有三種方式來配置全局資源包: 1. struts.properties 配置全局資源包在「str\",\"keywords\":\"配置,Struts2,全局,資源包\"},\"content\":{\"extended\":\"$f3\"},\"state\":\"published\",\"views\":439,\"order\":104,\"_id\":\"59fd7ea61e18b40005ab9ecb\",\"key\":\"how-to-configure-global-resource-bundle-in-struts-2\",\"url\":\"how-to-configure-global-resource-bundle-in-struts-2\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"如何配置Struts2全局資源包\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:34.418Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.626Z\"}},{\"order\":105,\"_id\":\"5fcf8cefd5dd8e00183d7363\",\"post\":{\"meta\":{\"description\":\"在本教程中,我們來學習Struts2和Spring的集成。 1. 工程結構 下面的圖是本教程的項目文件夾結構。 2. Spring監聽器 配置Spring監聽器「org.springframework.web.context.ContextLoaderListener」 到web.xml文\",\"keywords\":\"Struts2,Spring,集成,示例\"},\"content\":{\"extended\":\"$f4\"},\"state\":\"published\",\"views\":464,\"order\":105,\"_id\":\"59fd7ea71e18b40005ab9ecc\",\"key\":\"struts-2-spring-integration-example\",\"url\":\"struts-2-spring-integration-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2+Spring集成實例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:35.188Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.617Z\"}},{\"order\":106,\"_id\":\"5fcf8cefd5dd8e00183d7364\",\"post\":{\"meta\":{\"description\":\"Struts2並沒有附帶任何現成「Struts2-Quartz.jar」之類的插件,黑客可能會使用標準的Servlet監聽將兩個框架鏈接在一起。請參閱它們的關係 Struts 2 -- (Listener)-- Quartz --- Scheduler task 在本教程中\",\"keywords\":\"Struts2,Quartz,調度,集成,實例\"},\"content\":{\"extended\":\"$f5\"},\"state\":\"published\",\"views\":400,\"order\":106,\"_id\":\"59fd7ea71e18b40005ab9ecd\",\"key\":\"struts-2-quartz-scheduler-integration-example\",\"url\":\"struts-2-quartz-scheduler-integration-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2+Quartz2調度集成實例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:47:35.454Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.602Z\"}},{\"order\":107,\"_id\":\"5fcf8cefd5dd8e00183d7365\",\"post\":{\"meta\":{\"description\":\"在上篇 Struts2 + Hibernate集成 實例中,它使用servlet上下文監聽Hibernate的Session,而且把Struts2和Hibernate框架集成。 但是,總有一些東西要提高。在本教程中,我們將展示如何整合Struts2+Hiber\",\"keywords\":\"Struts2,Hibernate,Full,集成\"},\"content\":{\"extended\":\"$f6\"},\"state\":\"published\",\"views\":415,\"order\":107,\"_id\":\"59fd7ef41e18b40005ab9ece\",\"key\":\"struts-2-hibernate-integration-with-full-hibernate-plugin\",\"url\":\"struts-2-hibernate-integration-with-full-hibernate-plugin\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2+Hibernate使用Full Hibernate Plugin集成\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:48:52.475Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.577Z\"}},{\"order\":108,\"_id\":\"5fcf8cefd5dd8e00183d7366\",\"post\":{\"meta\":{\"description\":\"在 Struts2 中,沒有官方的插件集成Hibernate框架。但是,可以通過以下步驟解決方法: 註冊一個自定義的ServletContextListener 在ServletContextListener類,初始化Hibernate會話,並將其存儲到servlet上\",\"keywords\":\"Struts2,Hibernate,集成,實例\"},\"content\":{\"extended\":\"$f7\"},\"state\":\"published\",\"views\":412,\"order\":108,\"_id\":\"59fd7ef51e18b40005ab9ecf\",\"key\":\"struts-2-hibernate-integration-example\",\"url\":\"struts-2-hibernate-integration-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2+Hibernate集成實例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:48:53.184Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.562Z\"}},{\"order\":109,\"_id\":\"5fcf8cefd5dd8e00183d7367\",\"post\":{\"meta\":{\"description\":\"在本教程中,它顯示的集成「Struts2 + Spring + Hibernate「,請務必檢查以下之前繼續學習教程。 Struts2 + Hibernate集成實例 Struts2 + Spring 集成實例 參見集成步驟總結: 獲取所有的依賴庫(很\",\"keywords\":\"Struts2,Spring,Hibernate,集成,實例\"},\"content\":{\"extended\":\"$f8\"},\"state\":\"published\",\"views\":394,\"order\":109,\"_id\":\"59fd7ef51e18b40005ab9ed0\",\"key\":\"struts-2-spring-hibernate-integration-example\",\"url\":\"struts-2-spring-hibernate-integration-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2+Spring+Hibernate集成實例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:48:53.976Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.528Z\"}},{\"order\":110,\"_id\":\"5fcf8cefd5dd8e00183d7368\",\"post\":{\"meta\":{\"description\":\"在本教程中,我們學習如何將log4j框架在Struts2的Web應用程序集成。所有需要做的有: 包含 log4j.jar 作爲項目依賴 創建一個 log4j.properties 文件,並把它放入 classpath 的根目錄-放到資源文件\",\"keywords\":\"Struts2,Log4j,集成\"},\"content\":{\"extended\":\"$f9\"},\"state\":\"published\",\"views\":427,\"order\":110,\"_id\":\"59fd7ef61e18b40005ab9ed1\",\"key\":\"struts-2-log4j-integration-example\",\"url\":\"struts-2-log4j-integration-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2+Log4j集成\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:48:54.862Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.512Z\"}},{\"order\":111,\"_id\":\"5fcf8cefd5dd8e00183d7369\",\"post\":{\"meta\":{\"description\":\"在Struts2的開發時,很多人會問爲什麼有些聲明過濾器類是「FilterDispatcher「; 而有一些又是「StrutsPrepareAndExecuteFilter「?但兩者都可以正常使用,並有什麼區別? 1. FilterDispatcher 示例 ...f\",\"keywords\":\"FilterDispatcher,struts2,StrutsPrepareAndExecuteFilter\"},\"content\":{\"extended\":\"$fa\"},\"state\":\"published\",\"views\":414,\"order\":111,\"_id\":\"59fd7ef71e18b40005ab9ed2\",\"key\":\"difference-between-struts-2-filterdispatcher-and-strutsprepareandexecutefilter\",\"url\":\"difference-between-struts-2-filterdispatcher-and-strutsprepareandexecutefilter\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2的FilterDispatcher和StrutsPrepareAndExecuteFilter有什麼不同?\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:48:55.133Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.502Z\"}},{\"order\":112,\"_id\":\"5fcf8cefd5dd8e00183d736a\",\"post\":{\"meta\":{\"description\":\"在Struts2中,可以使用以下兩種方法來獲取HttpServletRequest對象。 1. ServletActionContext 直接從 org.apache.struts2.ServletActionContext 獲取 HttpServletRequest 對象。 import javax.servlet.http.HttpServletRequest;im\",\"keywords\":\"Struts2,獲取,HttpServletRequest,實例\"},\"content\":{\"extended\":\"$fb\"},\"state\":\"published\",\"views\":475,\"order\":112,\"_id\":\"59fd7ef71e18b40005ab9ed3\",\"key\":\"how-to-get-the-httpservletrequest-in-struts-2\",\"url\":\"how-to-get-the-httpservletrequest-in-struts-2\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2獲取HttpServletRequest實例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:48:55.441Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.495Z\"}},{\"order\":113,\"_id\":\"5fcf8cefd5dd8e00183d736b\",\"post\":{\"meta\":{\"description\":\"在Struts2中,可以用以下兩種方式來獲取HttpServletResponse對象。 1. ServletActionContext 通過ServletActionContext類來訪問HttpServletResponse。 package com.mkyong.common.action;import javax.servlet.http.HttpServletResp\",\"keywords\":\"Struts2,獲取,HttpServletResponse,實例\"},\"content\":{\"extended\":\"$fc\"},\"state\":\"published\",\"views\":536,\"order\":113,\"_id\":\"59fd7ef71e18b40005ab9ed4\",\"key\":\"how-to-get-the-httpservletresponse-in-struts-2\",\"url\":\"how-to-get-the-httpservletresponse-in-struts-2\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2獲取HttpServletResponse實例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:48:55.745Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.489Z\"}},{\"order\":114,\"_id\":\"5fcf8cefd5dd8e00183d736c\",\"post\":{\"meta\":{\"description\":\"在Struts2中,可以使用以下兩種方法來獲取ServletContext對象。 1. ServletActionContext 直接從 org.apache.struts2.ServletActionContext 獲取 ServletContext 對象。 import javax.servlet.ServletContext;import org.apache.s\",\"keywords\":\"獲取,ServletContext,對象\"},\"content\":{\"extended\":\"$fd\"},\"state\":\"published\",\"views\":489,\"order\":114,\"_id\":\"59fd7ef81e18b40005ab9ed5\",\"key\":\"how-to-get-the-servletcontext-in-struts-2\",\"url\":\"how-to-get-the-servletcontext-in-struts-2\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"如何獲取ServletContext對象\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:48:56.049Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.482Z\"}},{\"order\":115,\"_id\":\"5fcf8cefd5dd8e00183d736d\",\"post\":{\"meta\":{\"description\":\"在某些情況下,可能需要一個Action類分配一些預定義或靜態的參數值。 爲動作定義靜態參數 在Struts2,可以在 struts.xml文件中的通過param標記進行配置,例如, struts.xml struts constant name\",\"keywords\":\"Struts2,配置,Action類,靜態,參數\"},\"content\":{\"extended\":\"$fe\"},\"state\":\"published\",\"views\":434,\"order\":115,\"_id\":\"59fd7ef81e18b40005ab9ed6\",\"key\":\"struts-2-configure-static-parameter-for-action-class\",\"url\":\"struts-2-configure-static-parameter-for-action-class\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2配置Action類的靜態參數\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:48:56.518Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.476Z\"}},{\"order\":116,\"_id\":\"5fcf8cefd5dd8e00183d736e\",\"post\":{\"meta\":{\"description\":\"這是一個Struts2的例子來說明使用定製返回類型,允許用戶下載文件。web工程的文件夾結構如下所示: 1. Action 在Action類中,聲明一個InputStream的數據類型和getter方法。 DownloadAction.java p\",\"keywords\":\"Struts2,下載文件,實例\"},\"content\":{\"extended\":\"$ff\"},\"state\":\"published\",\"views\":664,\"order\":116,\"_id\":\"59fd7ef91e18b40005ab9ed7\",\"key\":\"struts-2-download-file-example\",\"url\":\"struts-2-download-file-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2下載文件實例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:48:57.269Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.468Z\"}},{\"order\":117,\"_id\":\"5fcf8cefd5dd8e00183d736f\",\"post\":{\"meta\":{\"description\":\"在這個Struts2例子,將學習如何通過「struts2-json-plugin.jar」庫將對象轉換爲JSON格式的數據。 1. Action (JSON) 這是一個將被轉換成JSON格式的 Action 類。 package com.mkyong.common.action;import java.util\",\"keywords\":\"Struts2,JSON,實例\"},\"content\":{\"extended\":\"$100\"},\"state\":\"published\",\"views\":491,\"order\":117,\"_id\":\"59fd7ef91e18b40005ab9ed8\",\"key\":\"struts-2-and-json-example\",\"url\":\"struts-2-and-json-example\",\"tutorial\":\"59fd7e211e18b40005ab9e68\",\"section\":\"59fd7e211e18b40005ab9e69\",\"title\":\"Struts2和JSON實例\",\"author\":\"59fa8cb8a31fb7001009c4bb\",\"publishedDate\":\"2017-11-04T08:48:57.714Z\",\"__v\":0,\"updatedAt\":\"2020-10-13T08:28:11.459Z\"}}]}]}}]}]}]]}]]}],[\"$\",\"div\",null,{\"className\":\"card-footer\",\"children\":[\"$\",\"div\",null,{\"className\":\"row\",\"children\":[[\"$\",\"div\",null,{\"className\":\"col\",\"children\":[[\"$\",\"svg\",null,{\"aria-hidden\":\"true\",\"focusable\":\"false\",\"data-prefix\":\"fas\",\"data-icon\":\"arrow-left\",\"className\":\"svg-inline--fa fa-arrow-left \",\"role\":\"img\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 448 512\",\"style\":{},\"children\":[\"$\",\"path\",null,{\"fill\":\"currentColor\",\"d\":\"M9.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.2 288 416 288c17.7 0 32-14.3 32-32s-14.3-32-32-32l-306.7 0L214.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z\",\"style\":{}}]}],[\"$\",\"$Lf\",null,{\"href\":\"/struts-2/struts-2-a-tag-example\",\"children\":\"Struts2 \u003cs:a\u003e標籤示例\"}]]}],[\"$\",\"div\",null,{\"className\":\"col text-md-end\",\"children\":[\"$\",\"$Lf\",null,{\"href\":\"/struts-2/struts-2-bean-tag-example\",\"children\":[[\"$\",\"svg\",null,{\"aria-hidden\":\"true\",\"focusable\":\"false\",\"data-prefix\":\"fas\",\"data-icon\":\"arrow-right\",\"className\":\"svg-inline--fa fa-arrow-right \",\"role\":\"img\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 448 512\",\"style\":{},\"children\":[\"$\",\"path\",null,{\"fill\":\"currentColor\",\"d\":\"M438.6 278.6c12.5-12.5 12.5-32.8 0-45.3l-160-160c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L338.8 224 32 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l306.7 0L233.4 393.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l160-160z\",\"style\":{}}]}],\"Struts2 \u003cs:bean\u003e標籤示例\"]}]}]]}]}]]}]]}]]}]}]}]\n"])</script><script>self.__next_f.push([1,"4:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"1\",{\"children\":\"Struts2 \u003cs:action\u003e標籤示例 - Struts2教學\"}],[\"$\",\"meta\",\"2\",{\"name\":\"description\",\"content\":\"Struts2 的「action」標籤是用來直接從JSP頁面中調用Action類。如果「executeResult」屬性設置爲true,則結果頁的內容將直接在當前網頁渲染。 這是用一個完整的例子很好地說明: 1. 動作 Ac\"}],[\"$\",\"meta\",\"3\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script></body></html>