Struts2基础篇之标签
/0x00 参考
本笔记直接参考或引自如下链接文章:
http://c.biancheng.net/struts2/
https://www.w3cschool.cn/struts_2/
0x01 标签的分类和使用
Struts2 是一个优秀的 MVC 框架,其实现重点主要放在了业务逻辑控制器部分和视图页面部分。控制器部分主要由 Action 提供支持,而视图页面部分则由大量的标签提供支持。
Struts2 的标签库是一个比较完善且功能强大的标签库,它将所有标签都统一到一个标签库中,从而简化了标签的使用;它提供了对主题和模板的支持,极大地简化了视图页面代码的编写;它还提供了对 Ajax 的支持,极大地丰富了视图页面的展示效果。
与 JSTL(JSP Standard Tag Library,JSP标准标签库)相比,Struts2 标签库更加易用和强大。
标签库的分类
Struts2 框架对整个标签库进行了分类,按其功能大致可分为两类,如图所示。
可以看出,Struts2 的标签库主要分为两大类:普通标签和 UI 标签。普通标签的主要功能是在页面生成时控制页面代码的执行流程;UI 标签的主要功能是以丰富且可复用的 HTML 文件显示数据。
普通标签又分为控制标签(Control Tags)和数据标签(Data Tags)。控制标签用于完成条件逻辑和循环逻辑的控制,也可用于做集合的操作。数据标签用于输出后台的数据和完成其他数据访问功能。
UI 标签又分为表单标签(Form Tags)、非表单标签(Non-Form Tags)和 Ajax 标签。表单标签主要用于生成 HTML 页面中的表单元素,非表单标签主要用于生成非表单的可视化元素,如输出 Action 中封装的信息等。Ajax 标签主要用于提供对 Ajax 技术的支持。
标签的使用
使用 Struts2 的标签库非常简单,一般只需在 JSP 文件内使用 taglib 指令导入 Struts2 标签库即可,其导入代码如下所示:
1 | <%"s" uri="/struts-tags" %> prefix= |
在上述代码中,taglib 指令的 uri 属性用于指定引入标签库描述符文件的位置,prefix 属性用于指定引入标签库描述符文件的前缀。在 JSP 文件中,所有的 Struts2 标签都建议使用 s 作为前缀。
0x02 控制标签
针对页面中经常需要实现的流程控制和循环等操作,Struts2标签库中提供了控制标签。
if和else标签
Struts2 标签库中的 <s:if>、<s:elseif>、<s:else>
标签与 Java 中的 if、else if 和 else 语句功能类似,主要用于程序的分支逻辑控制。其中,只有 <s:if>
标签可以单独使用,而 <s:elseif>、<s:else>
都必须与 <s:if>
标签结合才能使用。其使用语法格式如下所示:
1 | <s:if test="表达式1"> |
在上述语法格式中,<s:if> 和 <s:elseif>
标签必须指定 test 属性,该属性用于设置标签的判断条件,其值是一个 boolean 类型的条件表达式。
Demo参考:https://www.w3cschool.cn/struts_2/struts_if_else_tags.html
iterator标签
<s:iterator>
标签主要用于对集合中的数据进行迭代,它可以根据条件遍历集合中的数据。<s:iterator> 标签的属性及相关说明如表所示。
属性 | 是否必须 | 默认值 | 类型 | 描 述 |
---|---|---|---|---|
begin | 否 | 0 | Integer | 迭代数组或集合的起始位置 |
end | 否 | 数组或集合的长度大小减 1,若 Step 为负,则为 0。 | Integer | 迭代数组或集合的结束位置 |
status | 否 | false | Boolean | 迭代过程中的状态 |
step | 否 | 1 | Integer | 指定每一次迭代后索引增加的值 |
value | 否 | 无 | String | 迭代的数组或集合对象 |
var | 否 | 无 | String | 将生成的 Iterator 设置为 page 范围的属性 |
id | 否 | 无 | String | 指定了集合元素的 id,现已用 var 代替 |
如果在 <s:iterator>
标签中指定 status 属性,就可以通过该属性获取迭代过程中的状态信息,如元素数、当前索引值等。通过 status 属性获取信息的方法如下表所示(假设其属性值为 st)。
方 法 | 说 明 |
---|---|
st.count | 返回当前已经遍历的集合元素的个数 |
st.first | 返回当前遍历元素是否为集合的第一个元素 |
st.last | 返回当前遍历元素是否为集合的最后一个元素 |
st.index | 返回遍历元素的当前索引值 |
这些iterator将迭代一个值。可迭代值可以是以下任一值:java.util.Collection,java.util.Iterator。在迭代一个iterator时,可以使用Sort标签对结果进行排序,或者使用SubSet标签来获取列表或数组的子集。
以下示例是检索值栈上当前对象的getDays()方法的值,并使用它迭代。<s:property/>
标签印出迭代器的当前值。
1 | <s:iterator value="days"> |
Demo参考:https://www.w3cschool.cn/struts_2/struts_iterator_tags.html
merge标签
这些merge标签采用两个或多个列表作为参数,并将它们合并在一起,如下所示:
1 | <s:merge var="myMergedIterator"> |
Demo参考:https://www.w3cschool.cn/struts_2/struts_merge_tag.html
append标签
这些append标签采用两个或多个列表作为参数,并将它们全部附加在一起,如下所示:
1 | <s:append var="myAppendIterator"> |
Demo参考:https://www.w3cschool.cn/struts_2/struts_append_tag.html
generator标签
这些generator标签基于提供的val属性生成迭代器。下面的generator标签生成一个迭代器并使用iterator标签打印出来。
1 | <s:generator val="%{'aaa,bbb,ccc,ddd,eee'}"> |
Demo参考:https://www.w3cschool.cn/struts_2/struts_generator_tag.html
0x03 数据标签
数据标签主要用于提供各种和数据访问相关的功能,如输出信息和显示调试信息等。
property标签
<s:property>
标签的作用是输出指定的值,通常输出的是 value 属性指定的值,<s:property>
标签的属性及属性说明如下。
- value:可选属性,指定需要输出的属性值,如果没有指定该属性,则默认输出 ValueStack 栈顶的值(关于值栈内容会在后面教程中进行讲解)。
- id:可选属性,指定该元素的标识。
- default:可选属性,如果要输出的属性值为 null,则显示 default属性的指定值。
- escape:可选属性,指定是否忽略 HTML 代码。默认值是 true,即忽略输出值中的 HTML 代码。
示例:
1 | <s:push value="myBean"> |
Demo参考:https://www.w3cschool.cn/struts_2/struts_property_tag.html
Demo
propertyTags.jsp,分别对 <s:property>
标签的 value、default 和 escape 属性的使用进行了演示:
1 | <%@ page language="java" contentType="text/html; charset=utf-8" |
效果:
action标签
此标签允许开发人员通过指定action名称和可选的命名空间直接从JSP页面调用action。标签的正文内容用于呈现action的结果。在struts.xml中为此action定义的任何结果处理程序将会被忽略,除非指定executeResult参数。
1 | <div>Tag to execute the action</div> |
Demo参考:https://www.w3cschool.cn/struts_2/struts_action_tag.html
include标签
include标签标签用于在当前页面中包含另一个 Web 资源(如 HTML、JSP、Servlet 等)。该标签有两个属性 id 和 value。其中 id 是可选属性,表示该标签的引用;value 是必填属性,用于指定被包含的 Web 资源文件。
在 <s:include>
标签中还可以指定多个 <s:param/>
子标签给被包含的 Web 资源传递请求参数。
Demo
file.jsp:
1 | <%@ page language="java" contentType="text/html; charset=utf-8" |
includeTags.jsp:
1 | <%@ page language="java" contentType="text/html; charset=UTF-8" |
效果:
bean标签
这些bean标签实例化一个符合JavaBeans规范的类。这个标签有一个主体,可以包含一些Param元素来设置任何mutator方法。如果在BeanTag上设置了var属性,它将把实例化的bean放入值栈的Context中。
1 | <s:bean name="org.apache.struts2.util.Counter" var="counter"> |
Demo参考:https://www.w3cschool.cn/struts_2/struts_bean_tag.html
date标签
date标签允许以快速简单的方式格式化日期。用户可以指定自定义日期格式(例如“dd/MM/yyyy hh:mm”),可以生成易读的符号(例如“在2小时14分钟内”),或者可以使用属性文件中的key:“struts.date.format”来回退到预定义的格式。
1 | <s:date name="person.birthday" format="dd/MM/yyyy" /> |
Demo参考:https://www.w3cschool.cn/struts_2/struts_date_tag.html
param标签
<s:param>
标签主要用于为其他标签提供参数,通常要与其他标签一起使用。在上一部分使用 <s:include>
标签时,就使用了 <s:param>
标签给被包含的页面传递参数。<s:param>
标签有两种用法,具体如下。
一种用法是通过标签体指定参数值,用法如下所示:
1 | <s:param name="color">red</s:param> |
另一种用法是使用 value 属性指定参数值,用法如下所示:
1 | <s:param name="color" value="'red'"/> |
上述两种用法的功能一样,不同点在于使用 value 属性设置参数值时,需要添加单引号,而使用标签体设置参数值时,不需要添加单引号。
注意:在使用 value 属性指定参数时,如果不添加单引号,则表示该值为一个引用对象,如果该对象不存在,则为其属性赋值为 null。
Demo参考:https://www.w3cschool.cn/struts_2/struts_param_tag.html
push标签
这些push标签用于推送堆栈中的值,以简化使用。
1 | <s:push value="user"> |
Demo参考:https://www.w3cschool.cn/struts_2/struts_property_tag.html
set标签
这些set标签为指定范围内的变量赋值。当你希望将变量分配给复杂表达式,然后仅仅引用该变量而不是复杂表达式时,它是很有用的。可应用的范围是应用程序,会话,请求,页面和action。
1 | <s:set name="myenv" value="environment.name"/> |
Demo参考:https://www.w3cschool.cn/struts_2/struts_property_tag.html
text标签
这些text标签用于呈现I18n文本消息。
1 | <!-- First Example --> |
Demo参考:https://www.w3cschool.cn/struts_2/struts_text_tag.html
url标签
这些url标签用于创建URL。
1 | <-- Example 1 --> |
Demo参考:https://www.w3cschool.cn/struts_2/struts_url_tag.html
a标签
<s:a>
标签与 HTML 中的 <a>
标签类似,主要用于构造 HTML 页面中的超链接。<s:a>
标签的属性及相关说明如表所示。
<s:a>
标签的使用格式如下所示:
1 | <s:a href="链接地址"></s:a> |
debug标签
<s:debug>
标签用于输出服务端对象(如 request、application、ValueStack 等)中的信息,该标签可用于辅助调试 Java Web 程序。
<s:debug>
标签只有一个 id 属性,表示 <s:debug>
标签的一个引用,通常不使用该属性。在使用 <s:debug>
标签后,网页中会生成一个 Debug 的链接,单击该链接,网页中将输出各种服务器对象的信息,如图所示。
0x04 表单标签
表单标签列表是Struts UI标签的子集。Struts2 的表单标签用于向服务器提交用户输入的信息,绝大多数的表单标签都有其对应的 HTML 标签。
Struts2的模板和主题
Struts2 的 UI 标签都是基于模板和主题的。模板就是一些代码,Struts2 标签使用这些代码渲染生成相应的 HTML 代码。模板是一个 UI 标签的外在表现形式,并且每个标签都会有自己对应的模板。如果为所有的 UI 标签提供样式和视觉效果相似的模板,那么这一系列的模板就形成了一个主题。
Struts2 默认提供了四种主题,分别为 simple、xhtml、css_xhtml 和 Ajax,这四种主题的作用如下表所示。
名称 | 作用 |
---|---|
simple 主题 | 这是最简单的主题,使用该主题时,每个 UI 标签只生成最基本的 HTML 元素,没有任何附加功能。 |
xhtml 主题 | 这是 Struts2 的默认主题,它对 simple 主题进行了扩展,提供了布局功能、Label 显示名称以及与验证框架和国际化框架的集成。 |
css_xhtml | 该主题是对 xhtml 的扩展,在 xhtml 的基础之上添加对 CSS 的支持和控制。 |
Ajax | 继承自 xhtml,提供 Ajax 支持。 |
在上述四种主题中,xhtml 是默认主题,但它有一定的局限性,因为它使用表格进行布局,并且只支持每一行放一个表单项,一旦遇到复杂的页面布局,xhtml 就不再适用了。此时,就需要改变 Struts2 的默认主题。
通常情况下,可以通过设置常量 struts.ui.theme 改变默认主题,具体方法是在 struts.xml 文件中增加相应的配置。例如想要使用 simple 的主题,那么只需要在 struts.xml 中增加如下配置即可。
1 | <constant name="struts.ui.theme" value="simple"/> |
表单标签的公共属性
每一个表单标签在 Struts2 核心 JAR 文件的 org.apache.struts2.components 包中都有一个对应的类,这些对应的类都继承自 UIBean 类。
UIBean 类提供了一组公共属性,这些属性是所有表单标签的通用属性,具体如表所示。
属性名 | 主题 | 数据类型 | 说 明 |
---|---|---|---|
title | simple | String | 设置表单元素的 title 属性 |
disabled | simple | String | 设置表单元素是否可用 |
label | xhtml | String | 设置表单元素的 label 属性 |
labelPosition | xhtml | String | 设置 label 元素的显示位置,可选值为 top 和 left(默认) |
name | simple | String | 设置表单元素的 name 属性,与 Action 中的属性名对应 |
value | simple | String | 设置表单元素的值 |
cssClass | simple | String | 设置表单元素的 class |
cssStyle | simple | String | 设置表单元素的 style 属性 |
required | xhtml | Boolean | 设置表单元素为必填项 |
requiredposition | xhtml | String | 设置必填标记(默认为*)相对于 label 元素的位置,可选值为 left 和 right(默认) |
tabindex | simple | String | 设置表单元素的 tabindex 属性 |
需要注意的是,表单标签的 name 和 value 属性基本等同于 HTML 组件的 name 和 value,但也有所不同:表单标签在生成 HTML 时,如果标签没有设置 value 属性,则会从值栈中按照 name 获取相应的值,并把这个值设置成 HTML 组件的 value。
简单而言,就是表单标签的 value 在生成 HTML 时会自动设置值,而这个值是从值栈中获取的。
form标签
form标签用于呈现 HTML 语言中的表单元素,其常用属性如表所示。
属性名 | 是否必填 | 类 型 | 说 明 |
---|---|---|---|
action | 否 | String | 指定提交时对应的 action,不需要 action 后缀 |
enctype | 否 | String | HTML 表单 enctype 属性 |
method | 否 | String | HTML 表单 method 属性 |
namespace | 否 | String | 所提交 action 的命名空间 |
在使用form标签时,一般会包含其他的表单元素,如 textfield和radio等标签。在提交表单时,这些表单元素对应的 name 属性,将其作为参数传入 Struts2 框架进行处理。
textfield和textarea标签
textfield和 textarea标签的作用比较相似,都用于创建文本框,其主要区别在于textfield创建的是单行文本框,而textarea创建的是多行文本框。二者的使用也比较简单,一般只需要指定其 label 和 name 属性即可。两个标签的用法如下所示。
textfield标签的用法:
1 | <s:textfield label="用户名" name="username"/> |
textarea标签的用法:
1 | <s:textarea label="描述" name="description"/> |
在上述两个用法中,name 属性用于指定单行/多行文本框的名称,在 Action 中,通过 name 属性即可获取单行/多行文本框的值。
此外,textarea标签还可以通过 value 属性指定单行/多行文本框的当前值,通过 cols 和 rows 属性分别指定多行文本框的列数和行数。
passWord标签
password标签用于创建一个密码输入框,它可以生成 HTML 中的 <input type="password"/>
标签。
password标签的常用属性说明如表所示。
password标签的使用方法如下所示:
1 | <s:password label="password" name="password" maxlength="20"/> |
需要注意的是,Struts2 的 password 标签与 HTML 的 input type="password"/>
标签也略有不同:<input type="password"/>
标签只要设置 value 属性就可以将 value 的属性值作为默认显示值;而 Struts2 的 password 标签除了要设置 value 属性值以外,还要设置 showPassword 属性值为 true。
radio标签
radio标签用于创建单选按钮,生成 HTML 中的 <input type="radio"/>
标签。radio 标签的常用属性说明如表所示。
属性名 | 是否必填 | 类 型 | 说 明 |
---|---|---|---|
list | 是 | Collection,Map Enmumeration,Iterator,Array | 用于生成单选框中的集合 |
listKey | 否 | String | 指定集合对象中的哪个属性作为选项的 value |
listValue | 否 | String | 指定集合对象中的哪个属性作为选项的内容 |
表中的三个属性必须要配合使用,由 list 属性指定从集合中获得元素,由 listKey 属性指定获得元素之后使用元素的哪个属性作为生成 <input type="radio"/>
的 value 属性,由 listValue 属性指定生成的 <input type="radio"/>
后展示给用户的内容。
reset标签
reset标签用于创建一个重置按钮,会生成 HTML 中的 <input type="reset"/>
标签,该标签的使用比较简单,其常用属性为 name 和 value。
其中,name 属性用于指定重置按钮的名称,在 Action 中,可以通过 name 属性获取重置按钮的值,value 属性用于显示按钮的值。该标签的用法如下所示:
1 | <s:reset value="reset"/> |
submit标签
submit标签主要用于产生 HTML 中的提交按钮,该表单元素中,可以指定提交时的 Action 对应的方法。该标签通常与 form 标签一起使用,该标签的常用属性如表所示。
checkboxlist标签
checkboxlist标签用于一次性创建多个复选框,用户可以选择创建零到多个复选框,它可以产生一组<input type="checkbox"/>
标签。
checkboxlist标签的常用属性及其说明如表所示。
在表的属性中,listKey 和 listValue 属性主要用于集合中,通常存放的是 JavaBean,可以使用这两个属性从 JavaBean 的众多属性中筛选需要的值。
select标签
select标签用于创建一个下拉列表框,它会生成 HTML 中的 <select>
标签。select标签的常用属性及其说明如表所示。
在表的属性中,headerKey 和 headerValue 属性需要同时使用,使用时会在所有的真实选项之前加添一项作为标题项。如选择城市时,可以在所有的具体城市之前添加一项“请选择”,这一项不会作为备选的值。
size 属性可以让下拉框同时显示多个值,multiple 属性让用户同时选择多个值,只是在后台的 Action 接收下拉框值时,不能使用 String 类型,而是使用 String[]
或者 List<String>
。
optgroup标签
optgroup标签用于生成选项组,通常作为 select 标签的子标签使用。由于在一个下拉列表框中可以包含多个选项组,所以 select 标签也能够包含多个 optgroup 标签。
使用 optgroup 标签时,也需要指定该标签的 list、listKey、listValue 等属性,这些属性的含义与 select 标签的相应属性含义相同。此外,optgroup 标签的 label 属性表示选项组的组名,选项组的组名是不能被选中的。
file标签
file标签用于创建一个文件选择框,它会生成 HTML 中的 <input type="file"/>
标签。该标签常用的属性及其说明如表所示。
file标签的一般用法如下所示:
1 | <s:file name="uploadFile" accept="text/*"/> |
hidden标签
hidden标签用于创建隐藏表单元素,它会生成 HTML 中的隐藏域标签 <input type="hidden"/>
。该标签在页面上没有任何显示,可用于保存或交换数据,如需要提交表单时,要传递一个值到请求参数中,就可以使用该标签。
该标签的使用非常简单,通常只需要设置 name 和 value 属性即可,其使用语法如下所示:
1 | <s:hidden name="id" value="%{id}"/> |
0x05 非表单标签
Struts2 的非表单标签主要用于在页面中生成非表单的可视化元素,以及输出在 Action 中封装的信息,如输出错误提示信息等。
常用的非表单标签有 <s:actionmessage>
、<s:actionerror>
和 <s:fielderror>
标签,它们分别用于显示动作信息、动作错误信息和字段错误信息。如果信息为空,则不显示。各标签的具体功能介绍如下。
<s:actionmessage>
标签:如果 Action 实例的 getActionMessage() 方法返回不为 null,则该标签负责输出该方法返回的系列消息。<s:actionerror>
标签:如果 Action 实例的 getActionError() 方法返回不为 null,则该标签负责输出该方法返回的系列错误。<s:fielderror>
标签:如果 Action 实例存在表单域的类型转换错误和校验错误,则该标签负责输出这些错误提示。
Demo
新建MsgAction类,分别使用了addActionMessage、addActionError 和 addFieldError 三个方法输出错误信息:
1 | package com.mi1k7ea.action; |
新建non_formTags.jsp:
1 | <%@ page language="java" contentType="text/html; charset=UTF-8" |
修改struts.xml文件:
1 |
|
效果: