Struts2标签库全解密:打造高效、动态的Web界面

文章目录

  • Struts2的标签
    • 通用(Generic)标签
    • <s:property> 数据类标签
    • <s:iterator>(至关重要!!!!)
    • <s:if> <s:elseif> <s:else>
    • <s:a>超链接标签
    • 用户界面(UI)标签
      • 表单标签
    • 主题样式

Struts2的标签

表单标签将在 HTML 文档里被呈现为一个表单元素

使用表单标签的优点: 表单回显

标签的属性可以被赋值为一个静态的值或一个 OGNL 表达式. 如果在赋值时使用了一个 OGNL 表达式并把它用 %{} 括起来, 这个表达式将会被求值.

通用标签库(控制标签数据标签):

表单标签

通用(Generic)标签

通用标签主要指两类:数据类标签和控制类标签。

<s:property> 数据类标签

作用:将 OGNL 表达式的内容输出到页面

属性:

value 属性,接收 OGNL 表达式,从值栈取值

default 属性:显示默认值,如果当通过 OGNL 表达式没有获取到值,default 设置显示默认值

escapeHtml 属性:是否对 HTML 标签转义输出 (默认是不转义 true,可以关闭)

Action

package com.igeek_01;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class TagAction1 extends ActionSupport{
	@Override
	public String execute() throws Exception {
		//往值栈中放入数据
		ActionContext.getContext().put("name", "tom");
		ActionContext.getContext().put("table", "<table border='1'><tr><td>html代码</td></tr></table>");
		return SUCCESS;
	}
}

jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h3>s:property从map栈中获取数据</h3>
	<s:property value="#name"/>
	<h3>s:property default属性</h3>
	<s:property value="#age" default="0"/>
	<h3>s:property escapeHtml属性,是否对html标签转义,默认不转义(true) </h3>
	<s:property value="#table" escapeHtml="false"/>
</body>
</html>

<s:iterator>(至关重要!!!!)

作用:遍历集合对象(可以是 List、set 和数组等),显示集合对象的数据。(跟 jstl 的<c:foreach>功能一样)

属性:

value:迭代的集合,支持 OGNL 表达式,如果没有设置该属性,则默认使用值栈栈顶的集合来迭代。
var:引用变量的名称,该变量是集合迭代时的子元素。
status:引用迭代时的状态对象 IteraterStatus 实例,其有如下几个方法:
        int getCount():返回当前迭代了几个元素;
        int *getIndex*():返回当前迭代元素的索引;
        boolean odd:返回当前迭代元素的索引是否是奇数
        boolean even:返回当前迭代元素的索引是否是偶数
        boolean isFirst():返回当前迭代元素的索引是否是第一个
        boolean isLast():返回当前迭代元素的索引是否是最后一个

jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h3>使用s:iterator 打印1-10 数字</h3>
	<h4>把每个遍历到的值存在map栈中,变量名定义为num</h4>
	<h4>把每个遍历到的值也存在root栈中</h4>
	<h4>把每个遍历到值的状态也是存在map栈中,变量名定义为s</h4>
	<s:iterator begin="1" end="10" var="num" status="s" >
		<s:property value="#num"/>--
        <h4>把每个遍历到的值也存在root栈中</h4>
		<s:property value="top"/>--
		<s:property value="[0].top"/>--
        <h4>把每个遍历到值的状态也是存在map栈中,变量名定义为s</h4>
		<s:property value="#s.index"/>--
		<s:property value="#s.count"/>--
		<s:property value="#s.odd"/>--
		<s:property value="#s.even"/>--
		<s:property value="#s.isFirst()"/>--
		<s:property value="#s.isLast()"/>--
		<br/>
	</s:iterator>
	
	<hr>
	<h3>s:iterator 遍历集合对象</h3>
	<h4>s:iterator value属性获取值栈中的集合对象</h4>
	<s:iterator value="users" var="u">
		<s:property value="#u.username"/>--><s:property value="#u.pwd"/>--
		<s:property value="username"/>--><s:property value="pwd"/>--
		<s:property value="top.username"/>--><s:property value="top.pwd"/>--
		<s:property value="[0].top.username"/>--><s:property value="[0].top.pwd"/>--
		${u.username }-->${u.pwd }
		<br/>
	</s:iterator>
</body>
</html>

image-20230402223916055

Action

package com.igeek_01;
import java.util.ArrayList;
import java.util.List;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class TagAction2 extends ActionSupport{
	@Override
	public String execute() throws Exception {
		List<User> users = new ArrayList<>();
		users.add(new User("tom", "123"));
		users.add(new User("jerry", "123"));
		users.add(new User("rose", "123"));
		//把数据放入值栈
		ActionContext.getContext().getValueStack().set("users", users);
		return SUCCESS;
	}
}

<s:if> <s:elseif> <s:else>

作用:页面判断,其中的 test 属性可以接收 OGNL 表达式。

根据后台传入的用户状态值(0,1,2),在页面判断并显示中文(管理员、普通用户、游客)

Action

package com.igeek_01;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class TagAction3 extends ActionSupport{
	
	private String role;
	public String getRole() {
		return role;
	}
	public void setRole(String role) {
		this.role = role;
	}
	@Override
	public String execute() throws Exception {
		//把role值放入值栈
		ActionContext.getContext().getValueStack().set("role", role);
		return SUCCESS;
	}
}

jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h3>s:if 标签</h3>
	<s:if test="role==0">
		<h3>管理员</h3>
	</s:if>
	<s:elseif test="role==1">
		<h3>普通用户</h3>
	</s:elseif>
	<s:else>
		<h3>游客</h3>
	</s:else>
</body>
</html>

<s:a>超链接标签

作用:生成 a 标签链接

JSP

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h3>超链接标签 s:a</h3>
	<h3>s:param参数标签</h3>
	<s:a action="tag3" namespace="/">
		<s:param name="role">0</s:param>//参数
	tag3.action</s:a>
</body>
</html>

用户界面(UI)标签

用户界面标签主要包括两类:表单类标签和其他类标签

form 表单的 Struts2 标签和传统标签的对比:(参考)

image-20230403215158555

image-20230403212520657

表单标签

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
   <h3>struts2 form表单</h3>
   <s:form action="tag3" method="get">
      <h3>文本框  <s:textfield name="username"></s:textfield> </h3>
      <h3>密码框 <s:password name="pwd"></s:password> </h3>
      <h3>隐藏域<s:hidden name="hide" value="hide"></s:hidden> </h3>
      <h3>文本域<s:textarea name="content"></s:textarea></h3>
      
      <hr/>
      <h3>单选按钮<s:radio list="{'男','女'}" name="sex"></s:radio> </h3>
      <h3>单选按钮1<s:radio list="#{'m':'男','f':'女'}" name="sex"></s:radio> </h3>
      <h3>复选框<s:checkboxlist list="{'篮球','足球','看书'}" name="hobby"></s:checkboxlist> </h3>
      <h3>复选框1<s:checkboxlist list="#{'basketball':'篮球','football':'足球','read':'看书'}" name="hobby1"></s:checkboxlist> </h3>
      
      <h3>下拉框:<s:select list="{'上海','北京','东京'}" name="city"></s:select> </h3>
      <h3>下拉框1:<s:select list="#{'1':'上海','2':'北京','3':'东京'}" name="city"></s:select> </h3>
      <s:submit value="提交"></s:submit>
      <s:reset value="重置"></s:reset>
   </s:form>
</body>
</html>

主题样式

Struts2 模板文件,支持两种 Freemarker 生成 (.ftl 模板文件) , Velocity 生成 (.vm 模板文件)

提供四种主题 :

Simple 最简单主题

Xhtml 通过 布局表格 自动排版 (默认主题 )

css_xhtml 通过 CSS 进行排版布局

ajax 以 Xhtml 模板为基础,增加 ajax 功能

<!-- 修改主题风格为简单主题 -->
<constant name="struts.ui.theme" value="simple"></constant>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/897567.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++打怪之路Lv12】-- 模板进阶

#1024程序员节&#xff5c;征文# &#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;重生之我在学Linux&#xff0c;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您…

Java集合剖析4】LinkedList

目录 一、LinkedList的特有方法 二、LinkedList的底层数据结构 三、插入方法的具体实现 一、LinkedList的特有方法 LinkedList的底层是双向链表&#xff0c;它提供了操作首尾结点的方法。 二、LinkedList的底层数据结构 LinkedList的底层数据结构是一个双向链表&#xff0c;体现…

LeetCode 0908.最小差值 I:思维(遍历)

【LetMeFly】908.最小差值 I&#xff1a;思维&#xff08;遍历&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/smallest-range-i/ 给你一个整数数组 nums&#xff0c;和一个整数 k 。 在一个操作中&#xff0c;您可以选择 0 < i < nums.length 的…

STM32:GPIO

目录 一、简介 二、结构 三、功能 1.GPIO 2.外部中断 四、示例 一、简介 输入输出&#xff08;IO&#xff09;是单片机最基本的外设功能之一。根据型号不同&#xff0c;STM32的IO端口数量不同&#xff0c;如64引脚的STM32F103RBT6有A、B、C、D四个IO端口&#xff0c;每个端…

追寻数组的轨迹,解开算法的情愫

公主请阅 1. 移除元素1.1 题目说明示例 1示例 2 1.2 题目分析1.3 代码部分1.4 代码分析 2. 删除有序数组中的重复项2.1 题目说明示例 1示例 3 2.2 题目分析2.3 代码部分2.4 代码分析 1. 移除元素 题目传送门 1.1 题目说明 题目描述&#xff1a; 给你一个数组 nums 和一个值 v…

代码随想录算法训练营第46期Day42

leetcode.518.零钱兑换 class Solution { public: //求装满背包有几种方法&#xff0c;公式都是&#xff1a;dp[j] dp[j - nums[i]]; // 如果求组合数就是外层for循环遍历物品&#xff0c;内层for遍历背包。 // 如果求排列数就是外层for遍历背包&#xff0c;内层for循环遍历物…

数据结构修炼——常见的排序算法:插入/希尔/选择/堆排/冒泡/快排/归并/计数

目录 一、常见的排序算法二、常见排序算法的实现2.1 排序算法回顾2.1.1 冒泡排序2.1.2 堆排序 2.2 直接插入排序2.3 希尔排序2.4 选择排序2.5 快速排序2.5.1 快速排序&#xff08;霍尔法&#xff09;2.5.2 快速排序&#xff08;挖坑法&#xff09;2.5.3 快速排序&#xff08;前…

Java实现html填充导出pdf

Java实现html填充导出pdf 1.依赖添加和pom修改 <!-- Thymeleaf 模板引擎 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!-- OpenPDF 库 -…

Vue3基于Element-plus的Select组建进行二次封装-demo

效果 组件 <template><ElSelectclass"follow-records-pairs-select"v-model"selectVal":placeholder"placeholder"change"selectChange"><ElOptionv-for"item in options":key"item.value":labe…

点跟踪论文—RAFT: Recurrent All-Pairs Field Transforms for Optical Flow-递归的全对场光流变换

点目标跟踪论文—RAFT: Recurrent All-Pairs Field Transforms for Optical Flow-递归的全对场光流变换 读论文RAFT密集光流跟踪的笔记 RAFT是一种新的光流深度网络结构&#xff0c;由于需要基于点去做目标的跟踪&#xff0c;因此也是阅读了像素级别跟踪的一篇ECCV 2020的经典…

Golang 怎么高效处理ACM模式输入输出

文章目录 问题bufio.NewReader高效的原理 再次提交 问题 最近在练习牛客上单调栈题目时&#xff0c;要求自己处理出入输出&#xff0c;也就是读题库要求的输入&#xff0c;计算最终结果&#xff0c;并打印输出 当我用fmt.Scan处理输入&#xff0c;用fmt.Println处理输出时&am…

使用React和Redux构建可扩展的前端应用

&#x1f496; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4bb; Gitee主页&#xff1a;瑕疵的gitee主页 &#x1f680; 文章专栏&#xff1a;《热点资讯》 使用React和Redux构建可扩展的前端应用 1 引言 2 React入门 2.1 安装React 2.2 创建组件 3 Redux基础 3.1 安装Redu…

Jsoup在Java中:解析京东网站数据

对于电商网站如京东来说&#xff0c;其页面上的数据包含了丰富的商业洞察。对于开发者而言&#xff0c;能够从这些网站中提取有价值的信息&#xff0c;进行分析和应用&#xff0c;无疑是一项重要的技能。本文将介绍如何使用Java中的Jsoup库来解析京东网站的数据。 Jsoup简介 …

特殊类设计与设计模式

&#x1f30e;特殊类设计与设计模式 文章目录&#xff1a; 特殊类设计与设计模式 特殊类设计       设计一个只能在堆上创建对象的类       设计一个只能在栈上创建对象的类       请设计一个不能被拷贝的类       请设计一个不能被继承的类 设计模式…

【汇编语言】第一个程序(一)—— 一个源程序从写出到执行的过程

文章目录 前言1. 第一步&#xff1a;编写汇编源程序2. 第二步&#xff1a;对源程序进行编译连接3. 第三步&#xff1a;执行可执行文件中的程序结语 前言 &#x1f4cc; 汇编语言是很多相关课程&#xff08;如数据结构、操作系统、微机原理&#xff09;的重要基础。但仅仅从课程…

【GIT】.cr、.gitattributes 、 .gitignore和.git各文件夹讲解介绍

在 Git 项目中&#xff0c;.cr、.gitattributes 和 .gitignore 文件分别用于不同的配置和管理功能。下面分别解释这些文件的作用和用途&#xff1a; 1. .gitignore 文件 作用&#xff1a; .gitignore 文件用于指定哪些文件或目录应该被 Git 忽略&#xff0c;不会被追踪或提交…

大数据-185 Elasticsearch - ELK 家族 Logstash 安装配置 Input 插件-stdin stdout

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

「C/C++」C++ STL容器库 之 std::string 字符串类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

vue使用jquery的ajax,页面跳转

一、引入jquery依赖 打开终端更新npm npm install -g npm 更新完后引入输入npm install jquery 加载完后 在最外层的package.json文件中加入以下代码 配置好后导入jquery 设置变量用于接收服务器传输的数据 定义ajax申请数据 服务器的Controller层传输数据 &#xff08;…

linux介绍与基本指令

前言 本次博客将会讲解linux的来源历史、linux操作系统的理解以及它的一些基本指令。 1.linux的介绍 linux的来源 linux的来源最初还是要说到unix操作系统的。 1968年&#xff0c;一些来自通用电器公司、贝尔实验室和麻省理工学院的研究人员开发了一个名叫Multics的特殊操作…