下面我們通過實例來學習一下Struts的使用通過本實例的學習我們將會對struts的表單以及表單驗證有一個初步的認識了解struts的配置以及初探Struts的本地化輸出
實例說明
本例是Struts的簡單實例通過本工程的學習我們將會對struts的表單以及表單驗證有一個初步的認識了解struts的配置以及初探Struts的本地化輸出
編碼准備
)包的引入
在MyEclipse或NetBeans中建立web工程將所需的包放入WebRoot/lib目錄中本實例所需的包有
commonsloggingjar
freemarkerjar
ognljar
strutscorejar
xworkjar
這些包在strutsall\struts\lib目錄下都可以找到請讀者自行下載
) webxml的配置
要使struts能正常工作需修改webxml的內容為其增加struts的FilterDispatcher修改後的webxml的內容如下
<?xml version= encoding=UTF?>
<webapp id=WebApp_ version= xmlns= xmlns:xsi=instance xsi:schemaLocation= app__xsd>
<displayname>Struts Blank</displayname>
<filter>
<filtername>struts</filtername>
<filterclass>orgapachestrutsdispatcherFilterDispatcher</filterclass>
</filter>
<filtermapping>
<filtername>struts</filtername>
<urlpattern>/*</urlpattern>
</filtermapping>
<welcomefilelist>
<welcomefile>l</welcomefile>
</welcomefilelist>
</webapp>
)建立源碼目錄和jsp存放目錄
在src目錄下建立example文件夾用於存放本實例的java文件等在WebRoot文件夾下建立子文件夾example用於存放本工程的jsp文件
編碼
) Welcomejsp和Loginjsp的編寫
首先我們建立Welcomejsp該文件包含兩個鏈接點擊登錄鏈接後跳轉到登錄信息輸入頁面點擊注冊按鈕跳轉到注冊頁為了學習struts配置中的通配符使用我們暫不實現注冊功能Welcomejsp的代碼如下
<%@ page contentType=text/html; charset=UTF %>
<%@ taglib prefix=s uri=/strutstags %>
<html>
<head>
<title>歡迎界面</title>
<link <s:urlvalue=/css/examplecss/>rel=stylesheet type=text/css/>
</head>
<body>
<h>導航</h>
<ul>
<li><a <s:urlvalue=/example/Loginjsp/>>登錄</a></li>
<li><a <s:urlaction=Register/>>注冊</a></li>
</ul>
</body>
</html>
在該頁面的頂部我們需要將struts的標簽庫引入語句為<%@ taglib prefix=s uri=/strutstags %>
在該頁面主要用到struts的<s:url>標簽該頁面主要用到該標簽的兩個屬性分別為value和action其中action屬性表示用action來產生url而value表示使用的目標值在頁面上點擊查看源文件按鈕可看到生成的語句分別變為
<link rel=stylesheet type=text/css/>
<a >
<a >
由此可知使用該標簽時struts會自動為我們帶上下文路徑對於加了屬性action的<s:url>標簽後面會自動帶上action作為後綴
點擊登錄鏈接後跳轉到Loginjsp頁面該頁包含一個登錄表單讓用戶輸入用戶名和密碼信息用戶點擊提交按鈕跳轉到指定的Action——Login進行處理Loginjsp的內容如下
<%@ page contentType=text/html; charset=UTF %>
<%@ taglib prefix=s uri=/strutstags %>
<html>
<head>
<title>登錄</title>
</head>
<body>
<s:form action=Login>
<s:textfield name=username label=用戶名/>
<s:password name=password label=密碼/>
<s:submit/>
</s:form>
</body>
</html>
該頁用到Struts的表單標簽<s:form><s:textfield>和<s:password>
<s:form>的action屬性表示表單提交後跳轉的action的名稱此處為Login該標簽最終將生成HTML的form;
<s:textfield>標簽類同於HTML的<input type=text …>其中name表示屬性域的名稱label表示其前的提示名;
<s:password>標簽類同於HTML的<input type=password …>其name和label類同於<s:textfield>在此略
)配置文件strutsxml和examplexml
在上述jsp頁面我們需跳轉到兩個Action地址需在struts的配置文件中配置因當工程變大時一個龐大的struts的配置極難維護建議按包路徑分開配置文件所以本實例除了strutsxml配置文件外還新增了一個額外的配置文件examplexml該文件在strutsxml中引用strutsxml放在src目錄下該文件的內容如下
<?xml version= encoding=UTF ?>
<!DOCTYPE struts PUBLIC
//Apache Software Foundation//DTD Struts Configuration //EN
dtd>
<struts>
<constant name=strutsenableDynamicMethodInvocation value=false />
<constant name=strutsdevMode value=false />
<include file=examplexml/>
<! Add packages here >
</struts>
可看到該文件通過<include file=examplexml/>將examplexml也作為struts的配置文件
接下來讓我們看看examplexml的配置
<?xml version= encoding=UTF ?>
<!DOCTYPE struts PUBLIC
//Apache Software Foundation//DTD Struts Configuration //EN
dtd>
<struts>
<package name=example namespace=/example extends=strutsdefault>
<action name=Login_input method={} class=exampleLogin>
<result name=input>/example/Loginjsp</result>
<result type=redirectaction>Menu</result>
</action>
<! 為學習struts配置文件中通配符的使用我們將未定義的action的引用都定向到exampleExampleSupport這個Action中 >
<! 需定向的Action的名字傳到{}中eg若請求Register這個action當ExampleSupport返回success時跳轉到/example/Registerjsp >
<action name=* class=exampleExampleSupport>
<result>/example/{}jsp</result>
</action>
</package>
</struts>
) Login和ExampleSupport類以及驗證配置類Loginvalidationxml的編寫
在配置文件examplexml中定義了兩個Action下面我們用代碼來實現這兩個Action
首先讓我們來看看ExampleSupport這個Action這個Action不做任何操作集成自ActionSupport是本工程的各Action類的基類該類的代碼如下
package example;
import comopensymphonyxworkActionSupport;
publicclass ExampleSupport extends ActionSupport {
}
接著讓我們來看看Login這個Action該類繼承自ExampleSupport類該Action需實現的業務邏輯如下
a) 當用戶名(username)或密碼(password)有一者或兩者為空時登錄不成功跳轉到登錄信息輸入頁面;
b) 當用戶名(username)和密碼(password)都不為空時登錄成功跳轉到主菜單頁
對於用戶名和密碼的驗證我們可以先考慮在Login類中用代碼實現的方式此時該類的代碼如下
package example;
public class Login extends ExampleSupport {
public String execute() throws Exception {
if (isInvalid(getUsername()))
return INPUT;
if (isInvalid(getPassword()))
return INPUT;
return SUCCESS;
}
private boolean isInvalid(String value) {
return (value == null || valuelength() == );
}
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
thisusername = username;
}
private String password;
public String getPassword() {
return password;
}
public void setPassword(String password) {
thispassword = password;
}
}
當工程變得愈發復雜時這一小段一小段驗證代碼將會變得難以維護出於此原因我們可以考慮采用struts提供的驗證機制來實現在src目錄下建立實現驗證的xml文件Loginvalidationxml為Login Action中的username和password屬性增加非空驗證驗證配置如下
<!DOCTYPE validators PUBLIC
//OpenSymphony Group//XWork Validator //EN
validatordtd>
<validators>
<field name=username>
<fieldvalidator type=requiredstring>
<message key=requiredstring/>
</fieldvalidator>
</field>
<field name=password>
<fieldvalidator type=requiredstring>
<message key=requiredstring/>
</fieldvalidator>
</field>
</validators>
當驗證未通過時將不會進入Login Action中的execute方法此時可刪除掉Login這個Action中的驗證內容該類的execute方法直接跳轉到SUCCESS即可修改後的代碼略
)本地化輸出——資源文件packageproperties
為了本地化的輸出驗證錯誤信息我們可以將參數信息和錯誤信息放入資源文件中資源文件packageproperties位於src/example目錄下內容如下
requiredstring = ${getText(fieldName)}不能為空
password = 密碼
username = 用戶名
ssage = 該部分尚未構建請稍候訪問
在src/example目下下建立對應的中文資源文件package_zh_CNproperties為了避免中文亂碼問題我們編寫一個批處理文件codebat來對packageproperties進行編碼處理主要用到nativeascii命令其內容如下
del package_zh_CNproperties
copy packageproperties package_zh_CNpropertiesgbk
nativeascii encoding GBK package_zh_CNpropertiesgbk package_zh_CNproperties
del package_zh_CNpropertiesgbk
del *bak
運行該批處理文件可在package_zh_CNproperties中可看到編碼後的資源文件信息如下
requiredstring = ${getText(fieldName)}\ued\ufd\uea\uaa
password = \ubc\u
username = \u\u\ud
ssage = \ube\ue\u\uca\ua\u\uefa\uffc\ubf\uad\u\ubbf\uee
)Registerjsp和Missingjsp的編寫
在中的examplexml中我們配置了通配符映射在Welcomejsp中我們使用
<a <s:url action=Register/>>注冊</a>
其中的Register在example中找不到相關映射於是在用戶點擊注冊按鈕時將映射到通配符所映射的Actionexample ExampleSupport而後跳轉到Registerjsp頁面其代碼如下
<%@ page contentType=text/html; charset=UTF %>
<%@ taglib prefix=s uri=/strutstags %>
<s:include value=Missingjsp/>
該頁面包含Missingjsp頁面其代碼如下
<%@ page contentType=text/html; charset=UTF %>
<%@ taglib prefix=s uri=/strutstags %>
<html>
<head><title>未構建頁面</title></head>
<body>
<p>
<! 讀取配置文件中的對應信息 >
<s:text name=ssage/>
</p>
</body>
</html>
四 總結
到此為止我們的實例已構建完可通過浏覽器訪問看到我們的勞動成果下面總結一下我們在該實例中學到的東西
常用的一些標簽的使用
在本實例中我們學習了<s:textfield><s:password><s:form>以及<s:url>的使用
表單數據的驗證
本文描述了一個簡單的表單的數據非空驗證
本地化輸出錯誤提示信息
在驗證失敗時用資源文件來輸出錯誤提示信息
Strut配置文件中通配符的使用
對於某些地址我們可以使用在struts的配置通配符來使其映射到某個Action中去
From:http://tw.wingwit.com/Article/program/Java/ky/201311/27914.html