




已閱讀5頁,還剩82頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第3章 Struts 2應用,3.1 Struts 2概述,3.2 Struts 2基本應用及工作流程,3.3 Struts 2標簽庫應用,3.4 Struts 2攔截器,3.5 Struts 2國際化應用,3.6 Struts 2文件上傳,3.7 Struts 2綜合應用實例添加學生信息,3.1 Struts 2概述,3.1.1 MVC簡介 MVC有以下優(yōu)點: 多個視圖可以對應一個模型。按MVC設計模式,一個模型對應多個視圖,可以減少代碼的復制及代碼的維護量,一旦模型發(fā)生改變,也易于維護。 模型返回的數(shù)據(jù)與顯示邏輯分離。模型數(shù)據(jù)可以應用任何顯示技術,例如,使用JSP頁面、Velocity模板或者直接產生Excel文檔等。 應用被分隔為三層,降低了各層之間的耦合,提供了應用的可擴展性。 控制層的概念也很有效,由于它把不同的模型和不同的視圖組合在一起,完成不同的請求,因此控制層可以說是包含了用戶請求權限的概念。 MVC更符合軟件工程化管理的精神。不同的層各司其職,每一層的組件具有相同的特征,有利于通過工程化和工具化產生管理程序代碼。,3.1.2 Struts 2體系結構,Struts 2的基本流程如下: Web瀏覽器請求一個資源。 過濾器Dispatcher查找請求,確定適當?shù)腁ction。 攔截器自動對請求應用通用功能,如驗證和文件上傳等操作。 Action的execute方法通常用來存儲和(或)重新獲得信息(通過數(shù)據(jù)庫)。, 結果被返回到瀏覽器??赡苁荋TML、圖片、PDF或其他。 其實,Struts 2框架的應用著重在控制上。簡單的流程是:頁面控制器頁面。最重要的是控制器的取數(shù)據(jù)與處理后傳數(shù)據(jù)的問題。Struts 2的體系結構還可以參考圖3.1,更直觀地展現(xiàn)出其流程。,圖3.1 Struts 2體系結構,3.2 Struts 2基本應用及工作流程,3.2.1 簡單Struts 2實例開發(fā) 1. 下載Struts 2框架 MyEclipse 6沒有對Struts 2的支持,所以需要用戶自己下載Struts 2開發(fā)包。登錄/下載Struts 2完整版,本書使用的是Struts 2.0.14。將下載的Zip文件解壓縮,它是一個典型的Web結構。打開其文件夾,里面包含以下4個文件: apps:包含基于Struts 2的示例應用,是學習Struts 2非常有用的資料。 docs:包含Struts 2的相關文檔,如Struts 2快速入門、Struts 2文檔、API文檔等內容。 lib:包含Struts 2框架的核心類庫,以及Struts 2的第三方插件類庫。 src:包含Struts 2框架的全部源代碼。 2. 建立一個Web項目 打開MyEclipse,建立一個Web項目,命名為“Struts 2.0”。,3.2.1 簡單Struts 2實例開發(fā),3. 加載Struts 2基本類庫 下面把這幾個類庫添加到項目中。 右擊項目名,選擇【Build Path】【Configure Build Path】菜單項,出現(xiàn)如圖3.2所示的對話框。單擊【Add External JARs】按鈕,進入下載的Struts 2目錄的lib文件夾,選中上面的5個Jar包,單擊【OK】按鈕完成類庫的添加。,圖3.2 添加Struts 2的Jar包,3.2.1 簡單Struts 2實例開發(fā),4. 修改web.xml文件 打開項目中的WebRoot/WEB-INF/web.xml文件,修改其代碼如下: struts 2 org.apache.struts2.dispatcher.FilterDispatcher struts 2 /* ,3.2.1 簡單Struts 2實例開發(fā),5. 創(chuàng)建hello.jsp 選擇【W(wǎng)ebRoot】【new】【jsp】菜單項,在File Name中輸入文件名“hello.jsp”,修改后的代碼如下: struts 2應用 請輸入姓名: ,3.2.1 簡單Struts 2實例開發(fā),6. Action實現(xiàn)類 右擊src文件夾,選擇【new】【Package】菜單項,在name框中輸入包名“org.action”,右擊該包,依此類推,建立class,命名為“StrutsAction”,修改后的代碼如下: package org.action; import java.util.Map; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class StrutsAction extends ActionSupport private String name; public String getName() return name; public void setName(String name) =name; public String execute() throws Exception if(!name.equals(“HelloWorld“) Map request=(Map)ActionContext.getContext().get(“request“); request.put(“name“,getName(); return “success“; else return “error“; ,3.2.1 簡單Struts 2實例開發(fā),7. 創(chuàng)建并配置struts.xml文件 任何一個Struts 2程序都不能缺少struts.xml文件,它是Struts 2運行的核心。右擊src文件夾,選擇【new】【file】菜單項,在File name框中輸入“struts.xml”,修改后的代碼如下: /welcome.jsp /hello.jsp ,3.2.1 簡單Struts 2實例開發(fā),8. 創(chuàng)建welcome.jsp 創(chuàng)建welcome.jsp,其步驟和上面創(chuàng)建hello.jsp類似,這里不再重復敘述。其代碼如下: struts 2應用 hello ! ,3.2.1 簡單Struts 2實例開發(fā),9. 部署和運行 啟動Tomcat后,在瀏覽器中輸入“http:/localhost:8080/Struts2.0/hello.jsp”,會看到如圖3.3所示的界面。當在輸入框中輸入“張三”時,會出現(xiàn)如圖3.4所示界面。如果輸入“HelloWorld”,就會返回當前頁面。,圖3.3 運行界面 圖3.4 運行成功界面,3.2.2 Struts 2工作流程及各種文件詳解,1. Struts 2的工作流程 Struts 2框架中的配置文件struts.xml會起映射作用,它會根據(jù)“*”來決定調用用戶定義的哪個Action類。例如在項目Struts 2.0中,請求為struts.action,前面“*”的部分是“struts”,所以在struts.xml中有個Action類的name為“struts”,這表示該請求與這個Action來匹配,就會調用該Action中class屬性指定的Action類。但是在Struts 2中,用戶定義的Action類并不是業(yè)務控制器,而是Action代理,其并沒有和Servlet API耦合。所以Struts 2框架提供了一系列的攔截器,它負責將HttpServletRequest請求中的請求參數(shù)解析出來,傳入到用戶定義的Action類中。,3.2.2 Struts 2工作流程及各種文件詳解,2. Struts 2中各種文件詳解 (1)web.xml文件 后面的webapp標簽中配置了下面這樣一段: struts2 org.apache.struts2.dispatcher.FilterDispatcher struts2 /* 可以看出,里面配置了一個過濾器,那么就先來介紹過濾器的使用。 Filter過濾器是Java項目開發(fā)中的一種常用技術。它是用戶請求和處理程序之間的一層處理程序。它可以對用戶請求和處理程序響應的內容進行處理,通常用于權限控制、編碼轉換等場合。,3.2.2 Struts 2工作流程及各種文件詳解,所有過濾器必須實現(xiàn)java.Serlvet.Filter接口,這個接口中含有3個過濾器類必須實現(xiàn)的方法: init(FilterConfig):Servlet過濾器的初始化方法,Servlet容器創(chuàng)建Servlet過濾器實例后將調用這個方法。 doFilter(ServletRequest,ServletResponse,FilterChain):完成實際的過濾操作,當用戶請求與過濾器關聯(lián)的URL時,Servlet容器將先調用過濾器的doFilter方法,返回響應之前也會調用此方法。FilterChain參數(shù)用于訪問過濾器鏈上的下一個過濾器。 destroy():Servlet容器在銷毀過濾器實例前調用該方法,這個方法可以釋放Servlet過濾器占用的資源,過濾器類編寫完成后,必須要在web.xml中進行配置,格式如下: 過濾器名 過濾器對應類 參數(shù)名稱 參數(shù)值 ,3.2.2 Struts 2工作流程及各種文件詳解,過濾器的關聯(lián)方式有3種:與一個URL關聯(lián)、與一個URL目錄下的所有資源關聯(lián)、與一個Servlet關聯(lián)。 與一個URL資源關聯(lián): 過濾器名 xxx.jsp 與一個URL目錄下的所有資源關聯(lián): 過濾器名 /* 與一個Servlet關聯(lián): 過濾器名 Servlet名稱 ,3.2.2 Struts 2工作流程及各種文件詳解,(2)struts.xml文件 struts.xml文件通常放在Web應用程序的WEB-INF/classes目錄下,該目錄下的struts.xml將被Struts 2框架自動加載。 struts.xml文件是一個XML文件,文件前面是XML的頭文件,然后是標簽,位于Struts 2配置的最外層,其他標簽都是包含在它里面的。 (3)package元素 與Java中的包不同的是,Struts 2中的包可以擴展另外的包,從而“繼承”原有包的所有定義,并可以添加自己包的特有配置,以及修改原有包的部分配置。從這一點上看,Struts 2中的包更像Java中的類。package有以下幾個常用屬性: name:該屬性是必選的,指定包的名字,這個名字將作為引用該包的鍵。 extends:該屬性是可選的,允許一個包繼承一個或多個先前定義的包。 abstract:該屬性是可選的,將其設置為true,可以把一個包定義為抽象的。,3.2.2 Struts 2工作流程及各種文件詳解,namespace:該屬性是可選的,將保存的action配置為不同的名稱空間??聪旅孢@個例子: /foo.jsp /bar.jsp /moo.jsp /bar.jsp ,3.2.2 Struts 2工作流程及各種文件詳解,(4)Action元素 當一個請求匹配到某個Action名字時,框架就使用這個映射來確定如何處理請求。 /welcome.jsp /hello.jsp 如果一個請求要調用Action類中的其他方法,就需要在Action配置中加以配置。例如,如果在org.action.StrutsAction中有另外一個方法為: public String find() throws Exceptionreturn SUCCESS; 那么如果想要調用這個方法,就必須在Action中配置method屬性,其配置方法為: /welcome.jsp /hello.jsp ,3.2.2 Struts 2工作流程及各種文件詳解,(5)result元素 一個result代表一個可能的輸出。當Action類中的方法執(zhí)行完成時,返回一個字符串類型的結果代碼,框架根據(jù)這個結果代碼選擇對應的result,向用戶輸出。 參數(shù)值 param中的name屬性有兩個值: location:指定邏輯視圖。 parse:是否允許在實際視圖名中使用OGNL表達式,參數(shù)默認為true。 result中的name屬性有如下值: success:表示請求處理成功,該值也是默認值。 error:表示請求處理失敗。 none:表示請求處理完成后不跳轉到任何頁面。 input:表示輸入時如果驗證失敗應該跳轉到什么地方(關于驗證后面會介紹)。 login:表示登錄失敗后跳轉的目標。,3.2.2 Struts 2工作流程及各種文件詳解,type(非默認類型)屬性支持的結果類型有以下幾種: chain:用來處理Action鏈。 chart:用來整合JFreeChart的結果類型。 dispatcher:用來轉向頁面,通常處理JSP,該類型也為默認類型。 freemarker:處理FreeMarker模板。 httpheader:控制特殊HTTP行為的結果類型。 jasper:用于JasperReports整合的結果類型。 jsf:JSF整合的結果類型。 redirect:重定向到一個URL。 redirect-action:重定向到一個Action。 stream:向瀏覽器發(fā)送InputStream對象,通常用來處理文件下載,還可用于返回AJAX數(shù)據(jù)。 tiles:與Tiles整合的結果類型。 velocity:處理Velocity模板。 xslt:處理XML/XLST模板。 plaintext:顯示原始文件內容,如文件源代碼。,3.2.2 Struts 2工作流程及各種文件詳解,edirect-action類型用于當一個Action處理結束后,直接將請求重定向到另一個Action。如下列配置: /welcome.jsp /hello.jsp struts ,3.2.2 Struts 2工作流程及各種文件詳解,(6)ActionSupport類 ActionSupport類為Action提供了一些默認實現(xiàn),主要包括預定義常量、從資源文件中讀取文本資源、接收驗證錯誤信息和驗證的默認實現(xiàn)。 下面是ActionSupport類所實現(xiàn)的接口: public class ActionSupport implements Action, Validateable, ValidationAware, TextProvider, LocaleProvider,Serializable Action接口同樣位于com.opensymphony.xwork2包,定義了一些常量和一個execute()方法。 public interface Action public static final String SUCCESS=“success“; public static final String NONE=“none“; public static final String ERROR=“error“; public static final String INPUT=“input“; public static final String LOGIN=“l(fā)ogin“; public String execute() throws Exception; ,3.2.2 Struts 2工作流程及各種文件詳解,由于3.2.1節(jié)的例子中繼承了ActionSupport類,所以可以看出,在execute的返回值中,其代碼可以改為: public String execute() throws Exception if(!name.equals(“HelloWorld“) Map request=(Map)ActionContext.getContext().get(“request“); request.put(“name“,getName(); return SUCCESS; else return ERROR; ,3.2.3 Struts 2數(shù)據(jù)驗證及驗證框架的應用,1. 數(shù)據(jù)校驗 下面來看其實現(xiàn),可以把3.2.1節(jié)的例子中的Action類改寫成。 如果執(zhí)行該方法之后,Action類的fieldErrors中已經包含了數(shù)據(jù)校驗錯誤信息,將把請求轉發(fā)到input邏輯視圖處,所以要在Action配置中加入以下代碼: /welcome.jsp /hello.jsp /hello.jsp ,3.2.3 Struts 2數(shù)據(jù)驗證及驗證框架的應用,把JSP頁面改寫一下(標簽的具體應用會在3.3節(jié)具體講解): struts 2 ,3.2.3 Struts 2數(shù)據(jù)驗證及驗證框架的應用,修改之后,部署運行。不輸入任何姓名直接提交,將會看到如圖3.5所示的界面。,圖3.5 校驗結果,3.2.3 Struts 2數(shù)據(jù)驗證及驗證框架的應用,2. Struts 2驗證框架的應用 Struts 2提供了校驗框架,只需要增加一個校驗配置文件,就可以完成對數(shù)據(jù)的校驗。Struts 2提供了大量的數(shù)據(jù)校驗器,包括表單域校驗器和非表單域校驗器兩種。 (1)必填字符串校驗器 其校驗規(guī)則定義文件如下: true 姓名是必需的! ,3.2.3 Struts 2數(shù)據(jù)驗證及驗證框架的應用,下面具體介紹其他校驗框架的應用。 (2)必填校驗器 該校驗器的名字是required,也就是屬性中的type=“required“,該校驗器要求指定的字段必須有值,與必填字符串校驗器最大的區(qū)別就是可以有空字符串。如果把上例改為必填校驗器,其代碼應為: 姓名是必需的! ,3.2.3 Struts 2數(shù)據(jù)驗證及驗證框架的應用,(3)整數(shù)校驗器 該校驗器的名字是int,該校驗器要求字段的整數(shù)值必須在指定范圍內,故其有min和max參數(shù)。如果有個age輸入框,要求其必須是整數(shù),且輸入值必須在18與100之間,該校驗器的配置應該為: 18 100 年齡必須在18至100之間 ,3.2.3 Struts 2數(shù)據(jù)驗證及驗證框架的應用,(4)日期校驗器 該校驗器的名字是date,該校驗器要求字段的日期值必須在指定范圍內,故其有min和max參數(shù)。其配置格式如下: 1980-01-01 2009-12-31 日期必須在1980-01-01至2009-12-31之間 ,3.2.3 Struts 2數(shù)據(jù)驗證及驗證框架的應用,(5)郵件地址校驗器 該校驗器的名稱是email,該校驗器要求字段的字符如果非空,就必須是合法的郵件地址。如下面的代碼: 必須輸入有效的電子郵件地址 ,3.2.3 Struts 2數(shù)據(jù)驗證及驗證框架的應用,(6)網(wǎng)址校驗器 該校驗器的名稱是url,該校驗器要求字段的字符如果非空,就必須是合法的URL地址。如下面的代碼: 必須輸入有效的網(wǎng)址 ,3.2.3 Struts 2數(shù)據(jù)驗證及驗證框架的應用,(7)字符串長度校驗器 該校驗器的名稱是stringlength,該校驗器要求字段的長度必須在指定的范圍內,一般用于密碼輸入框。如下面的代碼: 6 20 密碼長度必須在6到20之間 ,3.2.3 Struts 2數(shù)據(jù)驗證及驗證框架的應用,(8)正則表達式校驗器 該校驗器的名稱是regex,它檢查被校驗字段是否匹配一個正則表達式。如下面的代碼: 學號必須是6位的數(shù)字 ,3.3 Struts 2標簽庫應用,3.3.1 Struts 2的OGNL表達式 在介紹標簽庫前,有必要先來學習Struts 2的OGNL表達式。 1. OGNL表達式 OGNL表達式是Struts 2框架的特點之一。 標準的OGNL會設定一個根對象(root對象)。假設使用標準OGNL表達式來求值(不是Struts 2 OGNL),如果OGNL上下文有兩個對象foo對象和bar對象,同時foo對象被設置為根對象(root),則利用下面的OGNL表達式求值。 #foo.blah / 返回foo.getBlah() #bar.blah / 返回bar.getBlah() blah / 返回foo.getBlah(),因為foo為根對象,3.3.1 Struts 2的OGNL表達式,在Struts 2框架中,值棧(Value Stack)就是OGNL的根對象。假設值棧中存在兩個對象實例Man和Animal,這兩個對象實例都有一個name屬性,Animal有一個species屬性,Man有一個salary屬性。假設Animal在值棧的頂部,Man在Animal后面,如圖3.6所示。,圖3.6 一個包含了Animal和Man的值棧,3.3.1 Struts 2的OGNL表達式,下面的代碼片段能更好地理解OGNL表達式。 species / 調用animal.getSpecies() salary / 調用man.getSalary() name / 調用animal.getName(),因為Animal位于值棧的頂部 最后一行實例代碼返回的是animal.getName()返回值,即返回了Animal的name屬性,因為Animal是值棧的頂部元素,OGNL將從頂部元素搜索,所以會返回Animal的name屬性值。如果要獲得Man的name值,則需要如下代碼: Struts 2允許在值棧中使用索引,實例代碼如下: 0.name / 調用animal.getName() 1.name / 調用man.getName(),3.3.1 Struts 2的OGNL表達式,Struts 2中的OGNL Context是ActionContext,如圖3.7所示。,圖3.7 Struts 2的OGNL Context結構示意圖,3.3.1 Struts 2的OGNL表達式,由于值棧是Struts 2中OGNL的根對象。如果用戶需要訪問值棧中的對象,則可以通過如下代碼訪問值棧中的屬性: $foo / 獲得值棧中的foo屬性 如果訪問其他Context中的對象,由于不是根對象,在訪問時需要加#前綴。 application對象:用來訪問ServletContext,如#application.userName或者#application “userName“,相當于調用Servlet的getAttribute(“userName“)。 session對象:用來訪問HttpSession,如#session.userName或者#session“userName“,相當于調用session.getAttribute(“userName“)。 request對象:用來訪問HttpServletRequest屬性的Map,如#request.userName或者#request“userName“,相當于調用request.getAttribute(“userName“)。如在3.2.1節(jié)中StrutsAction類中代碼: Map request=(Map)ActionContext.getContext().get(“request“); request.put(“name“,getName(); 這就是先得到request對象,然后把值放進去,在該例的success.jsp中有: 其中#相當于調用了request.getAttribute(“name“)。,3.3.1 Struts 2的OGNL表達式,2. OGNL集合操作 使用如下代碼直接生成一個List對象: e1, e2, e3 下面的代碼可以直接生成一個Map對象: #key: value1, key2: value2, 對于集合類型,OGNL表達式可以使用in和not in兩個元素符號。其中,in表達式用來判斷某個元素是否在指定的集合對象中;not in判斷某個元素是否不在指定的集合對象中,代碼如下所示: 或 ,3.3.1 Struts 2的OGNL表達式,除了in和not in之外,OGNL還允許使用某個規(guī)則獲得集合對象的子集,常用的有以下3個相關操作符。 ?:獲得所有符合邏輯的元素。 :獲得符合邏輯的第一個元素。 $:獲得符合邏輯的最后一個元素。 如下面的代碼: Person .relatives.?# this.gender=male 該代碼可以獲得Person的所有性別為male的relatives集合。,3.3.2 數(shù)據(jù)標簽,數(shù)據(jù)標簽屬于非UI標簽,主要用于提供各種數(shù)據(jù)訪問相關的功能,數(shù)據(jù)標簽主要包括以下幾個。 property:用于輸出某個值。 set:用于設置一個新變量。 param:用于設置參數(shù),通常用于bean標簽和action標簽的子標簽。 bean:用于創(chuàng)建一個JavaBean實例。 action:用于在JSP頁面直接調用一個Action。 date:用于格式化輸出一個日期。 debug:用于在頁面上生成一個調試鏈接,當單擊該鏈接時,可以看到當前值棧和Stack Context中的內容。 il8n:用于指定國際化資源文件的baseName。 include:用于在JSP頁面中包含其他的JSP或Servlet資源。 push:用于將某個值放入值棧的棧頂。 text:用于輸出國際化(國際化內容會在后面講解)。 url:用于生成一個URL地址。,3.3.2 數(shù)據(jù)標簽,1. 標簽 property標簽的作用是輸出指定值。property標簽輸出value屬性指定的值。如果沒有指定的value屬性,則默認輸出值棧棧頂?shù)闹?。該標簽有如下幾個屬性: default:該屬性是可選的,如果需要輸出的屬性值為null,則顯示default屬性指定的值。 escape:該屬性是可選的,指定是否escape HTML代碼。 value:該屬性是可選的,指定需要輸出的屬性值,如果沒有指定該屬性,則默認輸出值棧棧頂?shù)闹?。該屬性也是最常用的,如前面用到的?id:該屬性是可選的,指定該元素的標志。,3.3.2 數(shù)據(jù)標簽,2. 標簽 該標簽有如下幾個屬性: name:該屬性是必選的,重新生成新變量的名字。 scope:該屬性是可選的,指定新變量的存放范圍。 id:該屬性是可選的,指定該元素的引用id。 下面是一個簡單例子,展示了property標簽訪問存儲于session中的user對象的多個字段: 使用set標簽使得代碼易于閱讀: ,3.3.2 數(shù)據(jù)標簽,3. 標簽 param標簽主要用于為其他標簽提供參數(shù),該標簽有如下幾個屬性: name:該屬性是可選的,指定需要設置參數(shù)的參數(shù)名。 value:該屬性是可選的,指定需要設置參數(shù)的參數(shù)值。 id:該屬性是可選的,指定引用該元素的id。 例如,要為name為fruit的參數(shù)賦值: apple 或者 如果想指定fruit參數(shù)的值為apple字符串,則應該這樣寫: ,3.3.2 數(shù)據(jù)標簽,4. 標簽 該標簽有如下幾個屬性: name:該屬性是必選的,用來指定要實例化的JavaBean的實現(xiàn)類。 id:該屬性是可選的,如果指定了該屬性,則該JavaBean實例會被放入Stack Context中,從而允許直接通過id屬性來訪問該JavaBean實例。下面是一個簡單的例子: 有一個Student類,該類中有name屬性,并有其getter和setter方法: public class Student private String name; public String getName() return name; public void setName(String name) =name; 然后在JSP文件的body體中加入下面的代碼: ,3.3.2 數(shù)據(jù)標簽,在項目中導入Struts 2的5個重要Jar包,再把Student類放在項目的src文件夾下,標簽內容放在一個JSP文件的body體內,再修改web.xml文件,就可以部署運行該項目,會得到如圖3.8所示的界面。,圖3.8 bean標簽實例界面,如果把bean標簽的內容改為: ,3.3.2 數(shù)據(jù)標簽,5. 標簽 使用action標簽可以允許在JSP頁面中直接調用Action。該標簽有以下幾個屬性: id:該屬性是可選的,該屬性將會作為該Action的引用標志id。 name:該屬性是必選的,指定該標簽調用哪個Action。 namespace:該屬性是可選的,指定該標簽調用的Action所在的namespace。 executeResult:該屬性是可選的,指定是否要將Action的處理結果頁面包含到本頁面。如果值為true,就是包含,false就是不包含,默認為false。 ignoreContextParam:該屬性是可選的,指定該頁面中的請求參數(shù)是否需要傳入調用的Action。如果值為false,將本頁面的請求參數(shù)傳入被調用的Action。如為true,不將本頁面的請求參數(shù)傳入到被調用的Action。,3.3.2 數(shù)據(jù)標簽,6. 標簽 date標簽主要用于格式化輸出一個日期。該標簽有如下屬性: format:該屬性是可選的,如果指定了該屬性,將根據(jù)該屬性指定的格式來格式化日期。 nice:該屬性是可選的,該屬性的取值只能是true或false,用于指定是否輸出指定日期和當前時刻之間的時差。默認為false,即不輸出時差。 name:屬性是必選的,指定要格式化的日期值。 id:屬性是可選的,指定引用該元素的id值。 nice屬性為true時,一般不指定format屬性。因為nice為true時,會輸出當前時刻與指定日期的時差,不會輸出指定日期。當沒有指定format,也沒有指定nice=“true“時,系統(tǒng)會采用默認格式輸出。其用法為: ,3.3.2 數(shù)據(jù)標簽,7. 標簽 include標簽用于將一個JSP頁面或一個Servlet包含到本頁面中。該標簽有如下屬性: value:該屬性是必選的,指定需要被包含的JSP頁面或Servlet。 id:該屬性是可選的,指定該標簽的id引用。 用法如下: ,3.3.3 控制標簽,控制標簽有以下幾個: if:用于控制選擇輸出的標簽。 elseif:用于控制選擇輸出的標簽,必須和if標簽結合使用。 else:用戶控制選擇輸出的標簽,必須和if標簽結合使用。 append:用于將多個集合拼接成一個新的集合。 generator:用于將一個字符串按指定的分隔符分隔成多個字符串,臨時生成的多個子字符串可以使用iterator標簽來迭代輸出。 iterator:用于將集合迭代輸出。 merge:用于將多個集合拼接成一個新的集合,但與append的拼接方式不同。 sort:用于對集合進行排序。 subset:用于截取集合的部分元素,形成新的子集合。,3.3.3 控制標簽,1. /標簽 這3個標簽可以組合使用,但只有if標簽可以單獨使用,而elseif和else標簽必須與if標簽結合使用。if標簽可以與多個elseif標簽結合使用,但只能與一個else標簽使用。其用法格式如下: 標簽體 標簽體 . 標簽體 ,3.3.3 控制標簽,2. 標簽 該標簽主要用于對集合進行迭代,這里的集合包含List、Set,也可以對Map類型的對象進行迭代輸出。該標簽的屬性如下: value:該屬性是可選的,指定被迭代的集合,被迭代的集合通常都由OGNL表達式指定。如果沒有指定該屬性,則使用值棧棧頂?shù)募稀?id:該屬性是可選的,指定集合元素的id。 status:該屬性是可選的,指定迭代時的IteratorStatus實例,通過該實例可判斷當前迭代元素的屬性。如果指定該屬性,其實例包含如下幾個方法: int getCount():返回當前迭代了幾個元素。 int getIndex():返回當前被迭代元素的索引。 boolean isEven:返回當前被迭代元素的索引元素是否是偶數(shù)。 boolean isOdd:返回當前被迭代元素的索引元素是否是奇數(shù)。 boolean isFirst:返回當前被迭代元素是否是第一個元素。 boolean isLast:返回當前被迭代元素是否是最后一個元素。,3.3.3 控制標簽,應用舉例: 控制標簽 style=“background-color:silver“ ,3.3.3 控制標簽,通過添加Struts 2必須的Jar包,再建立上面JSP文件,修改web.xml后,就可以部署運行,運行結果如圖3.9所示。,圖3.9 iterator標簽實例運行結果,3.3.3 控制標簽,3. 標簽 應用舉例,可以把上例的JSP文件進行修改,其代碼為: 控制標簽 style=“background-color:silver“ ,3.3.3 控制標簽,部署運行,運行結果如圖3.10所示。,圖3.10 append標簽實例運行界面,3.3.3 控制標簽,4標簽 假設有2個集合,第一個集合包含3個元素,第二個集合包含2個元素,分別用append標簽和merge標簽方式進行拼接,它們產生新集合的方式有所區(qū)別。下面分別列出: 用append方式拼接,新集合元素順序為: 第1個集合中的第1個元素 第1個集合中的第2個元素 第1個集合中的第3個元素 第2個集合中的第1個元素 第2個集合中的第2個元素 用merge方式拼接,新集合元素順序為: 第1個集合中的第1個元素 第2個集合中的第1個元素 第1個集合中的第2個元素 第2個集合中的第2個元素 第1個集合中的第3個元素,3.3.4 表單標簽,大部分的表單標簽和HTML表單元素是一一對應的關系,如下面的代碼片段: 對應著: 對應著: 用戶名: 對應著: 密碼: 還有下面這種情況,如果有這樣一個JavaBean類,類名為“User”,該類中有兩個屬性:一個是username;另一個是password,并分別生成它們的getter和setter方法,在JSP頁面的表單中可以這樣為表單元素命名: ,3.3.4 表單標簽,1. 標簽 該標簽需要指定一個list屬性。用法舉例: 或者為: 這兩種方式的區(qū)別:前一種根據(jù)name取值時取的是選中字符串的值;后一種在頁面上顯示的是value的值,而根據(jù)name取值時取的卻是對應的key,這里就是1、2、3或4。 2. 標簽 combobox標簽生成一個單行文本框和下拉列表框的組合。兩個表單元素只能對應一個請求參數(shù),只有單行文本框里的值才包含請求參數(shù),下拉列表框只是用于輔助輸入,并沒有name屬性,故不會產生請求參數(shù)。用法舉例: ,3.3.4 表單標簽,3. 標簽 datetimepicker標簽用于生成一個日期、時間下拉列表框。當使用該日期、時間列表框選擇某個日期、時間時,系統(tǒng)會自動將選中日期、時間輸出指定文本框中。用法舉例: 4. 標簽 select標簽用于生成一個下拉列表框,通過為該元素指定list屬性的值,來生成下拉列表框的選項。用法舉例: 或者為: ,3.3.4 表單標簽,5. 標簽 radio標簽的用法與checkboxlist用法很相似,唯一的區(qū)別就是checkboxlist生成的是復選框,而radio生成的是單選框。用法舉例: 或者為: 6. 標簽 head標簽主要用于生成HTML頁面的head部分。在介紹標簽時說過,要在head中加入該標簽,主要原因是標簽中有一個日歷小控件,其中包含了JavaScript代碼,所以要在head部分加入該標簽。,3.3.5 非表單標簽,非表單標簽主要用于在頁面中生成一些非表單的可視化元素。這些標簽不經常用到,下面大致介紹一下這些標簽: a:生成超鏈接。 actionerror:輸出Action實例的getActionMessage()方法返回的消息。 component:生成一個自定義組件。 div:生成一個div片段。 fielderror:輸出表單域的類型轉換錯誤、校驗錯誤提示。 tablePanel:生成HTML頁面的Tab頁。 tree:生成一個樹形結構。 treenode:生成樹形結構的節(jié)點。,3.4 Struts 2攔截器,3.4.1 攔截器配置 定義攔截器使用元素。其格式為: 只要在與之間配置子元素即可傳入相應的參數(shù)。其格式如下: 參數(shù)值 . 通常情況下,一個Action要配置不僅一個攔截器,往往多個攔截器一起使用來進行過濾。這時就會把需要配置的幾個攔截器組成一個攔截器棧。定義攔截器棧用元素,由于攔截器棧是由各攔截器組合而成的,所以需要在該元素下面配置子元素來對攔截器進行引用。其格式如下: ,3.4.1 攔截器,下面是默認攔截器的配置方法: ,3.4.2 攔截器實現(xiàn)類,Struts 2提供了一些接口或類供程序員自定義攔截器。如Struts 2提供了com.opensymphony. erceptor.Interceptor接口,程序員只要實現(xiàn)該接口就可完成攔截器實現(xiàn)類。該接口的代碼如下: import java.io.Serializable; import com.opensymphony.xwork2.ActionInvocation; public interface Interceptor extends Serializable void init(); String intercept(ActionInvocation invocation) throws Exception; void destroy(); 該接口中有三個方法: init():該方法在攔截器被實例化之后、攔截器執(zhí)行之前調用。 intercept(ActionInvocation invocation):該方法用于實現(xiàn)攔截的動作。 destroy():該方法與init()方法對應,攔截器實例被銷毀之前調用,用于銷毀在init()方法中打開的資源。,3.4.3 實例應用自定義攔截器,下面來配置攔截器,如果輸入框中輸入的內容是“hello”,返回當前頁面。實現(xiàn)該功能只需要在原項目的基礎上配置攔截器即可。首先編寫攔截器實現(xiàn)類,代碼如下: package org.tool; import org.action.StrutsAction; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionInvocation; import erceptor.AbstractInterceptor; public class MyInterceptor extends AbstractInterceptor public String intercept(ActionInvocation arg0) throws Exception / 得到StrutsAction類對象 StrutsAction action=(StrutsAction)arg0.getAction(); / 如果Action類中的name屬性的值為“hello“,返回錯誤頁面 if(action.getName().equals(“hello“) return Action.ERROR; / 繼續(xù)執(zhí)行其他攔截器或Action類中的方法 return arg0.invoke(); ,3.4.3 實例應用自定義攔截器,在struts.xml配置文件中進行攔截器配置,修改后的代碼如下: /welcome.jsp /hello.jsp /hello.jsp ,3.4.3 實例應用自定義攔截器,經過這樣簡單的配置后,重新部署項目,在運行界面輸入“hello”,也會經過攔截返回到當前頁面,如圖3.11、圖3.12所示。,圖3.11 運行界面 圖3.12 提交后返回當前頁面,3.5 Struts 2國際化應用,下面以登錄界面為例,講解國際化應用內容。 1. 建立項目 打開MyEclipse,建立一個Web項目,命名為“Test”。 2. 加載Struts 2的基本類庫 該步驟與3.2.1節(jié)中的第3步步驟相同,這里不再贅述。 3. 修改web.xml 其內容見3.2.1節(jié)第4步。,3.5 Struts 2國際化應用,4. 建立資源文件 需要在項目的src文件夾下建立一個名為“perties”的文件。只需要在該文件中編寫下面代碼: struts.custom.il8n.resources=資源文件名 該例中資源文件名為“messgageResource”,故perties應為: struts.custom.il8n.resources= messgageResource 下面來建立兩個資源文件,分別為中文和英文。 username=DLM password=KL login=login 可以看出,它們分別是一個key-value對。然后再提供下面的文件: username=登錄名 password=口令 login=登錄,3.5 Struts 2國際化應用,將上面文件以“messageResource_perties”為文件名保存在項目的WEB-INF/classes文件夾下,因為該文件包含了非西歐字符,所以必須用native2ascii命令來處理。選擇【開始】【運行】菜單項,輸入“cmd”,看到如圖3.13所示的界面。,圖3.13 輸入cmd后的界面,3.5 Struts 2國際化應用,然后輸入找到項目的class路徑下,如“D:lybworkspaceTestWebRootWEB-INFclasses”,得到如圖3.14所示的界面。在命令行輸入“native2ascii messageResource_perties messageResource_zh_CN.properties”。這樣就會在class路徑下產生messageResource_zh _CN.properties文件。,圖3.14 找到項目的class路徑,3.5 Struts 2國際化應用,5. 建立login.jsp文件 Struts 2訪問國際化消息主要有以下三種方式: 在JSP頁面中輸出國際化消息,可以使用Struts 2的標簽,該標簽可以指定name屬性,該屬性指定國際化資源文件中的key。 在Action中訪問國際化消息,可以使用ActionSupport類的getText()方法,該方法可以接收一個參數(shù),該參數(shù)指定了國際化資源文件中的key。 在表單元素的label屬性里輸出國際化信息,可以為該表單標簽指定一個key屬性,該屬性指定了國際化資源文件中的key。,3.5 Struts 2國際化應用,下面是login.jsp文件代碼: ,3.5 Struts 2國際化應用,6. 部署運行 部署運行項目,右擊“IE瀏覽器”,選擇【屬性】【語言】菜單項,修改瀏覽器應用語言,當中文在最上方時表示當前為中文環(huán)境,而相應的英文在最上面時表示當前為英文環(huán)境??梢?
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 白城醫(yī)學高等??茖W?!陡唠妷号c絕緣技術》2023-2024學年第二學期期末試卷
- 齊齊哈爾理工職業(yè)學院《廣告策劃與新媒體設計》2023-2024學年第二學期期末試卷
- 四川文化傳媒職業(yè)學院《創(chuàng)業(yè)模擬實訓》2023-2024學年第二學期期末試卷
- 合肥城市學院《汽車檢測與故障診斷技術》2023-2024學年第二學期期末試卷
- 汝州職業(yè)技術學院《計算思維方法》2023-2024學年第二學期期末試卷
- 產品設計結構體系
- 2025酒店員工勞動合同模板
- 2025關于水利工程施工監(jiān)理合同協(xié)議書范本
- 2025煤炭交易合同代理
- 2025南京市商品房買賣合同模板及注意事項(合同協(xié)議范本)
- 湖南少數(shù)民族舞蹈智慧樹知到期末考試答案章節(jié)答案2024年湖南師范大學
- 公園維修施工組織設計方案方案
- DZ∕T 0153-2014 物化探工程測量規(guī)范(正式版)
- 2024年百聯(lián)集團有限公司招聘筆試沖刺題(帶答案解析)
- 以案促改學習研討發(fā)言材料
- 手術室常用藥物
- 安防監(jiān)控系統(tǒng)維保表格完整
- 服飾項目經濟效益分析報告
- 數(shù)字貿易學 課件 第18、19章 全球數(shù)字經濟治理概述、包容性發(fā)展與全球數(shù)字鴻溝
- 學校護蕾行動工作方案及計劃書
- 武漢美食介紹PPT
評論
0/150
提交評論