日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Struts 1高级应用

發(fā)布時間:2024/1/23 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Struts 1高级应用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

??在線課堂:https://edu.csdn.net/lecturer/1516?

學(xué)習(xí)內(nèi)容

?DispatchAction

?類型轉(zhuǎn)換器

?Struts 1異常處理

能力目標(biāo)

?能熟練使用DispatchAction簡化開發(fā)

?能根據(jù)具體情況使用國際化和異常處理

?

?

本章簡介

在前面兩章中,我們學(xué)習(xí)了Struts 1的基礎(chǔ)知識,包括Struts 1的運行原理、體系結(jié)構(gòu)和標(biāo)簽庫等。Struts作為經(jīng)典的MVC框架給開發(fā)人員帶來了更加簡單和高效的開發(fā)模式,并且增強了應(yīng)用程序的健壯性、重用性和擴展性。

在應(yīng)用開發(fā)工作中中,我們會遇到一些復(fù)雜的業(yè)務(wù),這時如果只使用前面的內(nèi)容將很難解決問題或著解決起來相當(dāng)麻煩。本章將學(xué)習(xí)一些Struts 1的高級內(nèi)容,?DispatchAction、國際化等,通過這些內(nèi)容我們可以簡化對復(fù)雜業(yè)務(wù)的處理。

核心技能部分

2.1?DispatchAction

在第一章,我們使用Struts實現(xiàn)了對管理員的增、刪、改、查等操作。在實現(xiàn)過程中,我們使用了多個Action處理不同的業(yè)務(wù),例如LoginAction處理登錄業(yè)務(wù),AddAction處理添加管理員業(yè)務(wù),DelAction處理刪除管理員業(yè)務(wù)。在struts-config.xml中需要對這些Action分別進行配置。一個Action處理一個業(yè)務(wù)雖然可行,但是配置繁瑣,代碼重復(fù),不利于維護和擴展,為了改變這種情況,可以使用DispatchAction類。

DispatchAction類是Action的子類,在該類中我們無需重寫execute方法,而是可以自定義多個業(yè)務(wù)處理方法,這就避免了每個業(yè)務(wù)都需要一個Action的情況。

下面我們通過一個案例來演示DispatchAction的使用和配置。圖2.1.1是我們第二階段學(xué)習(xí)時用過的圖書表,現(xiàn)在針對這個表實現(xiàn)查詢功能,包括按書名查詢、按作者查詢和按出版社名查詢。

圖2.1.1 book表

(1)?創(chuàng)建對應(yīng)圖書表的實體Bean(Book),代碼如示例2.1所示。

示例2.1

?

public class Book { private String ISBN; private String name; private String author; private String publish; private double price; private int currcount; public Book() { } public Book(String iSBN, String name, String author, String publish, double price, int currcount) { ISBN = iSBN; this.name = name; this.author = author; this.publish = publish; this.price = price; this.currcount = currcount; } //省略getter/setter方法 }

?

?

?

?

?

(2)?實現(xiàn)數(shù)據(jù)庫連接和關(guān)閉的工廠類DaoFactory不再給出參考代碼,下面是使用JDBC實現(xiàn)查詢功能的JavaBean(BookDao)。

示例2.2

?

public class BookDao { Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; public List<Book> getBooks(String colName,String keyWords) { //查詢圖書 List<Book> BookList=new ArrayList<Book>(); try { conn=DaoFactory.getConn(); stmt=conn.prepareStatement("select * from BOOK where "+colName+"like ?"); stmt.setString(1, "%"+keyWords+"%"); rs=stmt.executeQuery(); while(rs.next()) { Book book=new Book(); book.setISBN(rs.getString(1)); book.setName(rs.getString(2)); book.setAuthor(rs.getString(3)); book.setPublish(rs.getString(4)); book.setPrice(rs.getFloat(5)); book.setCurrcount(rs.getInt(6)); BookList.add(book); } } catch (Exception e) { e.printStackTrace(); } finally{ DaoFactory.closeAll(rs,stmt,conn); } return BookList; } }

?

?

?

?

?

我們需要實現(xiàn)三種查詢:按書名查詢、按作者查詢和按出版社查詢。不管哪種查詢,在使用JDBC實現(xiàn)時都會出現(xiàn)很多重復(fù)代碼,因為變化的只有列名和用戶輸入關(guān)鍵字。為了避免代碼重復(fù),我們在BookDao類中定義了一個帶參的方法getBooks(String colName, String keyWords),第一個參數(shù)表示列名,第二個參數(shù)表示用戶輸入的關(guān)鍵字。

(3)?創(chuàng)建查詢視圖頁面(query.html),該頁面主要包含一個表單,如圖2.1.2所示。

?

圖2.1.2 查詢頁面

參考代碼如示例2.3所示。代碼比較簡單,但是請大家注意其中的加粗部分,這些代碼會在以后的內(nèi)容中合適的位置講解。

示例2.3

?

<form action="query.do" method="post"> <table width="330" height="94" border="0" align="center"> <tr> <td align="center">關(guān)鍵字:<input type="text" name="keywords"></td> </tr> <tr> <td align="center"> <input name="rd" type="radio" value="queryByName" checked>按書名查詢 <input name="rd" type="radio" value="queryByAuthor">按作者查詢 <input name="rd" type="radio" value="queryByPublisher">按出版社查詢 </td> </tr> <tr> <td align="center"><input type="submit" value="查詢"></td> </tr> </table> </form>

?

?

?

?

?

(4)?下面是與表單對應(yīng)的ActionForm(BookForm),代碼比較簡單,此處不再多述。

?

示例3.4

?

public class BookForm extends ActionForm { private String keywords; private String rd; public String getKeywords() { return keywords; } public void setKeywords(String keywords) throwsUnsupportedEncodingException { //為了避免出現(xiàn)中文亂碼,我們對用戶輸入的關(guān)鍵字進行了轉(zhuǎn)碼處理 this.keywords = new String(keywords.getBytes("iso-8859-1"),"utf-8"); } public String getRd() { return rd; } public void setRd(String rd) { this.rd = rd; } }

?

?

?

?

?

(5)?查詢結(jié)果會在視圖list.jsp中顯示,圖2.1.3是按“工業(yè)”出版社進行查詢的結(jié)果。

圖2.1.3 查詢結(jié)果

參考代碼如下所示,代碼比較簡單,此處不再多述。

示例2.5

?

<body> <table border="1" align="center"> <caption>圖書列表</caption> <tr bgcolor="darkgray"> <td align="center">ISBN</td> <td align="center">圖書名稱</td> <td align="center">圖書作者</td> <td align="center">出版社</td> <td align="center">售價</td> <td align="center">庫存</td> </tr> <% List<Book> bookList=(List<Book>)request.getAttribute("bookList"); for(int j=0;j<bookList.size();j++) { Book book=bookList.get(j);%> <tr> <td align="center"><%=book.getISBN() %></td> <td align="center"><%=book.getName() %></td> <td align="center"><%=book.getAuthor() %></td> <td align="center"><%=book.getPublish() %></td> <td align="center"><%=book.getPrice() %></td> <td align="center"><%=book.getCurrcount() %></td> </tr> <% }%> </table> </body>

?

?

?

?

?

(6)?下面就該創(chuàng)建業(yè)務(wù)邏輯控制器Action了,我們可以像第一章那樣:就是一個Action對應(yīng)一個查詢業(yè)務(wù),這就需要創(chuàng)建三個Action,雖然能夠?qū)崿F(xiàn)功能,但是會出現(xiàn)代碼重復(fù)、配置繁瑣的問題,這里我們使用DispatchAction,代碼如下所示。

示例2.6

?

public class BookAction extends DispatchAction { //繼承DispatchAction類 BookDao bd=new BookDao(); List<Book> bookList=new ArrayList<Book>(); //按書名查詢 public ActionForward queryByName(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { BookForm bf=(BookForm)form; bookList=bd.getBooks("NAME",bf.getKeywords()); request.setAttribute("bookList", bookList); return mapping.findForward("list"); } //按作者查詢 public ActionForward queryByAuthor(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { BookForm bf=(BookForm)form; bookList=bd.getBooks("AUTHOR",bf.getKeywords()); request.setAttribute("bookList", bookList); return mapping.findForward("list"); } //按出版社查詢 public ActionForward queryByPublisher(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) { BookForm bf=(BookForm)form; bookList=bd.getBooks("PUBLISH",bf.getKeywords()); request.setAttribute("bookList", bookList); return mapping.findForward("list"); } }

?

?

?

?

?

上述代碼創(chuàng)建了一個業(yè)務(wù)邏輯控制器BookAction類,該類繼承了DispatchAction。在該類中我們并沒有像第一章那樣重寫execute方法,而是自定義了三個方法分別實現(xiàn)三種查詢。

注意:

如果某個類繼承了DispatchAction,那么這個類中自定義的方法必須和execute有一樣的方法簽名,即它的返回值和參數(shù)列表必須和execute方法一樣。

(7)?最后在struts-config.xml中進行相關(guān)配置,代碼如下所示。

示例2.7

?

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd"> <struts-config> <form-beans> <form-bean name="BookForm" type="com.yourcompany.struts.BookForm"/> </form-beans> <action-mappings> <actionname="BookForm" parameter="rd" //參數(shù)屬性path="/query"scope="request"type="com.yourcompany.struts.BookAction"> <forward name="list" path="/list.jsp"/> </action> </action-mappings> </struts-config>

?

?

?

?

?

上述代碼與第一章唯一不同的地方就是加粗部分,這是使用DispatchAction的關(guān)鍵配置。在本案例中,所有業(yè)務(wù)都是由一個Action處理的,或者說每個業(yè)務(wù)對應(yīng)Action中的一個方法,那么Struts是怎么分清不同的業(yè)務(wù)將來由Action中的哪個方法來處理呢?這就需要<action>元素的parameter屬性進行設(shè)置。在本案例中,parameter屬性的值是“rd”,而“rd”是表單中某個元素(單選按鈕)的名字,同時這些表單元素(單選按鈕)value屬性的值正好是BookAction中定義的方法名。弄清楚這些配置后,我們看一下具體使用流程:

(1)?用戶打開表單所在的頁面query.html,輸入關(guān)鍵字并選擇一個單選按鈕,假設(shè)選擇的是【按書名查詢】,該單選按鈕的名字是rd,值是queryByName。

(2)?用戶提交表單時,用戶輸入的關(guān)鍵字和選中的單選按鈕的“名值對”信息被一起發(fā)送到了服務(wù)器端。

(3)?在struts-config.xml文件中,<action>元素的parameter屬性的值是rd,即接收表單中名字是rd元素的值,而這個值是BookAction中一個方法的名字。至此Struts就知道該調(diào)用哪個方法來處理業(yè)務(wù)了。

?一般來說,DispatchAction通常適合多個業(yè)務(wù)公用一個表單的業(yè)務(wù)場合。

?

2.2?使用實體對象簡化ActionForm

在進行Struts開發(fā)時,我們經(jīng)常需要編寫ActionForm或者配置動態(tài)Form來封裝表單數(shù)據(jù),但是當(dāng)數(shù)據(jù)庫表增減字段、業(yè)務(wù)邏輯發(fā)生變化時,我們需要修改相關(guān)的實體類、ActionForm和struts-cofig.xml文件,維護工作十分繁瑣。

根據(jù)以往的經(jīng)驗我們發(fā)現(xiàn):ActionForm和實體類通常非常的相似。例如,在第一章的登錄案例中,實體類和ActionForm的代碼如示例2.8所示。

示例2.8

?

public class Admin { private int id; //登錄ID private String name; //登錄名稱 private String pwd; //登錄密碼//省略getter和setter方法 } public class LoginForm extends ActionForm{ private String logname;//登錄名稱 private String logpwd;//登錄密碼 //省略getter和setter方法 }

上述兩個類幾乎一樣,大部分代碼都是重復(fù)的,所以我們考慮可以通過實體類來簡化ActionForm,即把實體類作為ActionForm的屬性來使用。下面我們對第一章的登錄案例進行優(yōu)化,具體步驟如下:

(1)?修改實體類Admin,使其中的屬性名和表單元素的名字保持一致,代碼如下所示。

示例2.9

?

public class Admin { private int id; //登錄ID private String logname; //登錄名稱 private String logpwd; //登錄密碼 public Admin() { } public Admin(String logname, String logpwd) { this.logname = logname; this.logpwd = logpwd; }//省略getter和setter方法 }

(2)?修改ActionForm,把實體類作為屬性使用,代碼如下所示。

示例2.10

?

public class LoginForm extends ActionForm{ private Admin admin=new Admin(); //使用實體類作為屬性 public Admin getAdmin() { return admin; } public void setAdmin(Admin admin) { this.admin = admin; } }

(3)?修改視圖login.jsp,代碼如下所示。

示例2.11

?

<form action="login.do" method="post" name="loginForm"> <table width="397" height="169" border="0" align="center"> <tr> <td colspan="2" align="center">管理員登錄</td> </tr> <tr> <td width="163" align="right">登錄名稱:</td> <td width="218"><input name="admin.logname" type="text" class="txt"></td> </tr> <tr> <td align="right">登錄密碼:</td> <td><input name="admin.logpwd" type="password" class="txt"></td> </tr> <tr> <td colspan="2" align="center"> <input type="submit" name="Submit" value="提交"></td> </tr> </table> </form>

在上述代碼中,一定要注意加粗顯示的表單元素的名字,這時的命名方式跟以前是不一樣的。表單元素name屬性的值由兩部分組成,中間用“.”隔開,前半部分必須與LoginForm中的屬性名保持一致,后半部分必須與實體類中的某個屬性保持一致。

(4)?修改業(yè)務(wù)邏輯控制器LoginAction,代碼如下所示。

示例2.12

?

public class LoginAction extends Action { public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest req,HttpServletResponse res) { LoginForm lf=(LoginForm)form; String logname=lf.getAdmin().getLogname(); String logpwd=lf.getAdmin().getLogpwd(); AdminDao ad=new AdminDao(); if(ad.checkLogin(logname, logpwd)){ req.setAttribute("admin", new Admin(logname,logpwd)); return mapping.findForward("success"); } else return mapping.findForward("fail"); } }

注意上面加粗部分的代碼,我們首先使用getAdmin()方法獲得Admin實例對象,然后調(diào)用該對象中的getter方法獲得屬性的值。

注意:

在使用實體類作為ActionForm的屬性時,必須在ActionForm中實例化實體類,參看示例2.10中的粗體代碼。

2.3?Struts 1異常處理

當(dāng)我們使用Struts框架進行Web開發(fā)時,如果程序發(fā)生異常,那么這些異常的堆棧信息有可能會顯示到頁面上,這只會讓用戶困惑不解,這種情況顯然對用戶十分的不友好。在Struts1中對異常的處理其實比較簡單,當(dāng)程序發(fā)生異常時,我們只需要跳轉(zhuǎn)到指定的錯誤提示頁面即可。接下來我們就使用Struts1處理異常,具體步驟如下:

(1)?在異??赡馨l(fā)生的位置使用throws關(guān)鍵字聲明異常

?

public class AddForm extends ActionForm { private Date birthday; private int weight; private int height; private String name;public Date getBirthday() { return birthday; } //聲明異常 public void setBirthday(Date birthday) throws Exception{ this.birthday = birthday; } //省略部分代碼 }

?

?

?

?

?

ActionForm使用setter方法封裝表單中的數(shù)據(jù),所以setBirthday方法會引發(fā)異常,我們就給這個方法聲明異常。

(2)?在struts-config.xml中配置全局異常處理元素

?

<global-exceptions> <exception key="" type="java.lang.IllegalArgumentException" path="/error.jsp"/> <exception key="" type="javax.servlet.ServletException" path="/error.jsp"/> </global-exceptions>

<global-exceptions>元素用來配置全局異常,子元素<exception>用來配置具體的異常處理,一個<exception>對應(yīng)一個異常處理。表2-1-1列出了該元素的常用屬性。

表2-1-1 <exception>元素的常用屬性

屬性名

屬性說明

key

從資源文件中獲取錯誤提示消息,沒有使用資源文件的話賦一個空字符串即可。

type

指定要處理的異常類。

path

指定出現(xiàn)異常時跳轉(zhuǎn)到哪個錯誤提示頁面。

(3)?創(chuàng)建錯誤提示頁面error.jsp,代碼如下所示。

?

<html:html> <head> <title>錯誤提示頁面</title> </head> <body> <center> 不好意思,程序暫時出現(xiàn)異常。</center> </body> </html:html>

在本例中,我們直接把錯誤提示消息放在error.jsp頁面中。這時我們再次運行程序就不會出現(xiàn)將異常堆棧信息輸出到客戶端瀏覽器的情況了,而是跳轉(zhuǎn)到了error.jsp頁面中,如圖2.1.4所示。

圖2.1.4 異常處理

2.4?Struts 1國際化

國際化是指我們的Web應(yīng)用程序在運行時根據(jù)客戶端所在國家(地區(qū))的不同而顯示不同的語言界面。在程序中引入國際化的目的是為了給不同國家(地區(qū))的用戶提供自適應(yīng)、更友好的界面。

國際化的英文單詞是Internationalization,簡稱“I18N”,“I”和“N”是單詞的首尾字母,18表示中間的字母數(shù)量。

圖2.1.5和圖2.1.6展示了某個軟件的國際化應(yīng)用。

圖2.1.5 中文語言界面

圖2.1.6 英文語言界面

Struts1提供了對國際化的支持,并且使用起來非常簡單。

首先我們需要定義資源文件,通常需要兩個,一個是中文資源文件,一個是英文資源文件。我們把頁面上的所有文本信息以中英文兩種形式分別保存到這兩個資源文件中。頁面上使用<bean:message>標(biāo)簽可以從資源文件中讀取相應(yīng)文本并顯示到頁面上。

例如,當(dāng)程序運行環(huán)境是在中國時,Struts就通過<bean:message>標(biāo)簽讀取中文資源文件,從而顯示中文界面;當(dāng)運行環(huán)境是在美國時,Struts就通過<bean:message>標(biāo)簽讀取英文資源文件,從而顯示英文界面。

下面我們就給前面添加學(xué)生的程序提供國際化,并以此介紹使用Struts 1國際化的實現(xiàn)步驟。

(1)?創(chuàng)建資源文件。

Struts默認(rèn)創(chuàng)建的資源文件名是ApplicationResources.properties。我們自定義的資源文件可以這樣命名:baseName_language.properties,其中baseName是資源文件的基本名,language表示所支持的語言,例如zh表示中文,en表示英文。本例中我們創(chuàng)建兩個資源文件,分別是ApplicationResources_zh.properties和ApplicationResources_en.properties。

在MyEclipse中打開任意一個資源文件后,可以在【Properties】視圖中通過配置完成資源文件的編寫,如圖2.1.7所示,也可以在【Source】視圖中通過編碼完成資源文件的編寫。

圖2.1.7配置資源文件

下面是ApplicationResources_zh.properties資源文件的源代碼。

?

addstu.title=\u6DFB\u52A0\u5B66\u751F addstu.name=\u5B66\u751F\u59D3\u540D addstu.birthday=\u5B66\u751F\u751F\u65E5 addstu.height=\u5B66\u751F\u8EAB\u9AD8 addstu.weight=\u5B66\u751F\u4F53\u91CD addstu.btn=\u6DFB\u52A0 addstu.exception=\u4E0D\u597D\u610F\u601D\uFF0C\u7A0B\u5E8F\u6682\u65F6\u51FA\u73B0\u5F02\u5E38\u3002 addstu.zh=\u4E2D\u6587 addstu.en=\u82F1\u6587

我們發(fā)現(xiàn)源代碼中出現(xiàn)了很多類似于亂碼的東西,這是因為中文屬于系統(tǒng)不能識別的非西歐文字,必須使用native2ascii命令進行轉(zhuǎn)碼,語法如下所示:

native2ascii源資源文件目標(biāo)資源文件

轉(zhuǎn)碼后,中文就成了亂碼,所以這是正常情況。

下面是ApplicationResources_en.properties資源文件的源代碼。

?

addstu.title=add a new Student addstu.name=student'name addstu.birthday=student'birthday addstu.height=student'height addstu.weight=student'weight addstu.btn=Add addstu.exception=Sorry,Program temporarily appear unusual. addstu.zh=Chinese addstu.en=EngLish

我們看到資源文件是以“鍵值對”的形式進行配置的,“鍵”和“值”都可以自定義,并且英文資源文件和中文資源文件的“鍵”必須相同。

注意

高版本的MyEclipse可以自動對中文資源文件進行轉(zhuǎn)碼,否則就只能使用native2ascii命令手工轉(zhuǎn)碼。

(2)?加載資源文件

資源文件通過struts-config.xml進行配置,默認(rèn)從WEB-INF/classes路徑加載,所以資源文件必須放在WEB-INF/classes路徑或其子路徑下。本例中的資源文件放在com.zy包中,代碼如下所示:

<struts-config>

<!-- 其他代碼省略?-->

<message-resources parameter="com.zy.ApplicationResources" />

</struts-config>

配置時,只需要指定資源文件的基本名即可。

(3)?在頁面中使用<bean:message>標(biāo)簽顯示國際化文本消息。代碼如下所示。

?

<body> <center> <html:link href="changeLang.do?lang=zh"> <bean:message key="addstu.zh"/></html:link> <html:link href="changeLang.do?lang=en"> <bean:message key="addstu.en"/></html:link> </center> <html:form action="add.do" method="post"> <table border="0" align="center"> <caption><bean:message key="addstu.title"/></caption> <tr> <td><bean:message key="addstu.name"/>:</td> <td><html:text property="name"/> <html:errors property="checkName"/></td> </tr> <tr> <td><bean:message key="addstu.birthday"/>:</td> <td><html:text property="birthday"/></td> </tr> <tr> <td><bean:message key="addstu.height"/>:</td> <td><html:text property="height"/></td> </tr> <tr> <td><bean:message key="addstu.weight"/>:</td> <td><html:text property="weight"/></td> </tr> <tr> <td colspan="2" align="center"> <html:submit><bean:message key="addstu.btn"/></html:submit></td> </tr> </table> </html:form> </body>

<bean:message>元素中的key屬性用來從資源文件中取值,所以該屬性的值一定是資源文件中某個“鍵”的名字。

(4)?為了能夠讓用戶自由選擇界面語言,我們在上述代碼中增加了兩個超鏈接,如圖2.1.8所示。

圖2.1.8 中文界面

當(dāng)單擊【中文】超鏈接時,通過一個Action改變當(dāng)前的語言環(huán)境為中文;當(dāng)單擊【英文】超鏈接時,通過同樣的Action改變當(dāng)前的語言環(huán)境為英文,該Action的代碼如下所示。

?

public class LanguageAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response){ String lang=request.getParameter("lang"); if(lang.equals("zh")) { request.getSession().setAttribute(Globals.LOCALE_KEY,Locale.CHINESE); } if(lang.equals("en")) { request.getSession().setAttribute(Globals.LOCALE_KEY, Locale.ENGLISH); } return mapping.findForward("addstu"); } }

加粗部分就是用來改變當(dāng)前語言環(huán)境的代碼,具體是通過setAttribute方法來設(shè)置語言環(huán)境,該方法的第一個參數(shù)Globals.LOCALE_KEY表示當(dāng)前語言環(huán)境的鍵,Struts通過這個鍵來確定當(dāng)前的語言環(huán)境,第二個參數(shù)表示當(dāng)前語言環(huán)境的值,Locale.CHINESE表示中文;Locale.ENGLISH表示英文。

當(dāng)我們單擊【英文】超鏈接時,整個頁面就會顯示英文消息文本,如圖2.1.9所示。

圖2.1.9 英文界面


本章總結(jié)

?DispatchAction類是Action的子類,在該類中我們無需重寫execute方法,而是可以自定義多個業(yè)務(wù)處理方法,這就避免了每個業(yè)務(wù)都需要一個Action的情況。

(1)如果某個類繼承了DispatchAction,那么這個類中自定義的方法必須和execute有一樣的方法簽名,即它的返回值和參數(shù)列表必須和execute方法一樣。????

(2)需要對<action>元素的parameter屬性進行設(shè)置。????

(3)訪問Action的時候,按照約定傳遞parameter,說明要調(diào)用的方法名。

?可以使用實體對象簡化ActionForm。

?Struts1的異常處理。

(1)在異常可能發(fā)生的位置使用throws關(guān)鍵字聲明異常。

(2)在struts-config.xml中配置全局異常處理元素(3)創(chuàng)建錯誤提示頁面。

?國際化是指我們的Web應(yīng)用程序在運行時根據(jù)客戶端所在國家(地區(qū))的不同而顯示不同的語言界面。在程序中引入國際化的目的是為了給不同國家(地區(qū))的用戶提供自適應(yīng)、更友好的界面。

(1)創(chuàng)建資源文件。

(2)加載資源文件。

(3)在頁面中使用<bean:message>標(biāo)簽顯示國際化文本消息。


任務(wù)實訓(xùn)部分

1:使用DispatchAction重構(gòu)管理員示例

訓(xùn)練技能點

Struts 1DispatchAction

需求說明

在第一章的任務(wù)實現(xiàn)部分,我們實現(xiàn)了對管理員進行增、刪和查的功能?,F(xiàn)在使用DispatchAction重構(gòu)這一事例。

實現(xiàn)步驟

(1)?創(chuàng)建AdminAction 繼承DispatchAction。

(2)?將原AddAction 、DelAction、QueryAction合并進AdminAction ,分別創(chuàng)建三個方法,addAdmin、delAdmin、queryAdmin。

(3)?配置AdminAction 添加parameter參數(shù),并在訪問action的時候傳遞該參數(shù)。

?

2:給管理員示例提供異常處理

訓(xùn)練技能點

Struts 1異常處理

需求說明

給上面的實訓(xùn)任務(wù)增加異常處理

實現(xiàn)步驟

(1) ?在系統(tǒng)各處throws異常。

(2) ?在struts-config.xml文件中配置異常處理。

(3) ?開發(fā)異常信息頁面。

?

3:給添加管理員示例提供國際化支持

訓(xùn)練技能點

Struts 1國際化

需求說明

給上面的實訓(xùn)任務(wù)增加中英文國際化支持。

實現(xiàn)步驟

(1 ) ?編寫兩個資源文件。

(2) ?在struts-config.xml文件中加載資源文件。

(3) ?在addAdmin.jsp頁面中使用<bean:message>標(biāo)簽顯示資源文件中的消息。

(4)?編寫一個Action用來實現(xiàn)改變當(dāng)前語言環(huán)境。

4:優(yōu)化添加學(xué)生示例

訓(xùn)練技能點

使用實體對象簡化ActionForm

需求說明

在本章的核心技能部分,我們講解了一個貫穿示例“添加學(xué)生”。現(xiàn)在要求使用實體對象簡化本示例中的ActionForm。

鞏固練習(xí)

一、選擇題

1. 以下關(guān)于DispatchAction的說法正確的是()。

A.?Action繼承了DispatchAction

B.?繼承DispatchAction時必須重寫execute方法

C.?繼承DispatchAction時可以自定義方法,DispatchAction對這些方法沒任何要求

D.?DispatchAction是Action的子類

2. 使用DispatchAction必要的步驟是()。

A. 創(chuàng)建Action,并開發(fā)業(yè)務(wù)處理方法。

B. 設(shè)置<action>元素的parameter屬性。

C. 訪問Action的時候,按照約定傳遞parameter,說明要調(diào)用的方法名。

D. 必須為Action指定FormBean。s

3.以下關(guān)于Struts 1資源文件說法正確的是()。

A.?資源文件的名字可以自定義,沒有任何規(guī)定

B.?資源文件只要放在正確的路徑下,Struts就能找到了,無需在struts-config.xml中進行配置

C.?資源文件只能放在WEB-INF/classes的根目錄下

D.?中文資源文件需要轉(zhuǎn)碼

4.在Struts1中使用()顯示錯誤提示消息。

A.?<html:errors>

B.?<html:messages>

C.?<html:error>

D.?<html:message>

5.在Struts1中客戶端國家語言信息被放置在()對象中。

A. ?Application

B. ?Session

C. ?request

D. ?page?

總結(jié)

以上是生活随笔為你收集整理的Struts 1高级应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。