Struts2的控制标签库和数据标签库(六)

勿以恶小而为之,勿以善小而不为--------------------------刘备

劝诸君,多行善事积福报,莫作恶

上一章简单介绍了Struts2从后端向前端传递数据和OGNL访问用户自定义静态方法(五),如果没有看过,请观看上一章

Struts2提供了一个非常完整的标签库,作用非常强大。但效率不太高,有人说Struts效率缓慢就是因为标签库,但是其功能不得不让人佩服。

Struts2标签库分为普通标签库和UI标签库,
普通标签库又下分为两个: 控制标签和数据标签.
UI标签库分为form标签库,非form标签库,ajax标签库(这一章暂时不介绍ajax)。

一. 引入标签库

需要在jsp页面的开头引入struts-tags标签库(以下例子都默认添加了)


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!--需要引入struts的标签库-->
<%@ taglib uri="/struts-tags" prefix="s"%>

该 struts2-tags 被放置在 struts-core.jar 包下面的 META-INF 文件 夹下。

有图片

二. Struts2的控制标签库

常用的控制标签库主要用 if else if else标签库,表示判断.

iterator标签库表示循环判断 (c标签时用forEach) 先介绍两个常用的

为了简化操作,在jsp中用<% %>来添加数据。

二.一 if elseif else 标签库(与java中if一样,也可以if单独, if else)

二.一.一 普通判断

<%
	request.setAttribute("age",25);
%>
用if elseif else标签库表示人.

<s:if test="#request.age>47">
	这是妈妈
</s:if>
<s:elseif test="#request.age>26">
	这是大姐
</s:elseif>
<s:else>
	这是二姐
</s:else>

二.一.二 判断对象是否为空

if 语句一般是不会这样单独用的,

常用的用法有两种,一种是if 判断对象或者集合,避免空指向的问题

<%
	//User user=new User();
	//user.setSex("男");
	User user=null;
	request.setAttribute("user",user);
%>
<s:if test="#request.user!=null">
	显示性别: ${user.sex}
</s:if>
<s:else>
	没有数据显示,避免.属性时出现错误
</s:else>

单个对象可以判断,集合也可以判断 <s:if test="#request.userList!=null"> 再<s:iterator /> 循环输出。

第二种,常见的是根据对象中的属性,如status(状态0或者1) 来做出不同的选择。

如果是0就怎么样,如果是1就怎么样。

在上面的性别上进行相应的追加

<s:if test="#request.user!=null">
显示性别: 
	<s:if test="#request.user.sex='男'">
			男的
	</s:if>
	<s:else>
			女的
	</s:else>
</s:if>

如果是字符串,就用''括起来,

如果是数值,就直接 .user.age=24 ,用一个=号,不能用两个==

二 .二 iterator循环对象输出

这是循环输出的,有好多个属性:

    <s:iterator begin="" end="" step="" 
value="" var="" status="">
	
</s:iterator>

可以分成两组形式:

  1. begin(开始位置),end(结束位置), step(步长),var(表示每次的值)是一组

  2. value(接收到的值), var(变量) ,status(状态值)是一组。

二.二.一 前端循环遍历生成结构

第一组是没有从后端得到数据,只是单纯的遍历前端,如遍历10个

  • 标签

         <ul>
    		<s:iterator begin="1" end="10" step="1" var="i">
    			<li>${i}</li>
    		</s:iterator>
    	</ul>
    

    会生成10 个 <li> </li> 标签元素。

    二.二.二 循环遍历集合,展示集合数据

    第二组是循环遍历后端集合对象中的值,注意里面有一个status,表示状态. status="sta"

    status有几个常用的值,

    1. count 表示数目
    2. index表示下标,是从0开始的,
    3. first 是否第一个,
    4. last是否第二个,
    5. even是否为偶数,
    6. odd是否为奇数,为boolean类型值。

    其中 最常用的是index。

    从后端SingleAction中得到的数据(有关数据得到,可以参与第五章的一.五封装List 对象到前端)

     public String getData() {
    		UserService userService=new UserService();
    		List<User> userList=userService.findAll();
    		ActionContext.getContext().getValueStack().set("userList",userList);
    		return SUCCESS;
    	}
    

    那么在前端展示时

    <s:iterator value="userList" var="user" status="sta">
    		<tr>
    			<td>下标为:${sta.index}</td>
    			<td>数目为:${sta.count}</td>
    			<td>${user.name}</td>
    			<td>${user.sex}</td>
    			<td>${user.age}</td>
    			<td>${user.relation}</td>
    			<td>
    				<a href="#">查看详情</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    				<a href="#">修改</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    				<a href="#">删除</a>
    		</tr>
    </s:iterator>
    

    有图片

    二.三 append 追加标签

    <%
    	List<Student> studentList1=new ArrayList<Student>();
    	List<Student> studentList2=new ArrayList<Student>();
    	studentList1.add(new Student(1,"张三",10));
    	studentList1.add(new Student(3,"李四",20));
    	studentList2.add(new Student(5,"王五",30));
    	studentList2.add(new Student(7,"赵六",40));
    	request.setAttribute("studentList1",studentList1);
    	request.setAttribute("studentList2",studentList2);
    %>
    </head>
    <body>
    <s:append var="studentList3">
    	<s:param value="#request.studentList1"></s:param>
    	<s:param value="#request.studentList2"></s:param>
    </s:append>
    <table>
    	<tr>
    		<th>序号</th>
    		<th>编号</th>
    		<th>姓名</th>
    		<th>年龄</th>
    	</tr>
    	<s:iterator value="studentList3" status="status">
    	<tr>
    		<td><s:property value="#status.index+1"/></td>
    		<td><s:property value="id"/></td>
    		<td><s:property value="name"/></td>
    		<td><s:property value="age"/></td>
    	</tr>
    	</s:iterator>
    </table>
    

    在<s:param>节点中添加要组合添加的标签,将值总体放置在<s:append>节点中的var变量中,以后遍历时只遍历var中的studentList3即可。 从后向前添加,有顺序。

    二.四 generator 分隔标签

    <s:generator separator="," val="'张三,李四,王五'" var="nameList"></s:generator>
    <s:iterator value="#nameList" var="a">
    	<s:property value="#a"/>
    </s:iterator>
    

    val表示要分隔的字符串,用''单引号括起来,separator指定分隔符, var为整体的值。

    再用s:iterator进行遍历输出

    其中var该属性指定了保存在context中的名字,如果没有指定该属性将不会保存在context中

    二.五 subset截取标签

    <s:subset source="#request.studentList1" count="2" start="2">
      <s:iterator status="status">
    	<tr>
    		<td><s:property value="#status.index+1"/></td>
    		<td><s:property value="id"/></td>
    		<td><s:property value="name"/></td>
    		<td><s:property value="age"/></td>
    	</tr>
    	</s:iterator>
    </s:subset>
    

    source为要截取的集合的值, start为开始截取的点,从1开始. count为截取的数目

    二.六 merge 添加标签(无序添加)

    <s:merge var="studentList3">
        <s:param value="#request.studentList1"></s:param>
        <s:param value="#request.studentList2"></s:param>
    </s:merge>
    <table>
        <tr>
            <th>序号</th>
            <th>编号</th>
            <th>姓名</th>
            <th>年龄</th>
        </tr>
        <s:iterator value="studentList3" status="status">
        <tr>
            <td><s:property value="#status.index+1"/></td>
            <td><s:property value="id"/></td>
            <td><s:property value="name"/></td>
            <td><s:property value="age"/></td>
        </tr>
        </s:iterator>
    </table>
    

    添加的时候是没有顺序的,与add用法基本相同。

    二.七 sort排序标签

    二.七.一 给定数据

    <%
    	List<Student> studentList1=new ArrayList<Student>();
    	studentList1.add(new Student(1,"张三",20));
    	studentList1.add(new Student(3,"李四",10));
    	studentList1.add(new Student(5,"王五",40));
    	studentList1.add(new Student(7,"赵六",30));
    	request.setAttribute("studentList1",studentList1);
    %>
    

    二.七.二 需要对Student添加比较器,添加比较器MyComparator

    package com.java1234.comparator;
    
    import java.util.Comparator;
    
    import com.yjl.pojo.Student;
    
    public class MyComparator implements Comparator<Student>{
    
    	public int compare(Student s1, Student s2) {
    		if(s1.getAge()>s2.getAge()){
    			return 1;
    		}else if(s1.getAge()<s2.getAge()){
    			return -1;
    		}
    		return 0;
    	}
    
    }
    

    二.七.三 指定bean实例化MyComparator比较器

    
    <s:bean id="myComparator" name="com.java1234.comparator.MyComparator"></s:bean>
    

    二.七.四 在s:iterator循环输出,包括在s:sort标签里面

    <tbody>
            <s:sort comparator="#myComparator" source="#request.studentList1" >
    	    <s:iterator status="status">
    	<tr>
    		<td><s:property value="#status.index+1"/></td>
    		<td><s:property value="id"/></td>
    		<td><s:property value="name"/></td>
    		<td><s:property value="age"/></td>
    	</tr>
    	</s:iterator>
    	</s:sort>
    </tbody>
    

    三 数据标签库的用法

    三.一 property输出标签器

    用三个常用的属性:

    
    <s:property value="" default=""  escapeHtml=""/>
    
    <%
    	request.setAttribute("name","<font color='red'>两个蝴蝶飞</font>");
    %>
    取出作用域中值:<s:property value="#request.name"/> <br/>
    没有值为显示默认值:<s:property value="#request.name1" default="没有两个蝴蝶飞"/><br/>
    是否忽略html标签为true:<s:property value="#request.name" escapeHtml="true"/><br/>
    是否忽略html标签为false:<s:property value="#request.name" escapeHtml="false"/>
    

    默认值是true, 表示将标签当成普通文字输出。 为false时会进行相应的翻译转换。

    在这里插入图片描述

    三.二 set标签的用法

    set设置普通的数字时:

    没有作用域:
    <s:set var="name" value="1"></s:set>
    <s:property value="#name"/> <br/>
    
    

    注意此时value="1"

    如果设置字符串或者英文字母即非数字时, 如value="abc", value="两个蝴蝶飞"时,是无法进行显示的.

    会将abc和中文当成变量的。

    设置在里面添加'' 即 value="'abc'"

    没有作用域:<s:set var="name" value="'两个蝴蝶飞'"></s:set>
    		<s:property value="#name"/> <br/>
    

    set时添加作用域:scope

    设置作用域:<s:set var="name" value="'两个蝴蝶飞'" scope="session"/>
    		<s:property value="#session.name"/> <br/>
    		<s:property value="#attr.name"/> <br/>
    

    除了可以用它们的相同的作用域取出数据之外,
    还可以用 #attr取出全部作用域的值,按照page,request,session,application进行依次获取

    三.三 调试标签 debug

    <s:debug></s:debug>
    
    

    在这里插入图片描述

    可以分别显示 Value Stack 和 Stack Context 里面的数据,便于调试。

    三.四 param 传参标签

    <s:param name="" value="" />
    
    

    传递参数,可用在<s:bean> 标签或者<s:url> 标签里面,也可以放置在<s:a >标签里面

    注意,如果是普通数字的话,为value="2" ,如果是字符串的中,应该是 value=" ‘字符串值’ " (里面有一个'')

    三.五 Bean实体类标签

    <s:bean name="com.yjl.pojo.User" var="user">
    	<!-- 用s:param传递参数 -->
    	<s:param name="name" value="'两个蝴蝶飞'"></s:param>
    	<s:param name="age" value="24"></s:param>
    </s:bean>
    <!-- 输出数据 -->
    <s:property value="#user.name"/><br/> 
    <s:property value="#user.age"/><br/> 
    

    name为全限定名称,可以方便地将属性赋值到对象中。

    三.六 url 网址标签和a标签

    url中得到的只是一个链接,并不能单独 的使用,需要将其与<s:a> 标签共同组合使用。

    <s:url action="Single_getData" namespace="/" var="a">
    	<s:param name="name" value="'HelloStruts2'"></s:param>
    </s:url>
    
    显示出url的值:<s:property value="#a"/> <br/>
    要引用s:url时,用%强制转换: <s:a href="%{#a}">跳转</s:a>
    
    

    在这里插入图片描述


    <s:a> 标签也可以直接使用action进行跳转,也可以带参数。不用href属性,用action属性。

    <s:a action="Single_getData" namespace="/" var="a">
    	<s:param name="name" value="'HelloStruts2'"></s:param>
    	跳转
    </s:a>
    

    在这里插入图片描述

    其中<s:a>标签也有一个target属性,与html中target属性意义一样,有target="_blank", target="_self"等。

    三.七 include包含标签

    <s:include value="head.jsp"></s:include>
    
    

    与jsp中的静态包含一样。 注意value的值,文件的路径是否正确。 ctrl+鼠标点击时,可以正确跳转到相关的路径。

    三.八 date标签

    <s:date> 可以对日期进行相应的处理,使其按照规定的格式进行显示,前堤是一个正确的日期或者时间格式,不需要开发者在后端进行单独的日期处理了。

    <%
    	request.setAttribute("currentDate",new java.util.Date());
    %>
    <s:date name="#request.currentDate" format="yyyy年MM月dd日  HH mm:ss"/>
    
    

    name为要显示的那个日期的值,format为显示的格式, y,M,d,H,m,s,S,与util.Date中的format的表达方式一样。

    在这里插入图片描述

    这就是Struts2的控制标签和数据标签的基本用法.

    谢谢您的观看!!!

  • posted @ 2020-06-09 11:34  两个蝴蝶飞  阅读(94)  评论(0编辑  收藏  举报