struts2中的通用标签

来源:互联网 发布:淘宝多口袋工装休闲裤 编辑:程序博客网 时间:2024/05/21 07:46

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;@Overridepublic 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";}@Overridepublic void setSession(Map<String, Object> arg0) {session=arg0;}@Overridepublic 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;}@Overridepublic String toString() {return "Person [dog=" + dog + ", cat=" + cat + "]";}}
Person的比较器PersonComparator:

package com.yd.action;import java.util.Comparator;public class PersonComparator implements Comparator<Person>{@Overridepublic 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表达式会给我们界面带来很大的方便。




0 0
原创粉丝点击