說通用標籤前先來說說
Struts2什麼時候把對象放入值棧棧頂的
放入時間爲:Struts2終將調用Action類的Action方法,但在調用該方法之前:
->先建一個StrutsActionProxy對象
->再創建StrutsActionProxy之後,對其進行初始化,把Action對象放入了值棧中
Struts2通用標籤
property標籤
property標籤用來輸出一個值棧屬性的值
示例:輸出Action屬性customerId的值:<s:property value="customerId"/>
輸出session屬性userName的值<s:property value="#session.userName"/>
如果value屬性沒有給出,ValueStack值棧棧頂對象的值被輸出
在許多情況下,JSP EL可以提供更簡潔的語法
s:property : 打印值棧中的屬性值:對於對象棧,打印值棧中對應的屬性值
<br><br>
<s:property value="productName"/>
<br><br>
對於Map棧,打印request,session,application的某個屬性值或請求的某個參數的值
<br><br>
<s:property value="#session.date"/>
<br>
<s:property value="#parameters.name[0]"/>
url標籤
url標籤用來動態地創建一個URL
s:url :創建一個URL字符串
<br><br>
<s:url value="/testUrl" var="url1" >
<!--指定URL包含的請求參數,2002不可能是一個屬性名,struts2把2002直接作爲屬性值 -->
<s:param name="productId" value="2002"/>
<s:param name="date" value="#session.date"/>
</s:url>
${url1 }
<br><br>
<s:url value="/getProduct" var="url2" >
<!-- 對於value值會自動做OGNL解析 -->
<s:param name="productId" value="productId"/>
</s:url>
${url2 }
<br><br>
<s:url value="/getProduct" var="url3" >
<!--對於value值會自動做OGNL解析,若不希望進行OGNL解析,則使用單引號引起來 -->
<s:param name="productId" value="'abdfi'"/>
</s:url>
${url3 }
<br><br>
<!--構建一個action的地址 -->
<s:url action="testAction" namespace="/helloworld" method="save" var="url4"/>
${url4 }
<br><br>
<s:url value="testUrl" includeParams="all" var="url5"/>
${url5}
set標籤
set標籤用來在以下Map對象裏創建一個鍵值對:
--ValueStack值棧的ContextMap值棧
--Map類型的session對象
--Map類型的application對象
--Map類型的request對象
--Map類型的page對象
s:set :向page,request,session,application域對象中加入一個屬性值
<br><br>
<!-- 對value屬性自動的進行OGNL解析 -->
<s:set name="productName" value="productName" scope="request">
</s:set>
productName:${requestScope.productName }
<br><br>
<s:set name="productName" value="productName" scope="page">
</s:set>
productName:${pageScope.productName }
push標籤的功能和set標籤類似
push標籤將把一個對象壓入ValueStack而不是ContextMap
push標籤在標籤起始時把一個對象壓入棧,標籤結束時將對象彈出棧
s:push :把一個對象在標籤開始後壓入到值棧中,標籤結束後,彈出值棧
<%
Person person = new Person();
person.setName("willian");
person.setAge(10);
request.setAttribute("person", person);
%>
<br><br>
<s:push value="#request.person">
name:${name }
</s:push>
if,else 和 elseif 標籤
這三個標籤用來進行條件測試,他們的用途和用法類似於if,else和elseif關鍵字,
其中if和elseif必須有test屬性
s:if,s:else,s:elseif
<br><br>
<!--會自動做OGNL解析 ,可以直接使用值棧中的屬性-->
<s:if test="productPrice > 1000">
I7
</s:if>
<s:elseif test="productPrice > 800">
I5
</s:elseif>
<s:else>
I3
</s:else>
<br><br>
<s:if test="#request.person.age > 10">
大於10歲
</s:if>
<s:else>
小於或等於10歲
</s:else>
iterator標籤
iterator標籤用來遍歷一個數組,Collection或一個Map,並把這個可遍歷對象裏的每一個元素依次壓入和彈出VauleStack棧,
在開始執行時,iterator標籤會先把IteratorStatus類的一個實例壓入ContextMap,並在每次遍歷循環時更新他,可以將一個指向IteratorStatus對象的變量賦給status屬性
s:iterator :遍歷集合 ,把這個可遍歷對象裏的每一個元素依次壓入和彈出VauleStack棧
<br><br>
<%
List<Person> persons = new ArrayList<Person>();
persons.add(new Person("AA",10));
persons.add(new Person("BB",20));
persons.add(new Person("CC",30));
persons.add(new Person("DD",40));
persons.add(new Person("EE",50));
request.setAttribute("persons", persons);
%>
<s:iterator value="#request.persons">
${name }---${age }<br>
</s:iterator>
<br><br>
<s:iterator value="persons">
${name }---${age }<br>
</s:iterator>
<br><br>
將person放在了status對象裏
<br>
<s:iterator value="#request.persons" status="status">
${status.index}-${status.count} ${name }---${age }<br>
</s:iterator>
sort標籤
sort標籤用來對一個可遍歷對象的元素進行排序
s:sort : 可以對集合中的元素進行排序
<br><br>
<%
PersonComparator pc = new PersonComparator();
request.setAttribute("comparator",pc);
%>
<s:sort comparator="#request.comparator" source="persons" var="persons2"/>
<!--sort排序後 -->
<s:iterator value="#attr.persons2"><!--這裏要用attr -->
${name }---${age }<br>
</s:iterator>
date標籤
date標籤用來對Date對象進行排版
s:date 可以對Date對象進行排版
<br><br>
<s:date name="#session.date" format="yyyy-MM-dd hh:mm:ss" var="date2"/>
date: ${date2 }
a標籤
a標籤將呈現爲一個HTML連接,這個標籤可以接受HTML語言中的a元素所能接受的所有屬性,但其能進行ONGL解析
s:a :將呈現爲一個HTML連接,其不支持EL
<br>
<s:iterator value="persons">
<!-- 可以使用 %{}把屬性包裝起來,使其進行強制的OGNL解析 -->
<s:a href="getPerson.action?name=%{name}">${name }</s:a>
</s:iterator>
下面給出完整範例
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="wul" namespace="/" extends="struts-default">
<action name="testTag" class="com.wul.strust2.ValueStack.Product"
method="testTag">
<result>/common-tag.jsp</result>
</action>
</package>
</struts>
index.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ page import="java.util.*" %>
<!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>Hello</title>
</head>
<body>
<!-- <a href="testTag">testTag</a> -->
<a href="testTag?name=wallen">testTag</a>
<%
session.setAttribute("date",new Date());
%>
<form action="common-tag.jsp" method="post">
<input type="text" name="name" value="wullin"/>
<input type="submit" value="submit"/>
</form>
</body>
</html>
common-tag.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ page import="com.wul.strust2.ValueStack.*" %>
<%@ page import="java.util.*" %>
<!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>Insert title here</title>
</head>
<body>
<s:debug></s:debug>
<br>
s:property : 打印值棧中的屬性值:對於對象棧,打印值棧中對應的屬性值
<br><br>
<s:property value="productName"/>
<br><br>
對於Map棧,打印request,session,application的某個屬性值或請求的某個參數的值
<br><br>
<s:property value="#session.date"/>
<br>
<s:property value="#parameters.name[0]"/>
<br><br>
s:url :創建一個URL字符串
<br><br>
<s:url value="/testUrl" var="url1" >
<!--指定URL包含的請求參數,2002不可能是一個屬性名,struts2把2002直接作爲屬性值 -->
<s:param name="productId" value="2002"/>
<s:param name="date" value="#session.date"/>
</s:url>
${url1 }
<br><br>
<s:url value="/getProduct" var="url2" >
<!-- 對於value值會自動做OGNL解析 -->
<s:param name="productId" value="productId"/>
</s:url>
${url2 }
<br><br>
<s:url value="/getProduct" var="url3" >
<!--對於value值會自動做OGNL解析,若不希望進行OGNL解析,則使用單引號引起來 -->
<s:param name="productId" value="'abdfi'"/>
</s:url>
${url3 }
<br><br>
<!--構建一個action的地址 -->
<s:url action="testAction" namespace="/helloworld" method="save" var="url4"/>
${url4 }
<br><br>
<s:url value="testUrl" includeParams="all" var="url5"/>
${url5}
<br><br>
s:set :向page,request,session,application域對象中加入一個屬性值
<br><br>
<!-- 對value屬性自動的進行OGNL解析 -->
<s:set name="productName" value="productName" scope="request">
</s:set>
productName:${requestScope.productName }
<br><br>
<s:set name="productName" value="productName" scope="page">
</s:set>
productName:${pageScope.productName }
<br><br>
s:push :把一個對象在標籤開始後壓入到值棧中,標籤結束後,彈出值棧
<%
Person person = new Person();
person.setName("willian");
person.setAge(10);
request.setAttribute("person", person);
%>
<br><br>
<s:push value="#request.person">
name:${name }
</s:push>
<br>
push後name:${name }
<br><br>
s:if,s:else,s:elseif
<br><br>
<!--會自動做OGNL解析 ,可以直接使用值棧中的屬性-->
<s:if test="productPrice > 1000">
I7
</s:if>
<s:elseif test="productPrice > 800">
I5
</s:elseif>
<s:else>
I3
</s:else>
<br><br>
<s:if test="#request.person.age > 10">
大於10歲
</s:if>
<s:else>
小於或等於10歲
</s:else>
<br><br>
s:iterator :遍歷集合 ,把這個可遍歷對象裏的每一個元素依次壓入和彈出VauleStack棧
<br><br>
<%
List<Person> persons = new ArrayList<Person>();
persons.add(new Person("AA",10));
persons.add(new Person("BB",20));
persons.add(new Person("CC",30));
persons.add(new Person("DD",40));
persons.add(new Person("EE",50));
request.setAttribute("persons", persons);
%>
<s:iterator value="#request.persons">
${name }---${age }<br>
</s:iterator>
<br><br>
<s:iterator value="persons">
${name }---${age }<br>
</s:iterator>
<br><br>
將person放在了status對象裏
<br>
<s:iterator value="#request.persons" status="status">
${status.index}-${status.count} ${name }---${age }<br>
</s:iterator>
<br><br>
s:sort : 可以對集合中的元素進行排序
<br><br>
<%
PersonComparator pc = new PersonComparator();
request.setAttribute("comparator",pc);
%>
<s:sort comparator="#request.comparator" source="persons" var="persons2"/>
<!--sort排序後 -->
<s:iterator value="#attr.persons2"><!--這裏要用attr -->
${name }---${age }<br>
</s:iterator>
<br><br>
s:date 可以對Date對象進行排版
<br><br>
<s:date name="#session.date" format="yyyy-MM-dd hh:mm:ss" var="date2"/>
date: ${date2 }
<br><br>
<br><br>
s:a :將呈現爲一個HTML連接,其不支持EL
<br>
<s:iterator value="persons">
<!-- 可以使用 %{}把屬性包裝起來,使其進行強制的OGNL解析 -->
<s:a href="getPerson.action?name=%{name}">${name }</s:a>
</s:iterator>
</body>
</html>
Product.java
package com.wul.strust2.ValueStack;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.util.ValueStack;
public class Product implements RequestAware,SessionAware{
private Integer productId;
private String productName;
private String productDesc;
private double productPrice;
public Integer getProductId() {
return productId;
}
public void setProductId(Integer productId) {
this.productId = productId;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public String getProductDesc() {
return productDesc;
}
public void setProductDesc(String productDesc) {
this.productDesc = productDesc;
}
public double getProductPrice() {
return productPrice;
}
public void setProductPrice(double productPrice) {
this.productPrice = productPrice;
}
@Override
public String toString() {
return "Product [productId=" + productId + ", productName="
+ productName + ", productDesc=" + productDesc
+ ", productPrice=" + productPrice + "]";
}
private List<Person> persons = new ArrayList<Person>();
public List<Person> getPersons() {
return persons;
}
public String testTag(){
this.productDesc = "fff";
this.productId = 1001;
this.productName = "wul";
this.productPrice = 1000;
persons.add(new Person("CC",30));
persons.add(new Person("AA",10));
persons.add(new Person("DD",40));
persons.add(new Person("EE",50));
persons.add(new Person("BB",20));
return "success";
}
}
Person.jsp
package com.wul.strust2.ValueStack;
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
PersonComparator.java
package com.wul.strust2.ValueStack;
import java.util.Comparator;
public class PersonComparator implements Comparator<Person>{
@Override
public int compare(Person arg0, Person arg1) {
// TODO 自動生成的方法存根
return arg0.getName().compareTo(arg1.getName());
}
}