Struts2_通用标签

说通用标签前先来说说

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标签
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());
	}
	
	
}








1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看rEADME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看rEADME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值