SSH實戰OA 05:Struts2標籤

Struts2標籤庫提供了主題、模板支援,極大地簡化了檢視頁面的編寫,而且,struts2的主題、模板都提供了很好的擴充套件性。實現了更好的程式碼複用。Struts2允許在頁面中使用自定義元件,這完全能滿足專案中頁面顯示覆雜,多變的需求。本文僅給出常用的struts標籤的用法,這些標籤的分類有:通用標籤,控制流程標籤、ajax標籤、UI標籤等。

在搭建好的Struts2工程下新建TagsAction.java,程式碼如下:

import com.opensymphony.xwork2.ActionSupport;
public class TagsAction extends ActionSupport {
private String password;
private String username;
private String id;
public TagsAction() {
}
@Override
public String execute() throws Exception {
this.addFieldError("fielderror.test", "使用者名稱或密碼出錯!");
return this.SUCCESS;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}

這個action的邏輯很簡單,複寫了父類的execute()方法的程式碼邏輯向前端返回了一句錯誤資訊和一個SUCCESS的檢視。這個action有3個屬性,分別是:username,password,id,並生成相應的getter/setter方法,除此之外該action還有一個空的構造方法。

struts.xml配置檔案如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!--
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
-->
<!--
<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
-->
<constant name="struts.devMode" value="true" />
<constant name="struts.ui.theme" value="simple" />
<package name="tags" extends="struts-default">
<action name="tagsAction" class="com.shizongger.tags.TagsAction">
<result>/tags.jsp</result>
</action>
</package>    
</struts>

本文的重點放在struts的標籤,所以struts.xml做了最簡單的配置,只配置了一個action,並且定義了一個前端的返回檢視tags.jsp。

tags.jsp的最開始狀態如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Struts-Tags學習案例</title>
</head>
<body>
<ol>
<li>property:<s:property value="username" /></li>
</ol>
</body>
</html>

使用struts2的標籤,引入struts2的taglib是第一步。上訴的jsp程式碼是最簡單的使用property的用法。
在瀏覽器中輸入下列連結:

http://localhost:8080/StrutsTags/tagsAction.action?username=u&password=p

伺服器將會向前端瀏覽器輸出

property:u

property用法

property的常用法還有以下幾種:

<li>property:<s:property value="username" /></li>
<li>property取值為字串:<s:property value="'username'"/></li>
<li>property設定預設值:<s:property value="id" default="沒有id" /></li>
<li>property設定html:<s:property value="'<hr />'" escape="false" /></li>
<hr />

第一行的li是我們常用的OGNL表示式取出了username的值,value值是OGNL表示式。第二行的用法是將’username’作為字串輸出來,而不是希望struts標籤將我們的字串解析。第三行多了一個default屬性值,當沒有id作為引數傳遞進來的時候就顯示defalut裡面的內容,當有id值傳遞進來的時候就顯示id的值。如下面的兩個案例輸出:

url:

http://localhost:8080/StrutsTags/tagsAction.action?username=u&password=p&id=1

輸出:

property設定預設值:1

url:

http://localhost:8080/StrutsTags/tagsAction.action?username=u&password=p

property設定預設值:沒有id

第四個li裡面的property用法,當escape為true時value的值當作是普通字元輸出,而當時escape為false時瀏覽器將作為html標籤來解析,比如上訴的escape為false,此時瀏覽器當作標籤< hr />來輸出,既多出了一橫。

set標籤用法

<li>set 設定adminName值(預設為request 和 ActionContext): <s:set var="adminName" value="username" /></li>
<li>s標籤從request中取出adminName:<s:property value="#request.adminName" /></li>
<li>s標籤從ActionContext中取出adminName:<s:property value="adminName" /></li>
<li>s標籤從ActionContext中取出adminName:<s:property value="#adminName" /></li>
<li>set 設定var,範圍為ActionContext: <s:set var="adminPassword" value="password" scope="reqeust" /></li>
<li>使用#取出adminPassword:<s:property value="#adminPassword" /></li>
<li>從session取出:<s:property value="#session.adminPassword" /></li>
<li>從request取出:<s:property value="#request.adminPassword" /></li>
<hr />

set標籤主要作用是在jsp頁面中定義變數,本案例中我們將引數傳遞進來的username值賦給變數adminName,之後用property方法從作用域中取出值。第一個li是set賦值的用法,第2到4是將set取出來的用法。需要注意的後面帶有指定作用域的scope的用法,當我們指定了變數的作用域時,取出時需要指定我們的作用域。

bean、param標籤使用

        <li>bean 定義bean,並使用param來設定新的屬性值:
<s:bean name="com.shizongger.tags.Dog">
<s:param name="name" value="大黃" />
<s:property value="name" />
</s:bean>
</li>
<li>bean 檢視debug情況:
<s:bean name="com.shizongger.tags.Dog" var="myDog">
<s:param name="name" value="'Sam'" />
</s:bean>
取出值:<s:property value="#myDog.name" />
</li>
<hr />

這裡用到了我們的javaBean Dog,Dog的程式碼如下:

public class Dog {
private String name;
public Dog() {
System.out.println("Dog無參構造方法");
}
public Dog(String name) {
System.out.println("Dog有參構造方法,name = "   name);
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("name = "   name);
this.name = name;
}
@Override
public String toString() {
return "Dog [name="   name   "]";
}
}

Dog類只有一個name屬性,一個空的構造方法一個帶引數的構造方法,還覆蓋toString方法。當然本類的輸出語句是為了更好的看引數輸出情況,你也可以去除輸出語句。

jsp的bean標籤的name指定了Dog類的全路徑,param標籤對其屬性進行賦值。由於我給dog的name屬性賦予了”大黃”的值,用debug標籤可以看到:
這裡寫圖片描述

同時頁面輸出:

bean 定義bean,並使用param來設定新的屬性值:
bean 檢視debug情況: 取出值:Sam

include標籤

        <li>include mydemo1.html 包含靜態英文頁面
<s:include value="/myDemo1.html"></s:include>
</li>
<li>include mydemo2.html 包含靜態中文頁面
<s:include value="/myDemo2.html"></s:include>
</li>
<li>include _include1.html 包含靜態英文檔案,說明%用法
<s:set var="incPage" value="%{'/myDemo1.html'}" />
<s:include value="%{#incPage}"></s:include>
</li>
<hr />

struts的inlcude標籤用法與jsp的include差不多。上訴的兩個靜態html檔案如下:
myDemo1.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>_include1.html</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=GB18030">
<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
</head>
<body>
<h3>This is the head</h3>
<p>This is a Paragram.</p>
</body>
</html>

myDemo2.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>_include1.html</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=GB18030">
<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
</head>
<body>
<h3>This is the head</h3>
<p>中文字元的段落.</p>
</body>
</html>

可能由於版本bug問題,英文靜態html能夠正常載入進來,而中文靜態html沒有正常載入進來,建議用jsp自帶的include語句。

if elseif else標籤的用法

        <li>if elseif else的用法:
sex引數的值是=<s:property value="#parameters.sex[0]"/><br />
將parameters.sex[0]的值賦到age變數中去<s:set name="sex" value="#parameters.sex[0]"></s:set><br />
使用者性別=<s:if test="#sex == 1">男</s:if>
<s:elseif test="#sex == 2">女</s:elseif>
<s:else>未知</s:else>
</li>
<li>username是否為空:
<s:if test="#parameters.username == null">是</s:if>
<s:else>否</s:else>
</li>
<hr />

這裡用到的parameters是什麼鬼?就是我們url傳遞的引數,在HttpServletRequest有一個方法getParamters(String str)就是從這個parameters裡面獲取jsp向Servlet傳遞引數的。
本程式碼片段邏輯是先從url獲取parameters.sex[0]引數,賦值為sex變數,然後利用struts判斷標籤判斷sex的值,如果sex等於1則為男,sex等於2則為女,其他是輸出未知。
在本案例中我輸入的url如下:

http://localhost:8080/StrutsTags/tagsAction.action?username=u&password=p&sex=1

瀏覽器輸出如下:

  • if elseif else的用法: sex引數的值是=1
    將parameters.sex[0]的值賦到age變數中去
    使用者性別=男
  • username是否為空: 否

遍歷集合

        <li>遍歷集合:<br />
<s:iterator value="{'hello','to','struts','tags'}">
<s:property/>
</s:iterator>
</li>       
<li>自定義變數:<br />
<s:iterator value="{'this','is','the','self','define','struts','tags'}" var="word">
<s:property value="#word.toUpperCase()"/>
</s:iterator>!
</li>
<li>使用status:<br />
<s:iterator value="{'this','is','the','self','define','struts','tags'}" status="status">
<s:property/>->
已經遍歷了元素的個數:<s:property value="#status.count" /> . 
元素的索引:<s:property value="#status.index" /> . 
當前是偶數?:<s:property value="#status.even" /> . 
當前是奇數? :<s:property value="#status.odd" /> .
是否是集合第一個元素?:<s:property value="#status.first" /> . 
是否是集合最後一個元素? :<s:property value="#status.last" />
<br />
</s:iterator>
</li>
<li>
<s:iterator value="#{001:'root', 002:'admin', 003:'shizongger'}">
key = <s:property value="key"/> ,value = <s:property value="value" /><br />
</s:iterator>
</li>
<li>
<s:iterator value="#{001:'Sam', 002:'Big Huang',003:'Perk'}" var="dog">
key = <s:property value="#dog.key" /> ,value = <s:property value="#dog.value" /><br />
</s:iterator>
</li>
<hr />

集合的遍歷在專案開發中經常用到,第一個li給出了最簡單的集合遍歷方法。第二個li的標籤中將集合的每個元素賦值給變數word,再將其輸出。第三個li的status用法能夠顯示出當前的元素的狀態出來。
第4和第5個li下面的標籤展示了map的用法,在迭代標籤s:iterator中巢狀property標籤,可以依次取出key值,再取出value,依次的將map的key-value取出來。
最後瀏覽器輸出如圖:
這裡寫圖片描述
這裡寫圖片描述