struts2中的通用标签

1.struts2带有一个强大的标签库,其中的标签分为UI标签和非UI标签。今天主要说一说非UI标签,也通常被成为通用标签。通用标签按照功能分为两种类型,一种是数据标签用来显示数据的,一种是控制标签是用来在逻辑处理中使用的。java实例在最后展示。

2.这里说一说常用的数据标签。
①property标签用来输出一个值栈里的值也可以输出一个简单类型的String值


注意点:value值是自动进行ognl解析的也就是value的值都是从值栈中获得的,如果不想value的值被ognl解析只需要在value的属性值加上''(单引号)即可。

②url标签用来动态的创建一个url地址


注意点:通过url标签可以构建一个action的请求地址,通过将action ,namespace,method属性结合使用即可,method定义的方法是动态调用的。其中var属性是值得注意的,如果定义了var属性,该变量就会存储到值栈context map中去,如果不定义var变量那么定义的url不会存储到context map中但是会直接显示到页面中去。其中的includeParams属性也是值得注意的。该属性表示定义该url时是否带上请求当前资源的参数。其属性值有三个:

1)all表示把所有的参数都带上

2)none表示所有的参数都不带

3)get表示带上get请求方式携带的参数

那么如果我们要在<s:url>中带上自定义的参数该怎么办呢?那么就要用到下面的通用标签了。

③param标签用来把参数传递给包含它的标签。


④date标签用来转换Date对象的时间显示格式的

⑤set标签用来往Context Map的某些map中创建并存储一个键值对。


⑥push标签和set标签的功能大致相同,但是唯一的区别就是set是往Context map中压入值,而push标签是往Object stack中压入值。


3.接下来说说通用标签中的另一种类型,控制类型的通用标签

①if elseif  else标签和我们的java控制语句是一样的。if和elseif必须要有test属性。


②iterator标签可以用来遍历一个数组,collection或者一个map



③sort标签用来对一个可遍历对象进行排序。


java实例代码,在代码中进行了部分解释:

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="comment" extends="struts-default" namespace="/user">
		<action name="user-show" class="com.yd.action.User" method="test">
			<result name="success">/show.jsp</result>
		</action>
	</package>
</struts>

index.jsp首页:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>
	<a href="/Struts2_5/user/user-show.action?product=dog">user-show.action</a>
	<form action="/Struts2_5/user/user-show.action" method="post">
		<input type="text" name="pwd"/>
		<input type="submit" value="submit"/>
	</form>
</body>
</html>
Action类User:

package com.yd.action;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;

public class User implements Serializable,RequestAware,SessionAware{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private String name;
	private Integer age;
	private String hobby;
	private Map<String, Object> session;
	private Map<String, Object> request;
	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + ", hobby=" + hobby + "]";
	}
	public User() {
		super();
	}
	public User(String name, Integer age, String hobby) {
		super();
		this.name = name;
		this.age = age;
		this.hobby = hobby;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getHobby() {
		return hobby;
	}
	public void setHobby(String hobby) {
		this.hobby = hobby;
	}
	public String test(){
		//输出对象的
		System.out.println(this);
		//放在值栈object stack中
		this.setAge(22);
		this.setHobby("篮球");
		this.setName("Koby");
		//放到Map中
		List<Person> persons=new ArrayList<Person>();
		
		persons.add(new Person("CC", "dd1"));
		persons.add(new Person("AA", "dd3"));
		persons.add(new Person("DD", "dd4"));
		persons.add(new Person("BB", "dd2"));
		//添加完之后进行排序
		//persons.sort(new PersonComparator());
		PersonComparator pc=new PersonComparator();
		System.out.println(persons);
		session.put("persons", persons);
		request.put("proxy", "代理");
		request.put("comparator",pc );
		request.put("date", new Date());
		return "success";
	}
	@Override
	public void setSession(Map<String, Object> arg0) {
		session=arg0;
	}
	@Override
	public void setRequest(Map<String, Object> arg0) {
		request=arg0;
	}
}
普通javabean Person类:

package com.yd.action;

import java.io.Serializable;

public class Person implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private String dog;
	private String cat;
	
	public Person() {
		super();
	}
	public Person(String dog, String cat) {
		super();
		this.dog = dog;
		this.cat = cat;
	}
	public String getDog() {
		return dog;
	}
	public void setDog(String dog) {
		this.dog = dog;
	}
	public String getCat() {
		return cat;
	}
	public void setCat(String cat) {
		this.cat = cat;
	}
	@Override
	public String toString() {
		return "Person [dog=" + dog + ", cat=" + cat + "]";
	}
	
}
Person的比较器PersonComparator:

package com.yd.action;

import java.util.Comparator;

public class PersonComparator implements Comparator<Person>{

	@Override
	public int compare(Person o1, Person o2) {
		return o1.getDog().compareTo(o2.getDog());
	}

}
显示页面show.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>Insert title here</title>
</head>
<body>
	<h1>I am  show.jsp</h1>
	<h1>s:property</h1>
	stack中的request:<s:property value="request"/><br>
	stack中的第一个对象的name属性:<s:property value="[0]['name']"/><br>
	map中session的链表的对象:<s:property value="#session.persons[0].dog"/><br>
	<h1>s:url</h1>
	<!--通用标签 定义的url变量都会存储到context map中去 -->
	<s:url value="/user/name/login" var="url1">
		<!-- value值会自动检索值栈中的属性值       自动使用ognl解析     如果想要使value不被ognl自动解析   只需要直接加上''即可-->
		<s:param name="dog" value="'aa'" ></s:param>
	</s:url>
	${ url1 }<br>
	<s:url value="/user/name/register" var="url2">
		<!-- 如果是纯数字就不会被ognl解析       因为值栈中object stack不会有属性名是数字的  如果是map中的一定会加上# -->
		<s:param name="name" value="4444"></s:param>
	</s:url>
	${url2 }<br>
	<s:url value="/user/name/register" var="url3">
		<%-- <s:param name="name" value="name"></s:param> --%>
		<s:param name="name" value="#session.persons[0].dog"></s:param>
	</s:url>
	${url3 }<br>
	<!-- 定义的url可以是  构建一个action请求的url -->
	<!-- 如果定义了var  就会存储到context map中去,不会直接显示到页面    如果没有定义var  则不会存储到context map中去  但是会直接显示在页面 -->
	<s:url action="user-input" namespace="/user" includeParams="all" method="save" var="url4">
		<!-- includeParams表示是否带上请求该资源时请求参数  
			none:表示都不带上
			get:表示带上get请求的参数
			all:表示get post都带上
		 -->
		<s:param name="input" value="'input'"></s:param>
		<!-- 可以把value属性写在开始标签和结束标签之间来引用或者传递el表达式的值 -->
		<s:param name="url3">${url3 }</s:param>
	</s:url>
	${url4 }<br/>
	<h1>s:set用来向request,page,session,application,域对象中添加键值对,默认default是page域对象</h1>
	<s:set name="usera" value="name" scope="request" ></s:set>
	<h1>s:push</h1>
	<!-- 在标签开始时将对象压入到  值栈中  标签结束时将对象弹出栈 -->
	<s:push value="#session.persons[0]">
		<!--将对象压入到object stack栈中   标签结束弹出object stack栈中    person中有属性dog  -->
		${dog }
	</s:push><br/>
	<!-- el表达式可以获得值栈中的值 -->
	----${dog }<br/>
	<% 
		request.setAttribute("price", 45);
	%>
	${price}
	<h1>s:if s:else if s:else</h1>
	<s:if test="#request.price<44">
		我是小于44的
	</s:if>
	<s:elseif test="#request.price==44">
		我是等于44的
	</s:elseif>
	<s:else>
		我是大于44的
	</s:else>
	<br>
	<h1>s:iterator</h1>
	<!-- 迭代器中value表示要迭代的collection或者map   begin从哪一个开始   end是迭代到哪一个结束 -->
	<s:iterator value="#session.persons"  begin="1" end="2" status="s">
		<!-- 在每次迭代时 吧每一个迭代的对象依次压入和弹出value stack中     
			在开始迭代时 iterator会把一个Itratorstatus对象的实例放入到map中  并在每次遍历循环时更新它,把这个实例的引用赋给status 
		 -->
		${dog }----${cat}---${s.index }--${s.count }<br/>
	</s:iterator>
	<br/>
	<h1>s:sort</h1>
	<s:sort comparator="#request.comparator" source="#session.persons" var="comparator1"></s:sort>
	-----这个变量存储在当前page中<s:property value="#attr.comparator1"/><br>
	<s:iterator value="#attr.comparator1">
		${ dog}----${cat }
	</s:iterator>
	--------------------------------
	<br>
	<h1>s:date</h1>
	<!-- s:date定义的是一个时间格式对象     定义了var变量的会被压入多context map中去 -->
	<s:date name="#request.date" format="yyyy-MM-dd HH:mm:ss" var="date222"/>
	----${date222 }
	<s:property value="#date222"/>
	<s:debug></s:debug>
</body>
</html>
运行结果截图:



学习通用标签最后在总结几点:

①通用标签和值栈是密不可分的,通用标签里的值都是引用的值栈中的属性和对象,通用标签中定义的变量也都是存储到值栈中的。

②默认情况下通用标签引用的值自动进行ognl解析。

③在学习通用标签时如果有不明白值栈的实时情况,可以通过s:debuge标签来查看值栈中的情况。

④如果很好的集合ognl,通用标签和EL表达式会给我们界面带来很大的方便。




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值