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>
可以分成两组形式:
- begin(开始位置),end(结束位置), step(步长),var(表示每次的值)是一组
- 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> <a href="#">修改</a> <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中