首页 > 其他分享 >Struts2的控制标签库和数据标签库(六)

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

时间:2022-11-10 15:38:27浏览次数:42  
标签:控制 studentList1 标签 value Struts2 user Student new


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

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

上一章简单介绍了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标签

二. 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>      
<a href="#">修改</a>      
<a href="#">删除</a>
</tr>
</s:iterator>

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

二.三 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时会进行相应的翻译转换。

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

三.二 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>

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

可以分别显示 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>

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


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

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

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

其中<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的控制标签库和数据标签库(六)_iterator标签_07

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

下一章简单介绍了​​Struts2的%,#,$的区别,UI标签及其表单radio,checkbox,select回显数据(七)​​

谢谢您的观看!!!


标签:控制,studentList1,标签,value,Struts2,user,Student,new
From: https://blog.51cto.com/u_13420484/5841763

相关文章

  • Struts2的ServletAPI的获取和各种类型的数据获取(三)
    勿以恶小而为之,勿以善小而不为--------------------------刘备劝诸君,多行善事积福报,莫作恶上一章简单介绍了Action的实现方式和struts.xml配置的详细解释,Struts2的简单执行......
  • Struts2的 两个蝴蝶飞 你好 (一)
    勿以恶小而为之,勿以善小而不为--------------------------刘备劝诸君,多行善事积福报,莫作恶,下面,老蝴蝶将带大家学习Struts2框架一.Struts2的下载和解压目录Struts2的官网......
  • cafffe 利用h5py生成多标签h5文件并训练
    h5py生成多标签h5文件importh5pyimportnumpyasnpdefmain():f=h5py.File('train00.h5','w')f.create_dataset('data',(1200,128),dtype='f8')f.create_data......
  • Struts2实现类型转换器(十五)
    勿以恶小而为之,勿以善小而不为--------------------------刘备劝诸君,多行善事积福报,莫作恶上一章简单介绍了Struts2实现JSON和Ajax操作(十四),如果没有看过,​​请观看上一......
  • 时延测评|免费又好用的低延时远程控制软件竟是它!
    操作流畅度及延迟是判断一款远程控制软件是否好用的重要指标之一。本着“拒绝无脑安利”的测评初心,今天我们就以RayLink等国内三款远程控制软件为测试对象,进行一次科学的时......
  • 实验6:开源控制器实践——RYU
    实验6:开源控制器实践——RYU一、实验目的能够独立部署RYU控制器;能够理解RYU控制器实现软件定义的集线器原理;能够理解RYU控制器实现软件定义的交换机原理。二、实验环......
  • 远程控制软件如何像素级还原设计稿色彩?
    今年3月,深圳的上班族贡献了一个名场面:扛电脑主机“跑毒”!上演万人大撤离!浩浩荡荡的扛主机队伍做出这番行为的背后原因很心酸:隔离和封楼随时都有可能,做好随时扛主机回家的......
  • PX01如何实现在指定定制画面下执行指令控制
    在对屏进行生产测试或者实验室测试时,有时会需要在特定画面下进行发送指令修改IC寄存器、修改背光亮度、控制某个IO等操作来达到验证目的,那PX01如何实现上述功能呢?LcdTools......
  • IOC(Inversion of Control)控制反转
    解决方案:使用对象时,在程序中不要主动new对象,转换为由外部提供对象代码书写现状:耦合度偏高什么叫ioc(1)ioc叫做控制反转,是面向对象的一种设计方式,(2)把对象的创建和对象之间的......
  • 22-jmeter-压测的时候仅登陆一次(仅一次控制器)
    前言在线程组里面写了2个接口,一个是登陆的接口获取token,另外一个是需要拿到token才能访问用户信息的接口。我只想对第二个接口发多次请求做压测,不需要每次都去执行登陆,于......