使用 Struts 2標籤

      翻譯自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標籤將以 爲前綴。如果你想閱讀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方法返回一個字符串,這個字符串最終展示在瀏覽器中。

using_tags_hello.png

     雖然我們在這個教程中介紹了很多東西,但是我們實際上只是觸及瞭如何使用Struts 2標籤的表面。有關所有Struts 2標籤的更多信息請查閱Struts 2 Tag Reference 。

上一篇 Struts 2 Hello World or 下一篇 編寫Struts 2 Action

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章