翻譯自Struts官方文檔,原文:http://struts.apache.org/getting-started/using-tags.html
這個教程假設你已經完成了上一篇《Hello World》教程,並且已經有一個能夠運行的helloworld項目。這個教程的示例項目“using-tags”,你可以到Struts 2 的Github倉庫struts-examples查看或下載。這個示例項目使用Maven作爲依賴管理和項目構建工具。
在Hello World教程中,我們在index.jsp中添加了一個Struts 2 url標籤,創建了一個鏈接到hello.action的超鏈接。這篇教程我們將探索這個url標籤和其他Struts 2標籤特性。
Web應用程序與傳統網站不同的是,Web應用程序可以創建動態響應,以便更容易地從頁面引用動態數據。Struts 2框架提供了一套標籤庫。有些標籤模仿標準的HTML標籤,同時提供額外的作用。其他標籤的創建雖然不是標準的,但是它們是很有用的控件。
要想在視圖頁面使用Struts 2標籤庫,你必須包含一個標籤庫指令: <%@ taglib prefix="s" uri="/struts-tags" %>
。這樣所有的Struts
2標籤將以 s 爲前綴。如果你想閱讀Struts 2標籤的TLD文件,你可以到Struts 2 核心jar包中的 META-INF
文件夾下找到它。
Struts 2 url 標籤
Struts 2 URL標籤的一個用途是創建與其他web資源的鏈接,特別是在本地應用程序中的其他資源。
雖然HTML提供了一個創建超鏈接的簡單標籤,但是使用HTML標籤無法避免的會包含一些冗餘信息。另外,HTML標籤不能很容易的訪問框架提供的動態數據。
在Web應用中一個非常普遍的用途就是創建一個鏈接到其他頁面的超鏈接。 在《Hello World》教程中,我們使用Struts 2 url標籤在 index.jsp
中添加了一個鏈接到hello.action 的超鏈接。有關url標籤的更多信息,請參考 url
documentation 。
index.jsp
<!DOCTYPE html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Basic Struts 2 Application - Welcome</title>
</head>
<body>
<h1>Welcome To Struts 2!</h1>
<p><a href="<s:url action='hello'/>">Hello World</a></p>
</body>
</html>
當你在Servlet容器中運行《Hello World》教程中的項目時,將鼠標懸停在通過Struts 2 url標籤創建的Hello World超鏈接你將看到URL爲hello.action(相對於web 上下文的根路徑)。
在Hello World教程中檢查 struts.xml
配置,你將看到下面的內容:
struts.xml
...
<action name="hello" class="org.apache.struts.helloworld.action.HelloWorldAction" method="execute">
<result name="success">/HelloWorld.jsp</result>
</action>
...
上面的action節點配置了 hello.action 到HelloWorldAction類的execute方法的映射。如果execute方法返回success,視圖頁面HelloWorld.jsp(在web context root文件夾)將被返回給用戶。
一個常見的用例是,URL還需要一個值作爲查詢字符串參數。使用Struts 2 param標籤將查詢字符串參數嵌套在url標籤中。
修改 index.jsp
像下面這樣:
帶參數的url標籤
...
<s:url action="hello" var="helloLink">
<s:param name="userName">Bruce Phillips</s:param>
</s:url>
<p><a href="${helloLink}">Hello Bruce Phillips</a></p>
...
我們沒有將url標記作爲錨標記的href屬性的值,而是將s:url標記分隔到它自己的代碼塊中,Struts 2 param標籤被嵌套在url標籤內。這個標記允許您指定一個參數名稱(例userName)和該參數的值(例如Bruce Phillips)。
注意這個var屬性的使用。這個var屬性的值是我們稍後在代碼中可以用來引用創建的url的引用。
檢查上面的a標籤。注意href屬性的值是${helloLink}
. 視圖頁面將用${helloLink}引用的url標籤替換我們創建的超鏈接。注意,查詢字符串參數將被正確地url編碼(Bruce+Phillips)。
在下一個教程中,我們將介紹Struts如何訪問查詢字符串參數值。
Struts 2 Form 標籤
很多應用都會使用數據輸入表單。Struts 2標籤創建輸入表單很容易。有關Struts 2 表單標籤詳情,請查閱 Form Tags Reference 。
Struts 2每一個表單標籤都有一些屬性,這些屬性模擬了正常HTML表單標籤屬性。
創建表單的外殼使用Struts 2的form標籤。action屬性設置提交的action名字。
在 index.jsp
中添加form標籤:
Struts 2 Form
<p>Get your own personal hello by filling out and submitting this form.</p>
<s:form action="hello">
<s:textfield name="userName" label="Your name" />
<s:submit value="Submit" />
</s:form>
Struts 2 textfield標籤提供了一個帶標籤文本的HTML輸入標籤,submit標籤創建一個提交按鈕。當index頁面被服務器返回時在瀏覽器中你會看到下面的頁面:
Struts form、textfield和 submit 標籤被轉換成下面的HTML:
Struts 表單標籤轉換成 HTML
<form id="hello" name="hello" action="/using-tags/hello.action;jsessionid=6233ot11na1mtshbr292hu1w" method="post">
<table class="wwFormTable">
<tr>
<td class="tdLabel"><label for="hello_userName" class="label">Your name:</label></td>
<td class="tdInput"><input type="text" name="userName" value="" id="hello_userName"/></td>
</tr>
<tr>
<td colspan="2">
<div class="formButton">
<input type="submit" value="Submit" id="hello_0"/>
</div>
</td>
</tr>
</table>
</form>
請注意Struts 2是如何在表單內創建一個table來定位表單元素的。在後面的教程中,你將學到如何使用佈局(table,CSS)。Struts 2 textfield標籤創建了一個帶有名稱值的文本輸入標籤,該標籤與textfield標記的名稱值相匹配。Struts 2還創建了一個基於textfield標籤label屬性值的HTML label 標籤。
在下一個教程中,我們將介紹如何使用Struts 2去處理表單的提交。
Struts 2 property 標籤
在 Hello World 教程的示例應用的JSPHelloWorld.jsp
文件中有下面的代碼:
Struts Property 標籤
<s:property value="messageStore.message" />
這個property標籤最常見的用法是,通過調用(Action類的)公有get方法“get”屬性的返回值,然後將這個值包含在HTML中返回到瀏覽器。
正如Hello World教程中所討論的,messageStore.message 的作用是命令Struts 2首先要調用Action類的getMessageStore方法。這個方法返回一個 MessageStore
對象。 .message
部分命令Struts
2 調用MessageStore對象的getMessage方法。 getMessage
方法返回一個字符串,包含在HTML中返回到瀏覽器中。
Struts 2 property標籤一個非常有用的特性是,它可以自動轉換常用的數據類型 (int, double, boolean)爲字符串。爲了驗證這個特性,我們在HelloWorldAction
類中添加一個靜態的int變量:
添加靜態屬性
private static int helloCount = 0;
public int getHelloCount() {
return helloCount;
}
每次調用execute方法,我們使helloCount自增1。添加下面的代碼到HelloWorldAction類的execute方法 。
自增 helloCount
helloCount++;
每當用戶點擊index.jsp頁面的超鏈接一次(或提交表單),HelloWorldAction類的execute方法將被執行,靜態屬性helloCount將自增1。
我們可以使用property標籤將helloCount 屬性的值包含在HelloWorld.jsp中。將下面的代碼添加到HelloWorld.jsp 中:
使用Property標籤展示helloCount的值
<p>I've said hello <s:property value="helloCount" /> times!</p>
所以即使getHelloCount方法返回一個整型,Struts 2也能將它轉換爲字符串類型,幷包含在p標籤中。
注意:即使是helloCount一個靜態域但是它的get方法不能是靜態的。Note that even though helloCount
is
a static field, the get method for helloCount
is not static. Struts 2通過調用getHelloCount方法獲取helloCount的值,getHelloCount方法不能是靜態方法。
如果get方法的返回值是一個對象,property標籤將使Struts 2去調用對象的toString方法。當然,你應該總是在你的model類中覆蓋掉Class 對象的toString方法。添加下面的toString方法到MessageStore類中:
添加toString方法到MessageStore類中
public String toString() {
return message + " (from toString)";
}
添加下面的代碼到HelloWorld.jsp
使用Property標籤調用toString方法
<p><s:property value="messageStore" /></p>
HelloWorldAction類的getMessageStore
方法返回一個MessageStore對象,Struts
2調用MessageStore類的toString方法返回一個字符串,這個字符串最終展示在瀏覽器中。
雖然我們在這個教程中介紹了很多東西,但是我們實際上只是觸及瞭如何使用Struts 2標籤的表面。有關所有Struts 2標籤的更多信息請查閱Struts 2 Tag Reference 。
上一篇 Struts 2 Hello World | or | 下一篇 編寫Struts 2 Action |