说通用标签前先来说说
放入时间为:Struts2终将调用Action类的Action方法,但在调用该方法之前:
->先建一个StrutsActionProxy对象
->再创建StrutsActionProxy之后,对其进行初始化,把Action对象放入了值栈中
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]"/>
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}
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 }
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>
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>
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>
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>
s:date 可以对Date对象进行排版 <br><br> <s:date name="#session.date" format="yyyy-MM-dd hh:mm:ss" var="date2"/> date: ${date2 }
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>
<%@ 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>
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; } }
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()); } }