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表达式会给我们界面带来很大的方便。