立即前往

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
查看全部活动
热门活动
  • 智算采购季 热销S6云服务器2核4G限时88元/年起,部分主机可加赠对象存储组合包!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 一键部署Llama3大模型学习机 0代码一键部署,预装最新主流大模型Llama3与StableDiffusion
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 产品能力
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

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

      首页 知识中心 大数据 文章详情页

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

      2023-03-01 09:32:31 阅读次数:124

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

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

      可以分成两组形式:

      1. begin(开始位置),end(结束位置), step(步长),var(表示每次的值)是一组
      2. 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有几个常用的值,

      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>下标为:</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>

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

      二.三 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标签的用法

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

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

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


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

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

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

      其中<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的控制标签和数据标签的基本用法.

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

      谢谢您的观看!!!


      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.51cto.com/yueshushu/5841763,作者:两个蝴蝶飞,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:10、MyBatis-Plus 多数据源

      下一篇:JsonCpp第一课 数据读取

      相关文章

      2025-04-15 09:24:56

      初学Java,形参长度可变的方法(八)

      Java中如果在定义方法时,在最后一个形参的类型后增加三点(...),表明形参可以接受多个参数值,多个参数值被当成数组传入

      2025-04-15 09:24:56
      Ajax , Java , Struts2 , 多个 , 形参
      2025-04-15 09:20:33

      初学Java,List和ListIterator(二十八)

      List代表的是一个有序的集合,每一个元素都有一个对应索引。List是Collection的子接口,所以Collection的所有方法都可以调用,另外也有它自身的方法。

      2025-04-15 09:20:33
      Arrays , java , List , Struts2
      2025-02-25 08:57:42

      【Java面试题】Struts2

      【Java面试题】Struts2

      2025-02-25 08:57:42
      filter , servlet , SpringMVC , Struts2 , url , 流程
      2024-09-25 10:15:15

      使用IDEA创建struts2项目报错ava.lang.RuntimeException:java.lang.reflect.InvocationTargetException

      使用IDEA创建struts2项目报错ava.lang.RuntimeException:java.lang.reflect.InvocationTargetException

      2024-09-25 10:15:15
      IDEA , Struts2
      2023-07-20 06:00:33

      Struts2使用datetimepicker标签显示无效

      错误 错误代码 原因 在head标签内未添加<sx:head/>。 <sx:head />:head标签的功

      2023-07-20 06:00:33
      Struts2
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      32777

      阅读量

      4832325

      查看更多

      热门标签

      算法 leetcode python 数据 java 数组 节点 大数据 i++ 链表 golang c++ 排序 django 数据类型
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 权益商城
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 权益商城
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号