struts2 标签库

学习目标

Struts2 表单标签
Struts2 非表单标签
Struts2 标签库概述
Struts2 标签库的组成

Struts2 标签库概述

Struts2 框架的标签库可以分为以下三类:

  • 用户界面标签 (UI 标签 ) :主要用来生成 HTML 元素的标签。
  • 表单标签:主要用于生成 HTML 页面的 FORM 元素,以及普通表单元素的标签。
  • 非表单标签:主要用于生成页面上的 tree , Tab 页等。
  • 非用户界面标签 ( 非 UI 标签 ) :主要用于数据访问,逻辑控制。
  • 数据访问标签:主要包含用于输出值栈 (ValueStack) 中的值,完成国际化等功能的标签。
  • 流程控制标签:主要包含用于实现分支,循环等流程控制的标签。
  • AJAX 标签 : 用于支持 Ajax 效果

Struts2 标签库

在早期的 WEB 开发中, JSP 视图控制和显示技术主要依靠 Java 脚本来实现,这样一来, JSP 页面重新嵌入了大量的 Java 脚本代码,给开发带来了极大的不方便。从 JSP1.1 规范后, JSP 增加了自定义标签库的支持。标签库是一种组件技术,通过标签库,可以将复杂的 Java 脚本代码封装在组件中,开发者只需要使用简单的代码就可以实现复杂的 Java 脚本功能。提供了 Java 脚本的复用性,提高了开发者的开发效率。Struts2 标签库相对 struts1.x 进行了巨大的改进,支持 OGNL 表达式,不再依赖任何表现层技术。

Struts2 标签的使用

我们可以在 struts2-core-2.0.11.jar 压缩文件的 META-INF 目录下找到 struts-tags.tld 文件,这个文件里定义了 Struts2 的标签。要在 jsp 中使用 Struts2 的标志,先要指明标志的引入。通过 jsp 的代码的顶部加入以下的代码:
<%@taglib prefix="s" uri="/struts-tags" %>
Struts2 标签语法 ( 一 )
Struts2 的标签都支持动态数据的访问,标签的属性都可以使用 OGNL 表达式, struts2 标签的属性具有类型,这些类型可以简单地分为字符串类型和非字符串类型,对于字符串类型的属性,如果要访问动态数据,需要使用 %{… } 这样的语法,例如: <s:include value=“%{ url }” />Include 标签的 value 属性是字符串类型, Struts2 将对这个属性进行解析,查找符合 %{…} 样式的字符串,然后将花括号之间的内容作为 OGNL 表达式进行求值。如果属性中没有 %{…} 样式的字符串,那么属性的值将被直接看成是字符串数据。例如: <s:include value=“urlTag.action” />对于非字符串类型的属性值,将直接作为 OGNL 表达式进行求值。例如: <s:property value=“username”/>property 标签的 value 属性是 Object 类型,它的值 username 将作为 OGNL 表达式进行求值,结果是值栈中位于栈顶的对象的 username 属性的值。如果要为非字符串类型的属性直接指定字符串数据,那么需要使用 OGNL 中的字符串常量,即用单引号(‘)或双引号(“)将字符串括起来。例如: <s:property value=“’zhangsan‘”/>value 属性的值‘ zhangsan’ 作为字符串常量,计算结果就是 zhangsan ,因此输出 zhangsan 。
Struts2 标签语法 ( 二 )
除上述用法之外,也可以使用 %{…} 这样的语法来指定字符串常量。例如: <s:property value=“%{ ‘zhangsan’ }”/>在这种情况下, %{ } 将被忽略,花括号中的内容将作为表达式被计算。总结一下, struts2 标签的属性按照下列的三个规则进行计算。
  • (1) 所有的字符串属性类型都会解析“ %{…}” 这样的语法。
  • (2) 所有的非字符属性类型都不会被解析,而是直接被看作一个 OGNL 表达式进行求值
  • (3) 对于第二个规则的例外情况是,如果非字符串属性使用了“ %{…}” 语法,那么 %{…} 将被忽略,花括号中的内容将作为表达式计算。
如果大家在使用标签时, 忘记了某个属性是字符串类型,还是非字符串类型,那么有一个简单的方法,那就是不考虑它是什么类型,统一使用“ %{…}” 语法。

Struts2 通用标签

Struts2 中通用标签可以分为二类:控制标签和数据标签 。控制标签用于呈现页面时控制执行流程,数据标签用于访问值栈中的数据。

Struts2 数据标签

数据标签: 用于访问 ActionContext 和值栈中的数据。数据标签包括:property set push param bean action include url a i18n text date debug

Struts2 控制标签

控制标签: 用于在呈现结果页面时控制程序的执行流程,根据程序执行的状态输出不同的结果,控制标签包括下列标签:if/elseif/else iterator append merge generator subset sort

数据标签 -----property 标签
property 标签用于输出值栈中的对象的属性 (property) 值,使用 value 属性来指定要输出的对象属性,如果没有指定 value 属性,那么默认输出栈顶对象。property 标签属性在前面的章节中,我们已经使用过了 property 标签,我们再看一个例子:<s:property value=“username” default=“ 游客” />取出栈顶对象 ( 通常是 action) 的 username 属性并输出,如果没有找到 username 属性,那么输出”游客”。
数据标签 -----set 标签
Set 标签将一个值赋给指定范围内变量。 Set 标签在某些情况下是比较有用的,例如在页面中多次引用一个复杂的表达式,我们可以将这个表达式赋给一个变量,然后直接引用变量。带来的好处就是:提升了性能 ( 表达式的计算只有一次 )提高了代码的可读性。set 标签属性Set 标签以 name 属性的值作为键 (key) ,将 value 属性的值保存到指定的范围对象中。属性 scope 取值中的 page,request,session,application 同 JSP 的 4 种范围,如果指定了 action 范围 ( 默认值 ) , value 属性的值将被同时保存到 request 范围和 OgnlContext 中。示例:访问地址: http://localhost:8080/.../setTag.action
数据标签 -----push 标签
push 标签用于把一个值压入值栈 ( 位于栈顶 ) ,注意和 set 标签的区别, set 标签是将值放到 action 上下文中。当 push 标签结束后, push 标签放入值栈中的对象将被删除,换句话说,要访问 push 标签压入栈中的对象,需要在标签内部去访问。push 标签的属性public class User { private String username; private String email; private String sex; 省略 set/get 方法 }Push 标签示例 访问: http://localhost:8080/...../pushTag.action
数据标签 -----param 标签
param 标签被用作其他标签的子标签,用于为其他标签提供参数,例如:为 bean 标签和 include 标签提供参数。param 标签的属性当使用 param 标签时, 参数的值可以通过 value 属性给出,也可以在标签体中给出 ( 开始标签和结束标签之间的文本 ) 。这二种用法有一些区别。我们看下面的例子:
<param name=“color”>blue</param> <!-- (1) -->
<param name=“color” value=“blue” /> <!-- (2) -->
在第 (1) 种情形中,参数值将作为 java.lang.String 对象 ( 即字符串 ) 被放入栈中;在第 (2) 种情形中,参数值将作为表达式进行计算,如果 blue 不存在,则 color 参数的值为 null 。在第 (1) 种情形中,要为 color 指定字符串值,可以写为:<param name=“color” value=“ ‘ blue ‘ ”/> 或者 <param name=“color” value=“%{‘ blue ‘ }“/>使用单引号包围字符串,表明这是一个字符串常量
数据标签 -----bean 标签
bean 标签用于实例化一个 JavaBean 对象 ( 必须遵照 JavaBean 规范 ) , bean 标签的标签体内可以包含多个 param 标签,用于设置 Bean 的属性 ( 必须有相应的 setter 方法 ) 。如果指定了 id 属性,则创建的 Bean 实例将被放入到 OgnlContext 中。bean 标签的属性。注意:
id 属性是可选的,无论是否指定 id 属性, bean 标签创建的 JavaBean 实例都会被压入到值栈的顶部,在 bean 标签内部可以直接访问创建的对象,无须使用” #” 标记,当 bean 标签结束的时候, bean 标签创建的实例将从值栈中删除。
如果指定了 id 属性,那么 bean 标签创建的 JavaBean 实例还将被放到 OgnlContext 中,这样在 bean 标签的外部,也可以访问创建的对象了,不过此时就要使用” #” 标记了。
bean 标签示例 bean 标签示例说明
在没有指定 id 属性的情况下,创建的 User 对象只被压入值栈,在 bean 标签的内部使用 property 标签可以直接访问 User 对象的属性。在 bean 标签外部,由于值栈中的 User 对象已被删除,所以无法访问到 User 对象的属性了。在指定了 id 属性的情况下,创建的 User 对象除了被放到值栈中外,还被放到 action 上下文中,因此在标签的内部和外部都可以访问 User 对象属性,只不过在标签外部访问时需要添加 #user 前缀 ,访问路径: http://localhost:8080/..../beanTag.action通过指定 action 的名字和可选的名称空间, action 标签允许你在 JSP 中直接调用 action 。如果将标签的 excuteResult 属性设为 true, 那么 action 对应的结果输出也将被包含到本页面中。在 action 标签的标签体中可以嵌套 param 标签,向 action 传递参数。
数据标签 -----action 标签
如果指定了 id 属性,则 action 将被放到 OgnlContext 中,在 action 标签结束后,可以通过 #id 来引用 action.ActionTagAction.java actionTagSuccess.jsp actionTag.jsp示例说明在第一个 action 标签调用中,执行了结果,但没有设置 ActiontagAction 的 username 和 email 属性,所以结果页面中的这两项输出为空。在第二个 action 标签调用中,不执行结果,调用 ActionTagAction 的 doDefault() 方法,在这个方法中,我们在请求对象中设置了 greeting 属性,在页面中使用 property 标签,通过表达式 #attr.greeting 来获取 greeting 属性。在第三个 action 标签调用中,执行了结果,并通过 param 标签设置了 ActionTagAction 的 username 和 email 属性,在结果页面中通过 property 标签输出这两个属性的值。访问路径: http://localhost:8080/....actionTag.jsp
数据标签 -----include 标签
include 标签类似于 JSP 的 <jsp:include> 标签,用于包含一个 Servlet 或 JSP 页面。 include 标签的标签体内可以包含多个 param 标签,用于向被包含的页面传递请求参数include 标签的属性 include 标签示例说明 在 jsp2.jsp 中,我们使用 JSP 的 EL 表达式来获取传的请求参数。注意:在 include 标签内部使用 param 标签向被包含的页面传递的请求参数, 不能使用如下的 property 标签来访问: <s:property value=“#parameters.username” />#parameters 引用的实质是一个 Map 对象,并不等同于 HttpServletRequest 对象。在包含页面时,如果页面中有中文,将会出现乱码,要解决这个问题,可以在 struts.xml 文件中配置 struts.i18n.encoding 属性,如下:<constant name=“struts.i18n.encoding” value=“gbk” />访问路径: http://localhost:8080/.../includeTag.jsp
数据标签 -----i18n 和 text 标签
i18n 和 text 标签用于对国际化提供支持 .i18n 标签用于将一个资源包放入值栈, text 标签用于从资源包中获取消息。例如
<s:i18n name=“ApplicationResources”><s:text name=“title”/></s:i18n>
i18n 标签将基名为 ApplicationResources 的资源包放入到值栈中, text 标签从资源包中获取键为 title 的文本消息。注意: i18n 标签放入值栈的资源包只能在 i18n 标签的标签体内访问,一旦 i18n 标签结束,值栈中的资源包将被删除。text 标签也可以单独使用,在这种情况下,它将首先查找资源包的基名与调用的 Action 类名相同的资源包。这意味着你可以在 Action 类所在的包中创建与 Action 类名相同的资源文件,例如:在 com.ibm.action 包中有一个名为 LoginAction 的类, 你可以在 com.ibm.action 包括中创建名为 LoginAction.properties 、 LoginAction_zh.properties 、 LoginAction_en.properties 等资源文件 ( 名字中的 LoginAction 部分称为基名 ) ,当执行完 LoginAction 后,在转向的结果页面中使用单独的 text 标签获取本地化的文本消息,那么 text 标签将从 com.ibm.action.LoginAction_xx.properties( 根据当前的语言环境选择某个资源文件 ) 中读取 name 属性值对应的文本消息。
数据标签 -----i18n 和 text 标签
如果找不到与 Action 类名相同的资源包,那么就从默认资源包中获取消息;如果默认资源包不存在,或者默认资源包中也没有找到对应的消息,那么 text 标签的标签体内容将作为默认消息被输出;如果没有标签体,那么 name 属性的值将直接被输出。text 标签内部还可以使用嵌套的 param 标签,来指定消息文本中的参数, param 标签的顺序对应了消息文本中参数的索引顺序。i18n 标签的属性text 标签的属性i18n 和 text 标签示例。
  • 第一步在项目的 src 下新建包: com.ibm.action, 在这个包中新建 TextTagAction 类,继承自 ActionSupport 类,注意:你的 Action 类一定要继承 ActionSupport 类,因为 ActionSupport 类对国际化提供了支持,这样 text 标签才能访问到资源包的基名与你的 Action 类名相同的资源包。TextAction 类没有任何代码,这主要是因为 ActionSupport 基类已经实现了 execute() 方法,该方法返回 Action.SUCCESS, 这就足够了,我们编写 TextAction 类的目的是为了通过这个 Action 来访问使用了 text 标签的结果页面。
  • 第二步 在 com.ibm.action 包中新建 TextTagAction.properties, 内容如下:
    username= lisi email= lisi @163. com now=Now is {0} . {1} , welcome you.键为 now 的消息有两个参数,分别用 {0} 和 {1} 来表示。
  • 第三步 新建 ApplicationResources.properties, 内容如下:
    username=zhangsan
    email=zhangsan@sina.com
    i18n 和 text 标签示例
数据标签 -----date 标签
date 标签用于格式化输出日期值,也可用于输出当前日期值与指定日期值之间的时差date 标签的属性
注意:
  • 1 、 format 属性用于指定日期的格式化样式,具体的样式规则可以参看 java.text.SimpleDateFormat 类的 API 文档。
  • 2 、将 nice 属性设为 true ,可以输出指定日期值和当前日期值之间的时差,此时 format 属性失效,也就是说,当 nice 属性为 true 时,即使你指定了 format 属性,它也不会起作用
  • 3 、如果没有使用 nice 属性,也没有指定 format 属性,那么 date 标签将会在国际化资源包中查找 struts.date.format 键,并以这个键的值作为日期的格式化样式;如果这个键不存在,那么默认将会使用 DateFormat.MEDIUM 格式化样式。
  • 4 、如果找不到 name 属性指定的 Date 对象,那么将返回空。

date 标签示例
  • 第一步在 ApplicationResources.properties 文件中添加 struts.date.format 键struts.date.format=yyyy/MM/dd hh:mm:ss
  • 第二步、可以使用 struts2 的 struts.custom.i18n.resources 属性来设置默认的资源包,编辑 struts.xml 文件,使用 constant 元素来配置 struts.custom.i18n.resources 属性,内容如下
    <constant name=“struts.custom.i18n.resources” value=“ApplicationResources”/>
    测试: http://localhost:8080/...../dateTag.jsp

控制标签

控制标签用于完成流程控制,例如分支,循环等操作。控制标签包含下面几个:
if: 用于控制选择输出。
elseif: 同 if 标签结合使用,用来控制选择输出。
else: 同 if 标签结合使用,用来控制选择输出。
append: 用来将多个集合拼接为一个新的集合。
generator: 为一个字符串解析器,用来将一个字符串解析为一个集合。
iterator: 迭代器,用来迭代输出集合数据。
merge: 用来将多个集合拼接为一个新的集合 , 同 append 有所区别。
sort: 用来对集合排序。
subset :用来截取集合的部分集合,开成新的集合子集合。
控制标签 -----if/elseif/else 标签
if/elseif 标签属性 test: 为必填属性,是一个 Boolean 类型值,决定是否显示 if 标签内容。该标签标准格式如下:
<s:if test=“ 表达式” >
…… ..
</s:if>
<s:elseif test=“ 表达式” >
…… ..
</s:elseif>
<s:else>
……… ..
</s:else>
控制标签 ----- if/elseif/else 标签举例
<%@ taglib prefix="s" uri="/struts-tags"%>
<!-- 定义一个 testname 属性 -->
<s:set name="testname" value="%{'Java'}" />
<!-- 使用 if 标签判断 -->
<s:if test="%{#testname=='Java'}">
<div>
<s:property value="%{# testname}" />
</div>
</s:if>
<s:elseif test="%{#testname=='Jav'}">
<div>
<s:property value="%{# testname}" />
</div>
</s:elseif>
<s:else>
<div>
testname 不是“ Java”
</div>
</s:else>
控制标签 ----- if/elseif/else 标签举例
<%@ taglib prefix="s" uri="/struts-tags"%>
<s:set name="age" value="61"/>
<s:if test="${age > 60}">
    老年人
</s:if>
<s:elseif test="${age > 35}">
    中年人
</s:elseif>
<s:elseif test="${age > 15}" id="wawa">
    青年人
</s:elseif>
<s:else>
    少年
</s:else>
控制标签 ----- if/elseif/else 标签举例
<%@ taglib prefix="s" uri="/struts-tags"%>
<s:set name="name" value="<%="'"+ request.getParameter("name")+"'" %>"/>
<%
  System.out.println(request.getParameter("name"));
  %>
<s:if test="#name=='zhaosoft'">
  zhaosoft here
</s:if>
<s:elseif test="#name=='zxl'">
  zxl here
</s:elseif>
<s:else>
  other is here
</s:else>


控制标签 ----- iterator (迭代标签)
Iterator (迭代)描述:用于遍历集合( java.util.Collection ) List,Map, 数组或枚举值 (java.util.iterator) 。该标签的属性如下表:
IteratorStauts 实例包含方法
int getCount(): 返回当前迭代过元素的总数。
int getIndex(): 返回当前迭代元素的索引。
boolean isEven(): 判断当前迭元素是否为偶数。
boolean isOdd(): 判断当前迭元素是否为奇数。
boolean isFirst(): 判断当前迭元素是否为第一个元素。
boolean isLast(): 判断当前迭元素是否为最后一个元素
IteratorStauts 的这些方法分别对应了 count,index,even,odd,first,last 属性
控制标签 ----- iterator 标签示例
<s:iterator value ="{' 第一个元素 ',' 第二个元素 '}" >
<p>day is: <s:property/></p>
</s:iterator>
private List myList;
private Map myMap;
public String execute() throws Exception {
myList = new ArrayList();
myList.add(" 第一个元素 ");
myList.add(" 第二个元素 ");
myList.add(" 第三个元素 ");
myMap = new HashMap();
myMap.put("key1", " 第一个元素 ");
myMap.put("key2", " 第二个元素 ");
myMap.put("key3", " 第三个元素 ");
return SUCCESS ;
}
省略生成 setter/getter 方法
<table>
<s:iterator value="{' 第一个元素 ',' 第二个元素 '}" status="st">
<tr>
<td><s:property value="#st.getIndex()" /></td>
<td><s:property /></td>
</tr>
</s:iterator>
</table>
<h2> 显示 List 属性 </h2>
<table>
<s:iterator value="myList" status="st">
<tr>
<td><s:property value="#st.getIndex()" /></td>
<td><s:property /></td>
</tr>
</s:iterator>
</table>
<h2> 显示 Map</h2>
<table>
<s:iterator value="#{'key1':' 第一个元素 ','key2':' 第二个元素 '}" status="st">
<tr>
<td><s:property value="#st.getIndex()" /></td>
<td><s:property /></td>
</tr>
</s:iterator>
</table>
<h2> 显示 Map 属性 </h2>
<table>
<s:iterator value="myMap" status="st">
<tr>
<td><s:property value="#st.getIndex()" /></td>
<td><s:property /></td>
</tr>
</s:iterator>
</table>


控制标签 ----- append 标签
append: 用来将多个集合拼接为一个新的集合。这样拼接的目的就是可以将多个集合使用一个 <iterator /> 标签完成迭代。标签属性 id: 指定了集合元素的 ID 。
private List myList1, myList2;
private Map myMap1, myMap2;
public String execute() throws Exception {
myList1 = new ArrayList();
myList2 = new ArrayList();
myList1.add(" 第一个集合 # 第一个元素 ");
myList1.add(" 第一个集合 # 第二个元素 ");
myList1.add(" 第一个集合 # 第三个元素 ");
myList2.add(" 第二个集合 # 第一个元素 ");
myList2.add(" 第二个集合 # 第二个元素 ");
myList2.add(" 第二个集合 # 第三个元素 ");
myMap1 = new HashMap(); myMap2 = new HashMap();
myMap1.put("key1", " 第一个集合 # 第一个元素 ");
myMap1.put("key2", " 第一个集合 # 第二个元素 ");
myMap1.put("key3", " 第一个集合 # 第三个元素 ");
myMap2.put("key1", " 第二个集合 # 第一个元素 ");
myMap2.put("key2", " 第二个集合 # 第二个元素 ");
myMap2.put("key3", " 第二个集合 # 第三个元素 ");
return SUCCESS;
} // 省略 setter/getter 方法
<h1><span style="background-color: #FFFFcc">Append 标签示例 </span></h1>
<h2> 拼接 List 属性 </h2>
<table>
<s:append id="newList">
<s:param value="myList1" />
<s:param value="myList2" />
</s:append>
<s:iterator value="#newList" id="name" status="st">
<tr>
<td><s:property value="#st.getIndex()" /></td>
<td><s:property /></td>
</tr>
</s:iterator>
</table>
<h2> 拼接 Map 属性 </h2>
<table>
<s:append id="newMap">
<s:param value="myMap1" />
<s:param value="myMap2" />
</s:append>
<s:iterator value="#newMap" status="st">
<tr>
<td><s:property value="#st.getIndex()" /></td>
<td><s:property /></td>
</tr>
</s:iterator>
</table>


控制标签 ----- generator 标签
generator 标签用来将指定的字符串按规定的分隔符分解为多个子字符串,生成的多个子字符串可以使用 iterator 标签输出。该标签的属性如下:
id: 指定了集合元素的 ID 。
count :可选属性,为一个 Integer 类型值,指定生成集合中元素的总数。
separator: 必填属性,为一个 String 类型值,指定用来分解字符串的分隔符。
val :必填属性,为一个 String 类型值,指定被分解的字符串。
converter :可选属性,为一个 Converter 类型实例,指定一个转换器,该转换器负责将集合中的每个字符串转换为对象。
控制标签 ----- generator 标签举例
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String execute() throws Exception {
setMsg(" 第一个元素 ; 第二个元素 ; 第三个元素 ");
return SUCCESS;
}
控制标签 ----- generator 标签举例
<h1>
<span style="background-color: #FFFFCC">Generator 标签示例 </span>
</h1>
<table>
<s:generator separator=";" val="msg" id="temp" count="2"></s:generator>
<s:iterator status="st" value="#attr.temp">
<tr>
<td><s:property value="#st.getIndex()" /></td>
<td><s:property /></td>
</tr>
</s:iterator>
</table>

注意:如果在 generator 标签中指定了 count 属性,则该集合中最多只能有 count 个元素,多余的元素将会被忽略。
控制标签 ----- append 标签
append: 用来将多个集合拼接为一个新的集合。
控制标签 ----- merge 标签
Merge 标签用于合并迭代器,其用法与 append 相似,区别就是对合并后的迭代器中的元素迭代的顺序不一样。
控制标签 ----- subset 标签
Subset 标签用于截取一个迭代器的子集,其内部实现是通过 org.apache.struts2.util.SubsetIteratorFilter 类来完成的。
Subset 标签示例
subset 标签示例
除了上面的用法之外,还可以使用 subset 属性指定一个 Decider ,用于过滤某些元素。要编写一个 Decider 类,需要实现 org.apache.struts2.util.SubsetIteratorFilter.Decider 接口,该接口只有一个方法, public boolean decide(Object element) throw Exception, 如果该方法返回 true ,表明参数 element 表示的元素应该被包含到子集中。
我们编写一个 Decider 类,选取集合中含有“ java” 子串的元素,代码如下:
首先使用 bean 标签实例化 MyDecider 对象,并将这个对象放入到 OgnlContext 中。在 subset 标签的 decider 属性中,通过 OGNL 表达式 #myDecider 来引用 MyDecider 对象。
控制标签 ----- sort 标签
Sort 标签根据 comparator 属性指定的比较器对集合进行排序,并将排序后的迭代器压入值栈的栈顶。在 sort 标签的内部,你可以使用 iterator 标签取出栈顶的迭代器对排序后的元素进行迭代。当 sort 标签结束时,栈顶的迭代器将被删除。
sort 标签示例

表单标签

Struts2 的表单标签可以分为两类, form 标签本身和包装 HTML 表单元素的其他标签。 form 标签本身的行为不同于它内部的元素。
Struts2 表单标签包括下列标签:
form textfield password radio checkbox checkboxlist select
doubleselect combobox optiontransferselect optgroup updownselect
textarea hidden file label reset submit token head
表单标签
表单标签的 name 和 value 属性
很多表单标签( form 标签除外)的 name 属性和 value 属性之间存在一个独特的关系。 name 属性除了为 HTML 表单元素指定名字,在表单提交时作为请求参数的名字外,同时它还映射到 Action 的属性。
在大多数情况下, name 属性映射到一个简单的 JavaBean 属性,例如 name 属性的值为” postalCode”, 在表单提交后, struts2 框架将会调用 Action 的 setPostalCode() 方法来设置属性。
有的时候你希望在表单元素中显示 Action 属性的数据,这时就轮到 value 属性登场了,为 value 属性指定表达式” %{postalCode}”, 这将会调用 Action 的 getPostalCode() 方法,并在表单中显示返回的数据,之后, 用户可以编辑这个值,然后重新提交它。
form 标签
form 标签输出一个 HTML 输入表单,此外, xhtml 主题的 form 标签还输出表单元素外围的表格。
1) 通常情况下,当前输出表单的请求和提交表单的请求属于同一个命名空间。例如:请求 /admin/updateCategory!default.action 输出的表单,命名空间会被假设为 /admin ,因此在使用 form 标签时,可以不使用 namespace 属性。如下:
<s:form action=“updateCategory” >
如果输出表单的请求和提交表单的请求分属于不同的名称空间,那么可以通过
namespace 属性指定处理表单提交的 action 所属的名称空间。
2) 若通过 action 的一个非 execute 方法输出表单,然后将表单提交给 action 默认的 execute 方法执行,那么 form 标签的 action 属性可以忽略。例如:对于下面的表单:
<s:form >
<s:textfield name=“username” label=“ 用户名” />
<s:submit />
</s:form>
当访问 /register!default.action 时, 输出上表单, form 标签会自动将 action 属性设为
register ,这样在表单提交后就会执行 action 的 execute 方法。
3)method 和 enctype 是 HTML form 标签的属性。
4) 当使用验证框架时,将 form 标签的 validate 属性设为 true ,将自动生成客户端的 JavaScript 验证代码。
<s:form action=“register” method=“post” />
struts2 默认的主题是 xhtml, 上述代码在客户端浏览器中的输出如下:
<s:form id=“register” onsubmit=“return true” action=“register” method=“post”>
<table class=“wwFormTable”></table>
</s:form>
可以看到 form 标签内部输出了一个 table 元素。
textfield 标签
textfield 标签输出一个 HTML 单行文本输入控件,等价于 HTML 代码: <input type=“text” …/>
看下面的代码:
<s:form action=“register” method=“post”>
<s:textfield name=“username” label=“ 用户名” />
</s:form>
password 标签
password 标签输出一个 HTML 口令输入控件,等价于 HTML 代码: <input type=“password” ../>
例子: <s:password name=“password” label=“ 密码” />
textarea 标签
textarea 标签输出一个 HTML 多行文本输入控件,等价于 HTML 代码: <textarea …./>.
例子:
<s:textarea name=“personal” cols=“30” rows=“5” label=“ 个人简历” />
select 标签
select 标签输出一个 HTML 列表框,等价于 HTML 代码:
<select …><option..></option></select>
select 标签示例
示例一:
<s:form>
<s:select label=“ 最高学历” name=“education” list=“{‘ 高中’,‘大学’,‘硕士’ }” />
</s:form>
在 select 标签的 list 属性中直接使用 OGNL 表达式创建了一个列表,列表中的每一项都将作为 HTML 列表框的一个选项。
示例二:
<s:form>
<s:select label=“ 最高学历” name=“education” list=“#{1:‘ 高中’, 2:‘ 大学’, 3:‘ 硕士’ }” />
</s:form>
在 select 标签的 list 属性中直接使用 OGNL 表达式创建了一个 Map 。在这里要注意的是, Map 的 key 是作为列表框选项的值,而 Map 中的 value 是作为列表框选项的内容。
select 标签示例
示例三:
<s:form>
<s:select label=“ 最高学历” name=“education” list=“{‘ 高中’,‘大学’,‘硕士’ }” headerKey=“-1” headerValue=“ 请选择你的学历” />
Header 选项主要用来越提示作用,因此应该将 header 选项的值 ( 通过 headerKey 属性设置 ) 设为无意义的值,例如此处的 -1.
示例四:
<s:form>
<s:select label=“ 最高学历” name=“education” list=“{‘ 高中’,‘大学’,‘硕士’ }” headerKey=“-1” headerValue=“ 请选择你的学历” emptyOption=“true” multiple=“true” / >
使用 emptyOption 属性在 header 选项后添加一个空的选项。
multiple 属性设为 false ,则只能从下拉列表中选择一个选项,如果设为 true ,则可以多选。
optgroup 标签
optgroup 标签作为 select 标签的子标签使用,用于创建选项组。你可以在 select 标签的标签体中使用一个或者多个 optgroup 标签,对选项进行逻辑分组。注意, optgroup 标签本身不能嵌套。
例子:
<%@ taglib prefix=“s” uri=“/struts-tags” %>
<s:form>
<s:select label= &quot; 选择图书 &quot; name= &quot;book&quot; list=&quot;#{1:'JAVA 核心编程 ',2:' 深入 struts2 学习 '}&quot; >
<s:optgroup label= &quot;C/C++ 图书 &quot; list=&quot;#{3:'VC++ 编程详解 ',4:'Spring 详解 '}&quot;/>
<s:optgroup label= &quot;Oracle 图书 &quot; list=&quot;#{5:'Oracle 基础 ',6:'DBA 入门 '}&quot;/>
</s:select>
</s:form>
optgroup 标签注意
optgroup 标签的 label 属性指定选项组的组名。 optgroup 标签对应的模板需要使用 listKey 和 listValue 属性的值,因此你要么为 list 属性指定一个 Map 类型的值 ( 此时, listKey 默认为 Map.Entry 的 key , listValue 默认为 Map.Entry 的 value) ,要么为 list 属性指定一个对象列表,然后使用 listKey 和 listValue 属性指定对象的属性作为选项的值和内容。
radio 标签
radio 标签输出一组 HTML 单选按钮,等价于一组 HTML 代码: <input type=“radio” …/>
例子:
<%@ taglib prefix= &quot;s&quot; uri= &quot;/struts-tags&quot; %>
<s:form>
<s:radio name= &quot;user.sex&quot; value= &quot;1&quot; list=&quot;#{1 : ' 男 ', 0 : ' 女 '}&quot; label= &quot; 性别 &quot; />
</s:form>
checkbox 标签
checkbox 标签输出一个 HTML 复选框,等价于代码: <input type=“checkbox”…/>
checkbox 标签创建一个 value 属性为 true 或者为 false 的复选框。你可以通过 checkbox 标签的 fieldValue 属性来指定创建的 HTML 复选框 value 属性的值。我们看下面的代码:
<s:checkbox name=“user.username” label=“ 是否显示 Email” fieldValue=“true” />
复选框的值是 true 还是 false ,是由 fieldValue 属性来控制的,而不是由通常的 value 属性来设置的。
注意,除非你知道你要做什么,否则不要将 fieldValue 属性设置为 false 。将 fieldValue 属性设置为 false 可能会导致一些问题。 HTML 规范规定,复选框只有在选中时才会被提交,在通常的 Servlet/JSP 处理过程中,我们可以通过判断复选框的 name 属性所指定的请求参数是否存在来获知用户是否选中了复选框,如果选中,则取出它的值。然而,在使用 struts2 框架时,这一切发生了一些微妙的变化。如果将 fieldValue 属性设置为 false ,那么复选框的值将是 false 。当没有选中复选框时,提交的请求参数中不会有复选框对应的请求参数。不过,虽然 struts2 框架没有接收到这个请求参数,但它仍然会将复选框对应的 action 属性的值设为 false 。于是你就会看到一个奇怪的现象,那就是不管你是否选中复选框,对应的 action 属性的值都是 false.
checkboxlist 标签
checkboxlist 标签使用一个列表创建一系列复选框,属性设置与 <s:select/> 和 <s:radio/> 类似,只是创建的是 HTML 复选框。不同的是, checkboxlist 标签是多选标签。
示例:
<s:form>
<s:checkboxlist name= &quot;interest&quot; list= &quot;{' 足球 ',' 篮球 ',' 排球 ',' 游泳 '}&quot; label= &quot; 兴趣爱好 &quot; />
</s:form>
hidden 标签
hidden 标签输出一个 HTML 隐藏表单元素,等价于 HTML 代码: <input type=“hidden”…/>. 在 xhtml 主题下, hidden 标签与其它的标签不太一样, hidden 标签并不输出表行。 xhtml 主题直接从 simple 主题继承了 hidden.ftl 模板。除了公共属性外, hidden 标签没有特有的属性。
示例:
<s:hidden name=“id” value=“5” />
submit 标签
submit 标签输出一个提交按钮。 submit 标签和 form 标签一起使用可以提供异步表单提交功能。 submit 标签可以输出以下三种类型的提交按钮。
input: 等价于 HTML 代码 <input type=“submit”…>
image: 等价于 HTML 代码 <input type=“image”…>
button: 等价于 HTML 代码 <input type=“submit”…>
HTML 的 button 标签已经演进为可以分别指定提交的值 ( 通过 value 属性指定 ) 和按钮上显示的文本 ( 通过标签的内容来指定 ) ,但只能用于 IE6.0 以上版本的浏览器。
submit 标签示例
例 1 :指定 image 类型的提交按钮,使用 method 属性。
<s:submit type=“image” method=“login” src=“images/login.gif” />
上述代码在客户端浏览器中的输出如下:
<input type=“image” src=“images/login.gif” name=“method:login” value=“Submit”…./>
注意生成的 input 元素的 name 属性。
例 2 :指定 button 类型的提交按钮,使用 action 和 method 属性。
<s:submit type=“button” action=“userManager” method=“login” label=“ 登录” />
上述代码在客户端浏览器中的输出如下 :
<button type=“submit” name=“action:userManager!login” value=“submit” …/> 登录 </button>
注意 button 标签的 name 属性。
通过上面的例子可以看到 name 属性有二个前缀: method 和 action ,这是 struts2 提供的一种特性,即使用一些预定义的前缀来命名一个按钮,通过按钮的名字来改变执行的行为。 Struts2 定义了 4 个前缀,如下:
method-------method:login
action--------action:userManager
redirect------redirect:cancel.jsp
redirection-action------redirect-action:register
method 前缀
使用 method 前缀,来取代 action 默认的 execute() 方法的执行。例如一个表单同时用于用户注册和登录,那么可以编写代码如下:
<s:form action=“userManager”>
<s:textfield label=“ 用户名” name=“user.username” />
<s:password label=“ 密码” name=“user.password” />
<s:submit value=“ 登录” name=“method:login” />
<s:submit value=“ 注册” name=“method:reg” />
</s:form>
注意: 1) 对于 input 类型的提交按钮,不能通过 submit 标签的 label 属性来设置提交按钮上的文本,只能使用 value 属性。
2) 可以在 submit 标签的 name 属性中直接使用 method 前缀,也可以像前面给出的例子中使用 submit 标签的 method 属性来指定处理请求的 action 方法。
action 前缀
使用 action 前缀,取代 form 标签指定的 action ,将请求导向到另外的 action 进行处理。
示例:
<s:form action=“login”>
<s:textfield label=“ 用户名” name=“user.username” />
<s:password label=“ 密码” name=“user.password” />
<s:submit value=“ 登录” />
<s:submit value=“ 注册” name=“action:register” />
</form>
如果用户已经注册,可以直接登录,否则单击注册按钮,转到注册页面。 action 前缀也可以和 struts2 的动态方法调用结合使用,例如: name=“action:userManager!register”.
redirect 前缀
使用 redirect 前缀将请求重定向到其他的 URL ,甚至可以是 Web 应用程序外部的 URL 。
示例:
<s:form action=“login”>
<s:textfield label=“ 用户名” name=“user.username” />
<s:password label=“ 密码” name=“user.password” />
<s:submit value=“ 登录” />
<s:submit value=“ 注册” name=“redirect:www.163.com” />
</form>
redirect-action 前缀
使用 redirect-action 前缀将请求重定向到其他的 action 。在内部, struts2 使用 ServletRedirectResult 来执行这个任务。
示例:
<s:form action=“login”>
<s:textfield label=“ 用户名” name=“user.username” />
<s:password label=“ 密码” name=“user.password” />
<s:submit value=“ 登录” />
<s:submit value=“ 注册” name=“redirect-action : register” />
</form>
reset 标签
reset 标签输出一个重置按钮。 reset 标签与 form 标签一起使用,用来提供表单的重置。 reset 标签可以输出以下两种类型的重置按钮:
input: 等价于 HTML 代码 <input type=“reset”…>
button: 等价于 HTML 代码 <button type=“reset”…>
示例
<s:reset value=“ 重置” />
<s:reset type=“button” label=“ 重置” />
如果是类型为 input 的重置按钮,则只能通过 value 属性来设置重置按钮上的文本。
label 标签
Xhtml 主题下的 label 标签输出两个 HTML 的 label 标签 (simple 主题下的 label 标签只输出一人 HTML label 标签 ) ,分别位于一行的两列,左边的 label 标签起提示作用,右列的 label 标签用于显示只读的 action 属性数据。
示例
<s:label label=“ 用户名” name=“user.username” />
如果 Action 实例已经创建,并且 user.username 有值,那么在表行的右列中将显示 user.username 的值。
token 标签与 file 标签
token 标签输出两个隐藏的表单字段,用于防止表单的重复提交。要让 token 标签正常工作,需要启用 TokenInterceptor 或者 TokenSessionInterceptor 拦截器。
示例: <s:token /> 具体使用后面章节讲解。
file 标签输出一个 HTML 文件选择框,等价于 HTML 代码: <input type=“file” …/>.
示例:
<s:file name=“uploadFile” accept=“text / *” />
<s:file name=“anotherUploadFile” accept=“text/html,text/plain” />
文件上传后面章节详解。

非表单标签

Struts2 的非表单标签包括下列标签:component 、 a 、 actionerror 、 actionmessage 、 fielderror
component 标签使用特定的模板输出一个自定义的 UI 小部件 (widget) 。
a 标签创建一个 HTML 超链接,等价于 HTML 代码: <a href=“….” />.
a 标签虽然可以在 simple 、 xhtml 和其它主题中使用,但它实际上是为了更好地和 ajax 主题一起工作布置而设计的 .
a 标签有一个 String 类型的 href 属性,用于指定链接的 URL 。看下面的例子:
<s:a href=“register!default.action”> 重新注册 </s:a>
actionerror 、 actionmessage 、 fielderror 标签
actionerror 、 actionmessage 、 fielderror 标签都是用于输出消息的 .
不同的是 :
actionerror 标签输出 action 的错误消息,
actionmessage 标签输出 action 的一般消息,
fielderror 标签输出 action 字段的错误消息 .
actionerror 标签输出 action 的 actionErrors 属性 (property) 保存的错误消息, actionErrors 是一个 Collection 类型的属性;
actionmessage 标签输出 action 的 actionMessages 属性保存的消息, actionMessages 是一个 Collection 类型的属性;
fielderror 标签输出 action 的 fieldErrors 属性保存的字段错误消息, actionMessages 是一个 Map 类型的属性;
对于 fielderror 标签,可以通过嵌套的 param 标签来指定输出特定字段的错误消息。
actionerror 、 actionmessage 、 fielderror 标签输出消息的布局依赖于使用的主题。
示例 : MessageAction .java
public class MessageAction extends ActionSupport
{
@Override
public String execute() throws Exception
{
// 添加 action 错误消息
addActionError("Action Error Message1");
addActionError("Action Error Message2");
// 添加 action 一般性消息
addActionMessage("Action Message1");
addActionMessage("Action Message2");
// 添加字段消息
addFieldError("field1","field1 error");
addFieldError("field2","field2 error");
return SUCCESS ;
}
}
示例 : message.jsp
<%@ page contentType= "text/html;charset=GBK" %>
<%@ taglib prefix= "s" uri= "/struts-tags" %>
<h3> 输出 action 的错误消息 </h3>
<s:actionerror/>
<h3> 输出 action 的一般性消息 </h3>
<s:actionmessage/>
<h3> 输出所有字段的错误消息 </h3>
<s:fielderror/>
<h3> 输出特定字段的错误消息 </h3>
<s:fielderror>
<s:param value= "'field2'" />
</s:fielderror>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值