勿以恶小而为之,勿以善小而不为--------------------------刘备
劝诸君,多行善事积福报,莫作恶
上一章简单介绍了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">
显示性别:
</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>
可以分成两组形式:
- begin(开始位置),end(结束位置), step(步长),var(表示每次的值)是一组
- value(接收到的值), var(变量) ,status(状态值)是一组。
二.二.一 前端循环遍历生成结构
第一组是没有从后端得到数据,只是单纯的遍历前端,如遍历10个
- 标签
<ul>
<s:iterator begin="1" end="10" step="1" var="i">
<li></li>
</s:iterator>
</ul>
会生成10 个 <li> </li> 标签元素。
二.二.二 循环遍历集合,展示集合数据
第二组是循环遍历后端集合对象中的值,注意里面有一个status,表示状态. status=“sta”
status有几个常用的值,
- count 表示数目
- index表示下标,是从0开始的,
- first 是否第一个,
- last是否第二个,
- even是否为偶数,
- 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>下标为:</td>
<td>数目为:</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td>
<a href="https://www.ctyun.cn/portal/link.html?target=%23">查看详情</a>
<a href="https://www.ctyun.cn/portal/link.html?target=%23">修改</a>
<a href="https://www.ctyun.cn/portal/link.html?target=%23">删除</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="https://www.ctyun.cn/portal/link.html?target=%25%7B%23a%7D">跳转</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的控制标签和数据标签的基本用法.
下一章简单介绍了Struts2的%,#,$的区别,UI标签及其表单radio,checkbox,select回显数据(七)
谢谢您的观看!!!