3.1 Struts2的OGNL
1.OGNL表达式基础
标准的OGNL会设定一个根对象(root对象)。假设使用标准OGNL表达式来求值(不是Struts 2 OGNL),如果OGNL上下文有两个对象foo对象和bar对象,同时foo对象被设置为根对象(root),则利用下面的OGNL表达式求值。
#foo.blah // 返回foo.getBlah()
#bar.blah // 返回bar.getBlah()
blah // 返回foo.getBlah(),因为foo为根对象
在Struts 2框架中,值栈(Value Stack)就是OGNL的根对象。假设值栈中存在两个对象实例Man和Animal,这两个对象实例都有一个name属性,Animal有一个species属性,Man有一个salary属性。假设Animal在值栈的顶部,Man在Animal后面,如图5.9所示。
下面的代码片段能更好地理解OGNL表达式。
species // 调用animal.getSpecies()
salary // 调用man.getSalary()
name // 调用animal.getName(),因为Animal位于值栈的顶部
最后一行实例代码返回的是animal.getName()返回值,即返回了Animal的name属性,因为Animal是值栈的顶部元素,OGNL将从顶部元素搜索,所以会返回Animal的name属性值。如果要获得Man的name值,则需要如下代码:
man.name
Struts 2允许在值栈中使用索引,实例代码如下:
[0].name // 调用animal.getName()
[1].name // 调用man.getName()
Struts 2中的OGNL Context是ActionContext,如图3.2所示。
由于值栈是Struts 2中OGNL的根对象,如果用户需要访问值栈中的对象,则可以通过如下代码访问值栈中的属性:
${foo} //获得值栈中的foo属性
如果访问其他Context中的对象,由于不是根对象,在访问时,需要加#前缀。
application对象:用于访问ServletContext,例如#application.userName或者#application["username"],相当于调用Servlet的getAttribute("username")。
session对象:用来访问HttpSession,例如#session.userName或者#session["userName"],相当于调用session.getAttribute("userName")。
request对象 :用来访问HttpServletRequest属性的Map,例如#request.userName或者#request["userName"],相当于调用request.getAttribute("userName")。
parameters对象:用来访问HTTP请求的参数的Map,例如#parameters.name或者#parameters["name"],相当于调用request.getParameter("name")。
attr对象:包含前面4种作用域的所有属性。例如#attr.userName。
a2. OGNL集合操作
如果需要一个集合元素时(如List对象或者Map对象),可以使用OGNL中同集合相关的表达式。可以使用如下代码直接生成一个List对象:
{e1, e2, e3…}
该OGNL表达式中,直接生成了一个List对象,该List对象中包含3个元素:e1、e2和e3。如果需要更多的元素,可以按照这样的格式定义多个元素,多个元素之间使用逗号隔开。下面的代码可以直接生成一个Map对象:
#{key: value1, key2: value2, …}
对于集合类型,OGNL表达式可以使用in和not in两个元素符号。其中,in表达式用来判断某个元素是否在指定的集合对象中;not in判断某个元素是否不在指定的集合对象中,代码如下所示:
<s: if test="'foo' in {'foo', 'bar'}">
…
</s: if>
或
<s: if test="'foo' not in {'foo', 'bar'}">
…
</s: if>
除了in和not in之外,OGNL还允许使用某个规则获得集合对象的子集,常用的有以下3个相关操作符。
?:获得所有符合逻辑的元素。
^:获得符合逻辑的第一个元素。
$:获得符合逻辑的最后一个元素。
如下面的代码:
Person .relatives.{?# this.gender=='male'}
#man.{?# this.salary>2000} //返回所有工资大于2000的人的列表
#man.{^# this.salary>2000} //返回第一个工资大于2000的人的列表
#man.{$# this.salary>2000} //返回最后一个工资大于2000的人的列表
3.2 Sturts2的标签库
Struts 2的标签非常容易使用,只要在页面中导入“<%@ taglib uri="/struts-tags" prefix="s" %>”即可,无须其他配置。Struts 2的标签都是以“s”开头的,例如前面已经用过的<s:submit>、<s:property/>等。导入语句的“uri”指定标签库所在位置,“prefix”指定标签库的前缀即“s”。
Struts 2的标签库根据用途不同可以分为5类:
l 数据标签:主要用于输出值栈中的值,或者将变量、对象存入值栈。
l 控制标签:主要用于控制页面执行流程。
l 表单标签:主要用于生成HTML页面的表单元素。
l 非表单标签:主要用于生成页面上的树、Tab页等标签。
l Ajax标签:主要用于支持Ajax效果。
3.2.1 数据标签
数据标签主要用于提供各种数据访问相关的功能,这类标签通常会对值栈进行相关操作。数据标签主要包括以下几个:
l action:该标签用于在JSP页面直接调用一个Action。
l property:用于输出某个值。
l param:用于设置参数,通常用于bean标签和action标签的子标签。
l bean:该标签用于创建一个JavaBean实例。如果指定id属性,则可以将创建的JavaBean实例放入Stack Context中。
l date:用于格式化输出一个日期。
l debug:用于在页面上生成一个调试链接,当单击该链接时,可以看到当前值栈和Stack Context中的内容。
l include:用于在JSP页面中包含其他的JSP或Servlet资源。
l il8n:用于指定国际化资源文件的baseName。
l push:用于将某个值放入值栈的栈顶。
l set:用于设置一个新变量。
l text:用于输出国际化(国际化内容会在后面讲解)。
l url:用于生成一个URL地址。
1. <s:action>标签
使用action标签可以允许在JSP页面中直接调用Action。该标签有以下几个属性:
id:该属性是可选的,该属性将会作为该Action的引用标志id。
name:该属性是必选的,指定该标签调用哪个Action。
namespace:该属性是可选的,指定该标签调用的Action所在的namespace。
executeResult:该属性是可选的,指定是否要将Action的处理结果页面包含到本页面。如果值为true,就是包含,false就是不包含,默认为false。
ignoreContextParam:该属性是可选的,指定该页面中的请求参数是否需要传入调用的Action。如果值为false,将本页面的请求参数传入被调用的Action。如为true,不将本页面的请求参数传入到被调用的Action。
下面用实例说明该标签的用法。本例项目名设置为“Struts2Tag_Date”)
建立一个Action类,命名为TagAction。代码如下:
package org.action;
import com.opensymphony.xwork2.ActionSupport;
public class TagAction extends ActionSupport{
public String execute() throws Exception{
return SUCCESS; //不做任何处理,直接返回成功
}
}
在struts.xml中配置一个action请求:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="default" extends="struts-default">
<action name="action" class="org.action.TagAction">
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
然后是返回的成功页面success.jsp:
<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>success页面</title>
</head>
<body>
这里是应用Action标签时显示的内容
</body>
</html
当一个请求符合要求时,Struts 2框架就会处理,最终跳转到“success.jsp”页面并显示其内容,现在利用Struts 2的action标签,可以直接在页面发出该请求,并在发送请求的页面显示“success.jsp”的内容,页面并没有跳转到“success.jsp”。调用action标签页面action.jsp的代码为:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>action标签</title>
</head>
<body>
<!-- 这句会显示action请求的跳转页面success.jsp页面要显示的内容 -->
<s:action name="action" executeResult="true"></s:action>
<!--这句不会显示 -->
<s:action name="action"></s:action>
</body>
</html>
2.<s:property>标签
property标签的作用就是输出value属性指定的值。如果没有指定的value属性,则默认输出值栈栈顶的值。该标签有如下几个属性:
l default:该属性是可选的,如果需要输出的属性值为null,则显示default属性指定的值。
l escape:该属性是可选的,指定是否经过HTML的转义,默认值为true。
l value:该属性是可选的,指定需要输出的属性值,如果没有指定该属性,则默认输出值栈栈顶的值。
3.<s: param>标签
param标签主要用于为其他标签提供参数,例如include标签、bean标签。该标签有如下两个参数:
l name:该属性是可选的,指定需要设置参数的参数名。
l value:该属性是可选的,指定需要设置参数的参数值。
4. <s:bean>标签
该标签有如下几个属性:
name:该属性是必选的,用来指定要实例化的JavaBean的实现类。
id:该属性是可选的,如果指定了该属性,则该JavaBean实例会被放入Stack Context中,从而允许直接通过id属性来访问该JavaBean实例。
下面是一个简单的例子,有一个Student类,该类中有name属性,并有其getter和setter方法:
public class Student {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name=name;
}
然后在JSP文件的body体中加入下面的代码:
<s:bean name="org.action.Student"> //注意:这里要写完整的包名
<s:param name="name" value="'zhangsan'"/>
<s:property value="name"/>
</s:bean>
在项目中导入Struts 2.3.1的9个重要Jar包,再把Student类放在项目src文件夹的org.action包中,<s:bean>标签内容放在一个JSP文件的body体内,再修改web.xml文件,就可以部署运行该项目(本例无须创建和配置struts.xml),会得到如图3.4所示的界面。
5. <s:date>标签
date标签主要用于格式化输出一个日期。该标签有如下属性:
format:该属性是可选的,如果指定了该属性,将根据该属性指定的格式来格式化日期。
nice:该属性是可选的,该属性的取值只能是true或false,用于指定是否输出指定日期和当前时刻之间的时差。默认为false,即不输出时差。
name:属性是必选的,指定要格式化的日期值。
id:属性是可选的,指定引用该元素的id值。
nice属性为true时,一般不指定format属性。因为nice为true时,会输出当前时刻与指定日期的时差,不会输出指定日期。当没有指定format,也没有指定nice="true"时,系统会采用默认格式输出。其用法为:
<s:date name="指定日期取值" format="日期格式"/><!-- 按指定日期格式输出 -->
<s:date name="指定日期取值" nice="true"/><!-- 输出时间差 -->
<s:date name="指定日期取值"/><!—默认格式输出-->
6.<s:debug>标签
debug标签用来进行页面调试,它会在页面上生成一个链接,单击该链接就可以看到当前值栈和栈上下文中的所有信息。用法非常简单,例如下面的debug.jsp页面的代码:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>debug标签</title>
</head>
<body>
<s:debug/>
</body>
</html>
7.< s:include>标签
include标签用来在指定页面中引入其他JSP页面,与JSP的<jsp:include/>类似,但却不同,该标签可以使用<param>标签向被包含的页面中传入参数。该标签仅含一个属性:
l value:用来指定包含页面的路径及文件名。
例如,先准备一个将被导入的页面“includer.jsp”,代码如下:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>被导入的页面</title>
</head>
<body>
该页面将被导入,携带的参数值为:
${param.java}
</body>
</html>
下面是运行页面“include.jsp”,将上面的“includer.jsp”导入:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>include标签</title>
</head>
<body>
不带参数的导入:
<br>
<s:include value="includer.jsp"/>
<br>
带参数的导入:<br>
<s:include value="includer.jsp">
<s:param name="java" value="'Java EE实用教程'"/>
</s:include>
<br>
</body>
</html>
其它标签时间原因略
3.2.2 控制标签
控制标签主要用于完成流程的控制,以及对值栈的相关操作。控制标签有以下几个:
l if:用于控制选择输出的标签。
l elseif:用于控制选择输出的标签,必须和if标签结合使用。
l else:用户控制选择输出的标签,必须和if标签结合使用。
l iterator:用于将集合迭代输出。
l append:用于将多个集合拼接成一个新的集合。
l merge:用于将多个集合拼接成一个新的集合。但与append的拼接方式不同。
l generator:用于将一个字符串按指定的分隔符分隔成多个字符串,临时生成的多个子字符串可以使用iterator标签来迭代输出。
l sort:用于对集合进行排序。
l subset:用于截取集合的部分元素,形成新的子集合。
2.<s:iterator>标签
iterator标签主要用于对集合进行迭代,这里的集合包含List、Set,也可以对Map类型的对象进行迭代输出。该标签有如下属性:
l value:该属性是可选的,指定被迭代的集合,被迭代的集合通常都由OGNL表达式指定。如果没有指定该属性,则使用值栈栈顶的集合。
l id:该属性是可选的,指定集合元素的ID。
l status:该属性是可选的,指定迭代时的IteratorStatus实例,通过该实例可判断当前迭代元素的属性。如果指定该属性,其实例包含如下几个方法:
int getCount():返回当前迭代了几个元素。
int getIndex():返回当前迭代元素的索引。
boolean isEven:返回当前被迭代元素的索引元素是否是偶数。
boolean isOdd:返回当前被迭代元素的索引元素是否是奇数。
boolean isFirst:返回当前被迭代元素的是否是第一个元素。
boolean isLast:返回当前被迭代元素的是否是最后一个元素。
例如下面的iterator.jsp页面
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>iterator标签</title>
<body>
<table border="1" >
<s:iterator value="{'Java EE基础实用教程','Eclipse应用实践教程','Java EE实用教程',
'C++实用教程'}" id="book" status="st">
<!-- 如果当前地带为偶数行背景为#CCCCFF -->
<!-- 其中#st.even为用OGNL取值,下同 -->
<tr
<s:if test="#st.even">bgcolor="#CCCCFF"</s:if>
>
<td><s:property value="book"/></td>
<td>当前迭代索引为:<s:property value="#st.getIndex()"/></td>
<td>当前迭代了元素个数为:<s:property value="#st.getCount()"/></td>
</tr>
</s:iterator>
</table>
</body>
</html>
3.<s:append>标签
append标签用于将多个集合对象拼接起来,组成一个新的集合。该标签有1个属性:
l id:该属性是可选的,用来指定拼接之后的新集合的引用ID。
在使用append标签的时候,可以通过在标签体中加入param标签来指定想要进行拼接的集合。例如下面的append.jsp页面。
运行结果如图3.12所示,可以发现两个集合被拼接到了一起(后面一个集合紧接在前面一个集合后面)。
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head><title>append标签</title></head>
<body>
<s:append id="books">
<s:param value="{'C++实用教程','SQL Server实用教程','VC++实用教程'}"></s:param>
<s:param value="{'Eclipse应用实践教程','J2EE 应用实践教程'}"></s:param>
</s:append>
<table border="1" bgcolor="#CCCCFF">
<caption>郑阿奇系列丛书:</caption>
<s:iterator value="#books" status="s">
<tr>
<td width="30"><s:property value="#s.count"/></td>
<td><s:property/></td>
</tr>
</s:iterator>
</table>
</body>
</html>4.<s:merge>标签
merge标签的作用和append标签相同,都是用来将几个集合拼接到一起,组成一个新的集合,但二者的拼接方式不同,可以把下面的代码片段
5.<s:generator>标签
generator标签用于将一个字符串按照指定的分隔符分割成多个子字符串,并将这些子字符串放入一个集合中。该标签有如下5个属性:
l id:该属性是可选的,用来指定生成的子字符串组成的集合在上下文栈中的名字。
l val:该属性是必需的,用来指定将要被分割的字符串。
l separator:该属性是必需的,用来指定分割字符串的分隔符。
l count:该属性是可选的,用来指定生成集合中元素的总数。
l converter:该属性是可选的,用来指定将集合中的每一个字符串转换成对象的转换器。
6.<s: sort >标签
sort标签用于对指定的集合元素进行排序,排序时必须提供自己的排序规则。该标签有如下属性:
l id:该属性是可选的,用于指定排序后的集合在页面上下文的名称。
l comparator:该属性是必需的,用于指定排序规则。
l source:该属性是可选的,用于指定需要进行排序的集合,如果未指定该属性,则将对值栈栈顶集合进行排序。
7.<s: subset>标签
subset标签用来生成一个新的集合,并且该新集合是原集合的子集。在新集合生成时所有元素都被放到值栈的栈顶,当subset标签结束时这些元素被弹出值栈。该标签有下面5个属性:
l id:该属性是可选的,用来指定新集合在上下文中的名字。在标签外面引用新集合时需要用此值。
l source:该属性是可选的,用来指定原集合,若未指定该属性,则此默认值是值栈栈顶元素。
l start:该属性是可选的,用来指定从原集合的哪个元素开始,默认值为0。
l count:该属性是可选的,用来指定要得到元素的个数,默认为全部原集合中的元素数。
l decider:该属性是可选的,用来指定截取策略。
3.2.3 表单标签
表单标签是用来生成表单元素的,Struts 2的表单标签分为两种,一种是与HTML标签作用相同的标签,另一种是其特有的一些标签。下面先简单介绍一些与HTML标签作用相同的标签,如表3.1所示。
虽然这些标签与HTML标签功能相同,但实际上它们有一些HTML标签没有的属性,下面列举Struts 2标签的一些通用属性。
l cssClass:指定表单元素的class属性。
l cssStyle:指定表单元素的CSS样式。
l disabled:指定表单元素是否可用,若该属性值为“true”,则该表单元素将变灰不可用。
l label:指定表单元素的标签。
l labelPosition:指定表单元素标签的位置。该属性有“top/left”两种取值,默认为left。
l name:指定表单元素提交数据的名称。
l required:指定该表单元素为必填元素,若指定值为“true”,将在该元素的标签后加“*”符号。
l requiredposition:定义必填元素的标志“*”的位置。
l size:指定表单元素的大小。
l tabIndex:指定表单元素用tab切换时的序号。
l title:指定表单元素的标题。
l value:指定表单元素的值。
l theme:指定表单的主题样式。可选值有xhtml、simple、ajax、css_xhtml。默认值为xhtml。
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>普通form标签</title>
</head>
<body>
<!-- 使用s:form标签时可以不带.action后缀-->
<s:form action="login">
<!-- 指定必填,标签后将多出*符号 -->
<s:textfield value="textfield" name="textfild" label="文本框" required="true"></s:textfield>
<s:password value="password" name="password" label="密码框" required="true"></s:password>
<s:hidden value="hidden" name="hidden"></s:hidden>
<!-- 指定了disabled属性为true,该文本区域将会变灰,不可用 -->
<s:textarea value="textarea标签" name="textarea" label="文本域" disabled="true"></s:textarea>
<s:checkbox value="true" label="篮球" name="checkbox"></s:checkbox>
<s:checkbox value="false" label="足球" name="checkbox"></s:checkbox>
<s:radio list="#{1:'男',0:'女'}" label="radio标签" name="radio" value="1"></s:radio>
<s:select list="#{1:'第一个元素',2:'第二个元素',3:'第三个元素'}"
label="select标签" name="select"></s:select>
<s:file name="file" label="文件上传" accept="text/*"></s:file>
<s:submit value="提交"></s:submit>
<s:reset value="重置"></s:reset>
</s:form>
</body>
</html>
下面讲解一些Sturts2特有的标签
1. <s:checkboxlist>标签
checkboxlist标签可以一次创建多个复选框,相当于HTML标签的多个<input type=“checkbox”…/>,它根据list属性指定的集合来申请多个复选框。因此,该标签需要指定一个list属性。用法举例:
<s:checkboxlist label="请选择你喜欢的水果" list="{'apple','oranger','pear','banana'}" name="fruit">
</s:checkboxlist>
或者为:
<s:checkboxlist label="请选择你喜欢的水果" list="#{1:'apple',2:'oranger',3:'pear',4:'banana'}" name="fruit">
</s:checkboxlist>
举例如下:
举例如下:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>checkboxlist标签</title>
</head>
<body>
<s:form>
<s:checkboxlist list="{'Struts2','Hibernate','Spring'}" label="用list集合生成复选框"
name="java" labelposition="top"/>
<s:checkboxlist list="#{1:'Struts2',2:'Hibernate',3:'Spring'}"listKey="key" listValue="value"
name="java ee" label="用Map集合生成复选框" labelposition="top"/>
<s:set name="list" value="{'Struts2','Hibernate','Spring'}"></s:set>
<s:checkboxlist list="#list" name="check" label="从别处取值生成复选框"
labelposition="top"></s:checkboxlist>
</s:form>
</body>
</html>
2.<s:combobox>标签
combobox标签用来生成一个下拉菜单及文本框的组合,用户可以直接在文本框中输入内容,也可以在下拉菜单中进行选择,选中的内容会自动添加到文本框中,表单提交时只会提交文本框中的内容。该标签有如下参数:
l list:该属性是必需的,用来设置下拉菜单中的选项。
用法举例:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
</head>
<body>
<s:form>
<s:combobox list="{'Struts2','Hibernate','Spring','Ajax'}" name="combobox"
label="请选择"/>
</s:form>
</body>
</html>
3.<s:doubleselect>标签
double标签用于生成两个相互关联的下拉列表,子列表框中的内容会根据父列表被选定内容的变化而发生变化。该标签一般应用在选择省、城市的表单中,省下拉列表为父列表,城市下拉列表为子列表。该标签有如下几个属性:
l list:该属性是必需的,用来指定父列表框中选项的集合。
l listKey:该属性是可选的,用来指定父下拉列表框中被选定的内容。
l listValue:该属性是可选的,用来指定父下拉列表框在页面上显示的内容。
l doubleList:该属性是可选的,用来指定子列表框中选项的集合。
l doubleListKey:该属性是可选的,用来指定子下拉列表框中被选定的内容。
l doubleListValue:该属性是可选的,用来指定子下拉列表框在页面上显示的内容。
l name:该属性是可选的,用来指定父下拉列表框提交数据的名称。
l doubleName:该属性是可选的,用来指定子下拉列表框提交数据的名称。
下面的doubleselect.jsp说明该标签的用法:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>doubleselect</title>
</head>
<body>
<s:form action="select">
<s:set name="ds" value="#{'江苏':{'南京','无锡','苏州'},
'安徽':{'合肥','六安','芜湖'},
'河南':{'郑州','信阳','南阳'}}">
</s:set>
<s:doubleselect list="#ds.keySet()" doubleName="dn" doubleList="#ds[top]"
name="n" label="请选择地方" labelposition="top"></s:doubleselect>
</s:form>
</body>
</html>
注意:在应用该标签时,必须在具体的form下,并且该form要指定具体的action,而在struts.xml配置文件中也必须有该action的配置。例如,该例中:
...
<package name="default" extends="struts-default">
<action name="select">
</action>
</package>
...
因为该例中没有过多的处理,只要有上面简单的配置即可。该例运行后的界面如图3.22所示。
4.<s:updownselect>标签
updownselect标签用来生成一个列表框,列表框中选项可以手动进行排序。该标签属性如下:
l list:该属性是必需的,用于指定生成复选框的集合。
l listKey:该属性是可选的,用于指定选择该复选框提交之后传递的值,或者代表Map类型中的key。
l listValue:该属性是可选的,用于指定当前复选框所显示的内容,或者代表Map类型中的value。
l allowMoveUp:该属性是可选的,用于指定是否显示上移按钮,默认值为true。
l allowMoveDown:该属性是可选的,用于指定是否显示下移按钮,默认值为true。
l allowSelectAll:该属性是可选的,用于指定是否显示全选按钮,默认值是true。
l moveUpLabel:该属性是可选的,用于指定上移按钮上的文本,默认值为“^”。
l moveDownLabel:该属性是可选的,用于指定下移按钮上的文本,默认值为“v”。
l selectAllLabel:该属性是可选的,用于指定全选按钮上的文本,默认值为“*”。
下面的updownselect.jsp展示了updownselect标签的特性:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<s:head/>
<title>updowmselect标签</title>
</head>
<body>
<s:form action="select">
<s:updownselect list="{'Struts2','Hibernate','Spring','Ajax'}"
moveUpLabel="上移" moveDownLabel="下移" selectAllLabel="全选">
</s:updownselect>
</s:form>
</body>
</html>
这里指定了moveUpLabel等的值,所以就会显示其指定的值,如果没有指定就会显示它们的默认值“^”等。还有一点要注意的是,应用该标签时必须加入“<s:head/>”。该例运行结果如图3.23所示
5.<s:optiontransferselect>标签
optiontransferselect标签用于生成两个列表选择框,并且生成一系列的按钮用于控制各选项在两个下拉列表框之间的移动、升降等。当提交表单时,两个列表选择框对应的请求参数都会被提交。该标签的属性如下:
l allowAddToLeft:该属性是可选的,指定是否显示左移按钮,默认值为true。
l addToLeftLabel:该属性是可选的,指定左移按钮上的文本,默认值为“<—”。
l allowAddToRight:该属性是可选的,指定是否显示右移按钮,默认值为true。
l addToRightLabel:该属性是可选的,指定右移按钮上的文本,默认值为“—>”。
l allowAddAllToLeft:该属性是可选的,指定是否显示左移全部选项的按钮,默认值为true。
l addAllToLeftLabel:该属性是可选的,指定左移全部选项按钮上的文本,默认值为“<<—”。
l allowAddAllToRight:该属性是可选的,指定是否显示右移全部选项的按钮,默认值为true。
l addAllToRightLabel:该属性是可选的,指定右移全部选项按钮上的文本,默认值为“-->>”。
l allowMoveUP:该属性是可选的,指定是否显示上移按钮,默认值为true。
l moveUpLabel:该属性是可选的,指定上移按钮上的文本,默认值为“^”。
l allowMoveDown:该属性是可选的,指定是否显示下移按钮,默认值为true。
l moveDownLabel:该属性是可选的,指定下移按钮上的文本,默认值为“v”。
l allowSelectAll:该属性是可选的,指定是否显示全选按钮,默认值为true。
l selectAllLabel:该属性是可选的,指定全选按钮上的文本,默认值为“<*>”。
l list:该属性是必需的,指定生成第一个列表框选项集合。
l listKey:该属性是可选的,指定选择第一个列表框提交之后传递的值。
l listValue:该属性是可选的,指定第一个列表框所显示的内容
name:该属性是可选的,指定第一个列表框提交的数据名。
l leftTitle:该属性是可选的,指定第一个列表框的标题。
l multiple:该属性是可选的,指定第一个列表框是否允许多选。
l emptyOption:该属性是可选的,指定第一个列表框是否包含一个空选项,默认值为false。
l headerKey:该属性是可选的,指定第一个列表框选项头信息的key值。
l headerValue:该属性是可选的,指定第一个列表框选项头信息的value值。此参数必须与headerKey结合使用。
l doubleList:该属性是必需的,指定第二个列表框中的选项集合。
l doubleListKey:该属性是可选的,指定第二个列表框传递到服务器的值。
l doubleListValue:该属性是可选的,指定第二个列表框所显示的内容。
l doubleName:该属性是必需的,指定第二个列表框提交的数据名。
l rightTitle:该属性是可选的,指定第二个列表框的标题。
l doubleMultiple:该属性是可选的,指定第二个列表框是否允许多选。
l doubleEmptyOption:该属性是可选的,指定第二个列表框是否包含一个空选项,默认值为false。
doubleHeaderKey:该属性是可选的,指定第二个列表框选项头信息的key值。
l doubleHeaderValue:该属性是可选的,指定第二个列表框选项头信息的value值。此参数必须与doubleHeaderKey结合使用。
这个标签包含的属性比较多,配置也相对复杂,下面通过optiontransferselect.jsp来介绍该标签的一些主要属性。
该例应用了optiontransferselect标签的部分常用属性,运行结果如图3.24所示。
6.<s:optgroup>标签
optgroup标签用于生成一个下拉列表框的选项组,通常和select标签组合使用,在一个select标签中可以包含多个optgroup生成的选项组,该标签包含以下4个属性:
l label:该属性是可选的,用来指定选项组的组名。
l list:该属性是可选的,用来指定选项组内的选项。
l listKey:该属性是可选的,用来指定选择该选项提交之后传递的值。
l listValue:该属性是可选的,用来指定当前列表框中所显示的内容。
下面的optgroup.jsp展示了optgroup标签的特性。
运行结果如图3.25所
7.<s:token>标签
token标签用来解决表单多次提交的问题,使用该标签不会在页面生成任何表单元素。在页面中直接加上:
<s:token/>
包含页面被加载后,token标签会生成下面的一段代码:
<input type="hidden" name="struts.token" value="具体内容" />
3.2.4 非表单标签
1.<s:actionerror>、<s:actionmessage>、<s:fielderror>标签
actionerror标签用来输出存储在ActionError中的值,actionmessage标签用来输出存储在ActionMessage中的值,fielderror标签用来输出存储在FieldError中的值。用法非常简单,只要在Action类中保存了它们的值,在页面中应用相应的标签时就可以输出它们的值。例如,在Action类中有如下保存:
package org.action;
import com.opensymphony.xwork2.ActionSupport;
public class NonFormAction extends ActionSupport{
public String execute() throws Exception {
addActionError("actionError中保存的错误信息");
addActionMessage("actionMessage中保存的错误信息");
addFieldError("username","fieldError中保存的username错误信息");
addFieldError("password","fieldError中保存的password错误信息");
return SUCCESS;
}
}
2.<s:component>标签
component标签用来创建自定义视图组件,该标签不经常用到,它有如下3个属性:
l templateDir:该属性是可选的,用于指定引用主题所在的位置。
l theme:该属性是可选的,用于指定引用主题的主题名。
l template:该属性是可选的,用于指定要使用的组件名。
除了这些属性外,该标签还可以指定<s:param>子标签,用于修改标签模版中传入额外的参数。