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
<%@taglib prefix="s" uri="/struts-tags" %>

在上述代码中,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
2
3
4
5
6
7
8
9
<s:if test="表达式1">
标签体
</s:if>
<s:elseif test="表达式2">
标签体
</s:elseif>
<s:else>
标签体
</s:else>

在上述语法格式中,<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
2
3
<s:iterator value="days">
<p>day is: <s:property/></p>
</s:iterator>

Demo参考:https://www.w3cschool.cn/struts_2/struts_iterator_tags.html

merge标签

这些merge标签采用两个或多个列表作为参数,并将它们合并在一起,如下所示:

1
2
3
4
5
6
7
8
<s:merge var="myMergedIterator">
<s:param value="%{myList1}" />
<s:param value="%{myList2}" />
<s:param value="%{myList3}" />
</s:merge>
<s:iterator value="%{#myMergedIterator}">
<s:property />
</s:iterator>

Demo参考:https://www.w3cschool.cn/struts_2/struts_merge_tag.html

append标签

这些append标签采用两个或多个列表作为参数,并将它们全部附加在一起,如下所示:

1
2
3
4
5
6
7
8
<s:append var="myAppendIterator">
<s:param value="%{myList1}" />
<s:param value="%{myList2}" />
<s:param value="%{myList3}" />
</s:append>
<s:iterator value="%{#myAppendIterator}">
<s:property />
</s:iterator>

Demo参考:https://www.w3cschool.cn/struts_2/struts_append_tag.html

generator标签

这些generator标签基于提供的val属性生成迭代器。下面的generator标签生成一个迭代器并使用iterator标签打印出来。

1
2
3
4
5
<s:generator val="%{'aaa,bbb,ccc,ddd,eee'}">
<s:iterator>
<s:property /><br/>
</s:iterator>
</s:generator>

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
2
3
4
5
6
7
<s:push value="myBean">
<!-- Example 1: -->
<s:property value="myBeanProperty" />

<!-- Example 2: -->TextUtils
<s:property value="myBeanProperty" default="a default value" />
</s:push>

Demo参考:https://www.w3cschool.cn/struts_2/struts_property_tag.html

Demo

propertyTags.jsp,分别对 <s:property> 标签的 value、default 和 escape 属性的使用进行了演示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!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>property标签</title>
</head>
<body>
输出字符串:
<s:property value="'this is a string'"/><br/>
输出默认值:
<s:property value="" default="default_value"/><br/>
忽略HTML代码:
<s:property value="'<h2>www.mi1k7ea.com</h2>'" escape="true"/><br/>
不忽略HTML代码:
<s:property value="'<h2>www.mi1k7ea.com</h2>'" escape="false"/><br/>
</body>
</html>

效果:

action标签

此标签允许开发人员通过指定action名称和可选的命名空间直接从JSP页面调用action。标签的正文内容用于呈现action的结果。在struts.xml中为此action定义的任何结果处理程序将会被忽略,除非指定executeResult参数。

1
2
3
4
5
6
7
<div>Tag to execute the action</div>
<br />
<s:action name="actionTagAction" executeResult="true" />
<br />
<div>To invokes special method in action class</div>
<br />
<s:action name="actionTagAction!specialMethod" executeResult="true" />

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
2
3
4
5
6
7
8
9
10
11
12
13
14
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!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>property标签</title>
</head>
<body>
<h2>这是被包含页面includefile.jsp</h2><br/>
传递的参数为:<%out.print(request.getParameter("username")); %>
</body>
</html>

includeTags.jsp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<!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>includeTags</title>
</head>
<body>
<h3>这是包含页面includeTags.jsp</h3><br/>
<s:include value="file.jsp">
<s:param name="username" value="'mi1k7ea'"/>
</s:include>
</body>
</html>

效果:

bean标签

这些bean标签实例化一个符合JavaBeans规范的类。这个标签有一个主体,可以包含一些Param元素来设置任何mutator方法。如果在BeanTag上设置了var属性,它将把实例化的bean放入值栈的Context中。

1
2
3
4
<s:bean name="org.apache.struts2.util.Counter" var="counter">
<s:param name="first" value="20"/>
<s:param name="last" value="25" />
</s:bean>

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
2
3
4
<s:date name="person.birthday" format="dd/MM/yyyy" />
<s:date name="person.birthday" format="%{getText('some.i18n.key')}" />
<s:date name="person.birthday" nice="true" />
<s:date name="person.birthday" />

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
2
3
4
<s:push value="user">
<s:propery value="firstName" />
<s:propery value="lastName" />
</s:push>

Demo参考:https://www.w3cschool.cn/struts_2/struts_property_tag.html

set标签

这些set标签为指定范围内的变量赋值。当你希望将变量分配给复杂表达式,然后仅仅引用该变量而不是复杂表达式时,它是很有用的。可应用的范围是应用程序,会话,请求,页面和action。

1
2
<s:set name="myenv" value="environment.name"/>
<s:property value="myenv"/>

Demo参考:https://www.w3cschool.cn/struts_2/struts_property_tag.html

text标签

这些text标签用于呈现I18n文本消息。

1
2
3
4
5
6
7
8
9
10
11
12
<!-- First Example -->
<s:i18n name="struts.action.test.i18n.Shop">
<s:text name="main.title"/>
</s:i18n>

<!-- Second Example -->
<s:text name="main.title" />

<!-- Third Examlpe -->
<s:text name="i18n.label.greetings">
<s:param >Mr Smith</s:param>
</s:text>

Demo参考:https://www.w3cschool.cn/struts_2/struts_text_tag.html

url标签

这些url标签用于创建URL。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<-- Example 1 -->
<s:url value="editGadget.action">
<s:param name="id" value="%{selected}" />
</s:url>

<-- Example 2 -->
<s:url action="editGadget">
<s:param name="id" value="%{selected}" />
</s:url>

<-- Example 3-->
<s:url includeParams="get">
<s:param name="id" value="%{'22'}" />
</s:url>

Demo参考:https://www.w3cschool.cn/struts_2/struts_url_tag.html

a标签

<s:a> 标签与 HTML 中的 <a> 标签类似,主要用于构造 HTML 页面中的超链接。<s:a> 标签的属性及相关说明如表所示。

<s:a> 标签的使用格式如下所示:

1
2
<s:a href="链接地址"></s:a>
<s:a namespace="" action="">www.baidu.com</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
2
<s:reset value="reset"/>
<s:reset name="reset" value="重置"/>

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
2
<s:file name="uploadFile" accept="text/*"/>
<s:file name="otherUploadFile" accept="text/html,text/plain"/>

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
2
3
4
5
6
7
8
9
10
11
12
package com.mi1k7ea.action;

import com.opensymphony.xwork2.ActionSupport;

public class MsgAction extends ActionSupport {
public String execute() throws Exception {
this.addActionMessage("<s:actionmessage>标签输出的内容");
this.addActionError("<s:actionerror>标签输出的内容");
this.addFieldError("msg", "<s:fielderror>标签输出的内容");
return SUCCESS;
}
}

新建non_formTags.jsp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!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>errorTags</title>
</head>
<body>
<s:actionmessage/>
<s:actionerror/>
<s:fielderror/>
<s:fielderror value="msg"/><!-- 有无value效果一样 -->
</body>
</html>

修改struts.xml文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
<constant name="struts.devMode" value="true" />
<package name="helloworld" extends="struts-default">

<action name="msg" class="com.mi1k7ea.action.MsgAction">
<result>/non_formTags.jsp</result>
</action>

</package>
</struts>

效果: