Struts 2标签01
a标签创建一个HTML超链接,等价于HTML 的<a href=""....
示范代码:
<s:a href="login.action">登陆</s:a>
下面是本示例应用中的Action类,包含连个处理逻辑。代码如下
public class TagAction extednds ActionSupport
{
//封装用户请求参数的author属性
private String author;
//author的get和set的方法,省略……
public String execute() throws Exception
{
return "done";
}
public String login() throws Exception
{
ServletActionContext.getRequest().setAttribute("author",getAuthor());
return "done";
}
}
上面的Action类包含两个处理逻辑,可以在struts.xml文件中通过指定method属性来将该Action类映射成两个逻辑Action。代码如下
<package name="lee" extends="struts-default">
<!--定义第一个Action,使用lee.TagAction的execute方法作为处理逻辑-->
<action name="tag1" class="lee.TagAction">
<result name="done">succ.jsp</result>
</action>
<!--定义第二个Action,使用lee.TagAction的login方法作为处理逻辑-->
<action name="tag2" class="lee.TagAction" method=“login”>
<result name="done" > loginSucc.jsp </result>
</action>
..............
</package>
上面配置文件将一个Action类定义成两个逻辑Action,可以在JSP页面中通过<s:action.../>标签来调用这两个逻辑Action,部分jsp代码如下:
下面调用第一个Action,并将结果包含到本页面中。
<s:action name="tage1" executeResult=“true” />
下面调用第二个Action,并将结果包含到本页面中。<br>
阻止本页面请求参数传入Action <br>
<s:action name=“tag2” executeResult="true" ignoreContextParams="true" />
</hr>
下面调用第二个Action,且不将结果包含到本页面中。<br>
<s: action name="tag2" executeResult="false" />
<s:property value="#attr.author"/>
上面页面中,通过指定executeResult属性来控制是否将处理结果包含到本页面中;还可以通过ignoreContextParams属性来决定是否将本页面的请求参数出入Action。
这个标签负责输出错误信息到客户端,例子如下:
Action代码如下:
package lee;
import com.opensymphony.xwork2.ActionSupport;
public class DemoAction extends ActionSupport
{
@Override
public String execute()
{
addActionError("第一条错误消息!");
addActionError("第二条错误消息!");
return SUCCESS;
}
}
JSP页面代码如下:
<%@ page contentType="text/html; charset=GBK" language="java"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
</head><body><s:actionerror/></body></html>
这个标签负责输出提示信息到客户端,例子如下:
Action代码如下:
package lee;
import com.opensymphony.xwork2.ActionSupport;
public class DemoAction extends ActionSupport
{
@Override
public String execute()
{
addActionMessage("第一条普通消息!");
addActionMessage("第二条普通消息!");
return SUCCESS;
}}
JSP页面代码如下:
<%@ page contentType="text/html; charset=GBK" language="java"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html><head></head>
<body><s:actionmessage /></body></html>
来做iterator标签的辅助,将不同iterator中的内容合在一个iterator中。
参数
名字 |
是否必须 |
默认值 |
可否使用表达式 |
类型 |
描述 |
id |
否 |
|
是 |
String |
用来保存结果iterator的对象在value context中的名字。 |
例子
Action类
public class AppendIteratorTagAction extends ActionSupport {
private List myList1;
private List myList2;
private List myList3;
public String execute() throws Exception {
myList1 = new ArrayList();
myList1.add("1");
myList1.add("2");
myList1.add("3");
myList2 = new ArrayList();
myList2.add("a");
myList2.add("b");
myList2.add("c");
myList3 = new ArrayList();
myList3.add("A");
myList3.add("B");
myList3.add("C");
return "done";
}
public List getMyList1() { return myList1; }
public List getMyList2() { return myList2; }
public List getMyList3() { return myList3; }
标签使用
<s:append id="myAppendIterator">
<s:param value="%{myList1}" />
<s:param value="%{myList2}" />
<s:param value="%{myList3}" />
</s:append>
<s:iterator value="%{#myAppendIterator}">
<s:property />
</s:iterator>
bean标签 用于创建一个JavaBean的实例。创建JavaBean实例时,可以在标签体内使用<param.../>标签为该JavaBean实例 传入属性,要使用这个标签,需要为该JavaBean类提供对应的setter方法。如该JavaBean类提供了对应的getter方法,我们就可以访 问对应的属性。
bean标签 的属性:
name: 必填,指定要实例化的JavaBean的实现类
id: 可选。如指定了该属性,则该Javabean实例会被放入StackContext中(不是ValueStack),从而允许直接通过该id属性来访问该JavaBean实例。
【!!注意: 在bean标签内时,bean标签创建的JavaBean实例放在valuestack的栈顶,该标签结束,生成的子集被移出valuestack栈。除非指定了id属性】
下面是个简单的JavaBean
public class Person
{ private String name;
private int age;
//getter和setter方法省略 ……}
在jsp页面中的代码:
<!--使用bean标签创建一个lee.Person类的实例-->
<s:bean name="lee.Person">
<!--使用Param标签为lee。Person类的实例传入参数-->
<s:param name="name" value="'yeeku'"/>
<s:param name="age" value="29"/>
<s:property value="name"/> <br>
<s: property value="age"/>
</s:bean>
带id属性的用法:
<s:bean name="lee.Person" id=“p”>
<!--使用Param标签为lee。Person类的实例传入参数-->
<s:param name="name" value="'yeeku'"/>
<s:param name="age" value="29"/></s:bean>
<s:property value="#p.name"/> <br>
<s:property value="#p.age"/>
checkbox标签输出一个HTML复选框,等价于HTML代码:<input type="checkbox" .../>。
代码
1. <s:checkbox label="性别" name="user.sex" value="true" fieldValue="dddd"/>
这里value的值是“假”值,fieldValue的值才是真值。当value="true"表示这个复选框被选上。为false时不选上
另外,它在向html转换后会多出一个隐藏域,很奇怪。上面的代码输出成html是这样的:
代码
1. <input type="checkbox" name="user.sex" value="dddd" checked="checked" id="saveUser_user_sex"/>
2. <input type="hidden" name="__checkbox_user.sex" value="dddd" /> <label for="saveUser_user_sex" class="checkboxLabel">性别</label>
复选框
名称 |
必需 |
默认 |
类型 |
描述 |
fieldValue
|
是
|
true
|
String
|
指定在复选框选中时,实际提交的值
|
复选框组,对应Action中的集合
名称 |
必需 |
默认 |
类型 |
描述 |
list
|
是
|
无
|
Cellection Map Enumeration Iterator array |
要迭代的集合,使用集合中的元素来设置各个选项,如果list的属性为Map则Map的key成为选项的value,Map的value会成为选项的内容 |
listKey |
否 |
无 |
String |
指定集合对象中的哪个属性作为选项的value |
listValue
|
否
|
无
|
String
|
指定集合对象中的哪个属性作为选项的内容
|
例子:checkboxlistTag.jsp
<%@ page contentType="text/html;charset=GBK" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:form>
<s:checkboxlist name="interest" list="{'足球','篮球','排球','游泳'}" label="兴趣爱好"/>
</s:form>
combobox标签生成一个单行文本框和下拉列表框的结合,但两个表单元素只对应一个请求参数,只有单行文本框里的值才包含请求参数,而下拉列表框则只是用于辅助输入,并没有name属性,也就不会产生请求参数。使用该标签时,需要指定一个list属性,该list属性指定的集合将用于生成列表框。
例子如下:
<%@ page contentType="text/html; charset=GBK" language="java"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK"/>
<title>使用s:combobox生成下拉输入框</title>
<s:head/>
</head>
<body>
<h3>使用s:combobox生成下拉输入框</h3>
<s:form>
<s:combobox label="请选择您喜欢的图书" theme="css_xhtml" labelposition="top"
list="{'Spring2.0' , 'J2EE' , 'Ajax'}"
size="20" maxlength="20" name="book"/>
</s:form>
</body>
</html>
通过访问上面的JSP页面,我们可以看到上面的文本框,用户可以自行输入,可也以选择下面的checkbox中的内容来进行输入。需要注意的是,此时的下拉列表仅仅是用于辅助输入的,并没有任何实际意义,因此不能指定它的listKey和listValue属性。
conponent标签用于使用自定义标签,因为使用自定义组件还是基于主题,模板管理的,因此在使用component标签,常常需要指定如下3个属性:
theme:自定义组件所使用的主题,默认使用xhtml主题。
templateDir:指定自定义组件的主题目录,默认使用系统的主题目录,即template目录。
template:指定自定义组件所使用的模板。
此外,还可以component标签中使用param标签来注入参数的值。例子如下:
<%@ page contentType="text/html; charset=GBK" language="java"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>使用s:component标签</title>
</head>
<body>
<h3>使用s:component标签</h3>
使用自定义主题,自定义主题目录<br>
从Web应用根路径下加载模板,使用ftl模板。
<s:component
theme="customTheme"
templateDir="customTemplateDir"
template="ftlCustomTemplate">
<s:param name="list" value="{'Spring2.0' , 'J2EE' , 'Ajax'}" />
</s:component>
<hr/>
使用自定义主题,自定义主题目录<br>
从Web应用根路径下加载模板,使用JSP模板。
<s:component
theme="customTheme"
templateDir="customTemplateDir"
template="jspCustomTemplate.jsp">
<s:param name="list" value="{'Spring2.0' , 'J2EE' , 'Ajax'}" />
</s:component>
<hr/>
使用默认主题(xhtml),默认主题目录(template)<br>
从Web应用中加载模板,使用JSP模板。
<s:component template="mytemplate.jsp">
<s:param name="list" value="{'Spring2.0' , 'J2EE' , 'Ajax'}" />
</s:component>
<hr/>
使用自定义主题,自定义主题目录<br>
从/WEB-INF/classes路径下加载模板,使用ftl模板。
<s:component
theme="myTheme"
templateDir="myTemplateDir"
template="myAnotherTemplate">
<s:param name="list" value="{'Spring2.0' , 'J2EE' , 'Ajax'}" />
</s:component>
</body>
</html>
上面使用了FreeMarker和JSP模板,FreeMarker模板的ftlCustomTemplate.ftl代码如下:
<div style="background-color:#bbbbbb;">
FreeMarker自定义模板<br>
请选择您喜欢的图书<br>
<@s.select list="parameters.list"/>
</div>
JSP模板jspCustomTemplate.jsp的代码如下:
date标签 用于格式化输入一个日期,还可以计算指定日期和当前时刻之间的时差。
date属性:
format: 可选,如指定该属性,将根据该属性指定的格式来格式化日期
nice: 可选,值为true或者false,用于指定是否输出指定日期和当前时刻的时差。默认是false,即不输出
name: 必填,指定要格式化的日期
id: 可选,指定引用该元素的id值
通常,nice属性和format属性不同时指定,(不指定nice属性时,该属性值为false)。因为指定nice为true,代表输出指定日期和当前时刻的时差;指定format属性,则表明将指定日期按format指定的格式来个格式化输出。
如果即没有指定format,也没指定nice=“true”,则系统会到国际化资源文件中寻找key为struts.date.format的消 息,将该消息当成格式化文本来格式化日期。如果无法找到key为struts.date.format的消息,则默认采用 DateFormat.MEDIUM格式输出。
看如下jsp代码:
<%
//生成一个Date实例
java.util.Date now = new java.util.Date(107,12,23,13,23,24);
//将该Date实例设置成一个pageContext里的属性
pageContext.setAttribute("now", now);
%>
1> nice = "false",且指定format=“dd/MM/yyyy”<br>
<s:date name="#attr.now" format="dd/MM/yyyy" nice=“false”/> <hr><br>
2> nice = "true",且指定format=“dd/MM/yyyy”<br>
<s:date name="#attr.now" format="dd/MM/yyyy" nice=“true”/> <hr><br>
3> 指定nice = "true"<br>
<s:date name="#attr.now" nice=“true”/> <hr><br>
4> nice = "false",且没有指定format<br>
<s:date name="#attr.now" nice=“false”/> <hr><br>
当没有指定nice=“true”属性,且不指定format属性时,系统将日期格式化成“2008年01月23日”,这是因为在系统的全局国际化资源文件中提供了如下一行:
#指定Struts2默认的国际化资源文件
datetimepicker标签就是生成一个有日期控件的文本输入框。它有一个前提就是要在<head></head>内加一个"<s:head theme="ajax" />",然后可以在form内加上该标签。
(1)、静态构造有初始值的日期输入项
代码
1. <s:datetimepicker name="user.birthday" label="出生日期" value="%{'2008-9-20'}"/>
(2)、动态构造有初始值的日期输入项
代码
1. <s:datetimepicker name="user.birthday" label="出生日期" value="%{date}" displayFormat="yyyy-MM-dd"/>
在给输入项动态赋初始值时,要用ONGL的%{}表达式,而不能用#{}表达式。上面代码中的date变量需在action里有事选定义.
debug标签主要用于辅助测试,它在页面上生成一个超链接,通过该链接可以查看ValueStack和Stack Context 中的所有值信息。
使用debug标签只有一个id属性,这个属性仅仅是该元素一个引用id。
在页面上增加<s:debug/>标签,通过debug标签,可以看的系统中ValueStack离得全部信息,并可以看到Stack Context中的属性。
示范代码:
<s:debug></s:debug>
//直接在jsp页面上面添加这样的标签,就可以生产一个查看debug信息的链接
div是struts2 ajax中最基础的标签,其他的标签均和div有关系。div的最大的用途就是可以异步的更新div中的内容。这里写一些div基本的应用,其他的等写别的标签的时候再写。通过例子说明
<s:div href="%{url}">Initial Content</sx:div>
<!--最简单的例子,从指定的url获取信息更新自己的内容-->
<s:div href="%{url}" delay="2000"/>
<!--delay:载入内容前等待的时间,单位毫秒-->
<s:div href="%{url}" highlightColor="red" highlightDuration=""/>
<!--highlightColor:载入内容的背景色 highlightDuration:背景色显示的时间-->
<img id="indicator" src="images/indicator.gif" style="display:none"/>
<s:div href="%{url}" updateFreq="2000" indicator="indicator"/>
<!--每两秒更新一次。updateFreq为更新时间,单位毫秒。-->
<!--indicator为指示器,当内容未载入的显示的一个gif图片,一般为动态图片-->
doubleselect标签输出关联的两个HTML列表框,产生联动效果。
名称 |
必需 |
默认 |
类型 |
描述 |
list |
是 |
无 |
Cellection Map Enumeration Iterator array |
要迭代的集合,使用集合中的元素来设置各个选项,如果list的属性为Map则Map的key成为选项的value,Map的value会成为选项的内容 |
listKey
|
否
|
无
|
String
|
指定集合对象中的哪个属性作为选项的value,该选项只对第一个列表框起作用 |
listValue
|
否
|
无
|
String
|
指定集合对象中的哪个属性作为选项的内容,该选项只对第一个列表框起作用 |
headerKey
|
否
|
无
|
String
|
设置当用户选择了header选项时,提交的的value,如果使用该属性,不能为该属性设置空值 |
headerValue |
否 |
无 |
String |
显示在页面中header选项内容 |
emptyOption |
否 |
false |
Boolean |
|
multiple |
否 |
false |
Boolean |
是否多选 |
size |
否 |
无 |
Integer |
显示的选项个数,该选项只对第一个列表框起作用 |
doubleId |
否 |
无 |
String |
指定第二个列表框的ID |
doubleList
|
是
|
无
|
Cellection Map Enumeration Iterator array |
要迭代的集合
|
doubleListKey
|
否
|
无
|
String
|
指定集合对象中的哪个属性作为选项的value,该选项只对第二个列表框起作用 |
doubleListValue
|
否
|
无
|
String
|
指定集合对象中的哪个属性作为选项的内容,该选项只对第二个列表框起作用 |
doubleSize |
否 |
无 |
Integer |
选项个数 |
doubleName |
否 |
无 |
String |
指定第二个列表框的name映射 |
doubleValue |
否 |
无 |
Object |
第二个列表框的初始选种项 |
实例:
<s:form name="test">
<s:doubleselect label="请选择所在省市"
name="province" list="{'四川省','山东省'}" doubleName="city"
doubleList="top == '四川省' ? {'成都市', '绵阳市'} : {'济南市', '青岛市'}" />
</s:form>
<s:form action="doubleselectTag">
<s:doubleselect
label="请选择所在省市"
name="province"
list="provinces"
listKey="id"
listValue="name"
doubleList="cities"
doubleListKey="id"
doubleListValue="name"
doubleName="city"
headerKey="-1"
headerValue="---------- 请选择 ----------"
emptyOption="true" />
</s:form>
else标签用来控制基本的条件处理流程,通常和if、elseif标签连用。
参数
名字 |
是否必须 |
默认值 |
可否使用表达式 |
类型 |
描述 |
id |
否 |
|
是 |
String |
用来表示该元素,对于UI和Form标签来说直接转变为HTML id属性 |
test |
是 |
|
是 |
Boolean |
用来决定是否显示标签内部内容的表达式 |
例子
<s:if test="%{false}">
<div>Will Not Be Executed</div>
</s:if>
<s:elseif test="%{true}">
<div>Will Be Executed</div>
</s:elseif>
<s:else>
<div>Will Not Be Executed</div>
</s:else>
elseif标签用来控制基本的条件处理流程,通常和if、else标签连用。
参数
名字 |
是否必须 |
默认值 |
可否使用表达式 |
类型 |
描述 |
id |
否 |
|
是 |
String |
用来表示该元素,对于UI和Form标签来说直接转变为HTML id属性 |
test |
是 |
|
是 |
Boolean |
用来决定是否显示标签内部内容的表达式 |
例子
<s:if test="%{false}">
<div>Will Not Be Executed</div>
</s:if>
<s:elseif test="%{true}">
<div>Will Be Executed</div>
</s:elseif>
<s:else>
<div>Will Not Be Executed</div>
</s:else>
fielderror标签输出action的fieldErrors属性保存的字段错误,fieldErrors是一个map类型的属性。
Action类中这样定义:
public String execute() throws Exception{...
addFieldErrors("field1", "field1 error");
addFieldErrors("field2", "field2 error");...}
jsp中输出错误信息:
<s:fielderror/>
文件选择组建
file标签输出一个HTML文件选择框,等价于html代码:<input type="file" .../>。
名称 |
必需 |
默认 |
类型 |
描述 |
accept
|
否
|
input
|
String
|
HTML accept属性,指出接受文件的MIME类型
|
例子:
<s:file name="uploadfile" accept="text/*" />
<s:file name="uploadfile" accept="text/html,text/plain" />
20.form
form标签输出一个HTML from
例子:
<s:form action="exampleSubmit" method="post" enctype="multipart/form-data">
<s:submit />
<s:reset />
</s:form>
可以上传文件的form。
使用generator标签可以将指定字符串按指定分隔符分成多个子串,临时生成的多个子串可以使用iterator标签来迭代输出。可以这样理解:generator将一个字符串转化成一个集合。在该标签的标签体内,整个临时生成的集合将位于ValueStack的顶端,蛋一旦该标签结束,该集合将被移出ValueStack。
属性:
1. count :可选属性,该属性指定生成集合中元素的总数。
2. separator :必填属性,指定用于解析字符串的分隔符。
3. val:必填属性,指定被解析的字符串。
4. converter:可选属性,指定一个转换器,该转换器负责将集合汇总的每个字符串转换成对象
5. id:可选属性,如果指定了该属性,则将生成的集合放在pageContext属性中
例1:
生成一个简单的iterator,并且使用iterator标签打印出内容。
<s:generator val="%{'aaa,bbb,ccc,ddd,eee'}">
<s:iterator>
<s:property /><br/>
</s:iterator>
</s:generator>
例2:
生成一个iterator,使用count属性。因为count属性值为3,所以只有前三个内容(aaa,bbb,ccc)在生成的iterator中。
Generate an iterator with count attribute
<s:generator val="%{'aaa,bbb,ccc,ddd,eee'}" count="3">
<s:iterator>
<s:property /><br/>
</s:iterator>
</s:generator>
例3:
生成iterator,使用了id属性,之后生成的对象放在pageContext中,可以通过指定的id来访问。
<s:generator val="%{'aaa,bbb,ccc,ddd,eee'}" count="4" separator="," id="myAtt" />
<%
Iterator i = (Iterator) pageContext.getAttribute("myAtt");
while(i.hasNext()) {
String s = (String) i.next();
%>
<%= s %> <br/>
<%
}
%>
例4:
生成iterator,使用converter属性,这里的convertor仅仅将每一个对象添加了一个"converter-"前缀。
<s:generator val="%{'aaa,bbb,ccc,ddd,eee'}" converter="%{myConverter}">
<s:iterator>
<s:property /><br/>
</s:iterator>
</s:generator>
public class GeneratorTagAction extends ActionSupport {
....
public Converter getMyConverter() {
return new Converter() {
public Object convert(String value) throws Exception {
return "converter-"+value;
}
};
}
...
}
head标签主要用于成生HTML主要页面的HEAD部分。国为有些主题需要包含特定的CSS和javascript代码,而该标签则用于生成对这此CSS和javaScript代码的引用。
有属性:
1、debug: 使用ajax主题时将该属性设置为true,将开启调试模式
2、calendarcss:jscalendar控件使用的css主题
例子:
<head>
<title>page 1</title>
<s:head/>
</head>
hidden标签输出一个HTML隐藏表单元素,等价于HTML代码:<input type="hidden" .../>。
在xhtml主题下,hidden标签与其他的标签不一样,hidden标签并不输出表行。xhtml主题直接从simple主题继承了
hidden.ftl模板。
例子:
<s:hidden name="id" value="s"/>
该标签用于加载资源包到值堆栈。它可以允许text标志访问任何资源包的信息,而不只当前action相关联的资源包。
参数:
名称必需默认类型描述value是Object/String资源包的类路径(如com.xxxx.resources.AppMsg)id否Object/String用来标识元素的id。在UI和表单中为HTML的id属性 例子:
HelloWorld=Hello Wrold!
例3 classes\ ApplicationMessages.properties
<%@ page c %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Internationization</title>
</head>
<body>
<h3>
<s:i18n name="ApplicationMessages">
<s:text name="HelloWorld" />
</s:i18n>
</h3>
</body>
</html>
If标签用来控制基本的条件处理流程,通常和else标签或者elseif标签连用。
参数
名字 |
是否必须 |
默认值 |
可否使用表达式 |
类型 |
描述 |
id |
否 |
|
是 |
String |
用来表示该元素,对于UI和Form标签来说直接转变为HTML id属性 |
test |
是 |
|
是 |
Boolean |
用来决定是否显示标签内部内容的表达式 |
例子
<s:if test="%{false}">
<div>Will Not Be Executed</div>
</s:if>
<s:elseif test="%{true}">
<div>Will Be Executed</div>
</s:elseif>
<s:else>
<div>Will Not Be Executed</div>
</s:else>
include标签 用于将一个JSP页面,或者一个Servlet包含到本页面中,
使用该标签有如下两个属性:
value: 必填,指定需要被包含的JSP页面,或者Servlet
id: 可选,指定该标签的ID引用
还可以为<s:include.../>标签指定多个<param.../>子标签,用于将多个参数值传入被包含的JSP页面或者Servlet
看下面代码:
<h2>使用s:include标签来包含目标页面</h2>
<s:include value="include-file.jsp"/>
<!--使用include标签来包含其他页面,并且传入参数-->
<s:include value="include-file.jsp">
<s:param name="author" value="'yeeku'" />
</s:include>
被包含的页面仅使用表达式语言输出author参数,被包含页面的代码如下:
<h3>被包含的页面</h3>
<!--表达式语言输出author的请求参数-->
${param.author}
获取form的一个输入
迭代处理一个java.util.Connection或者java.util.Iterator对象
参数
名字 |
是否必须 |
默认值 |
可否使用表达式 |
类型 |
描述 |
id |
否 |
|
是 |
String |
Id, |
status |
否 |
否 |
是 |
Boolean |
如果指定,在循环的过程中会保留一个IteratorStatus类型的变量,该变量用来查询当前迭代的状态 |
value |
否 |
|
是 |
String |
被迭代的对象 |
例1:
<s:iterator value="days">
<p>day is: <s:property/></p>
</s:iterator>
例2:
<s:bean name="org.apache.struts2.example.IteratorExample" id="it">
<s:param name="day" value="'foo'"/>
<s:param name="day" value="'bar'"/></s:bean><p/>
<table border="0" cellspacing="0" cellpadding="1">
<tr>
<th>Days of the week</th></tr>
<p/>
<s:iterator value="#it.days" status="rowstatus">
<tr>
<s:if test="#rowstatus.odd == true">
<td style="background: grey"><s:property/></td>
</s:if>
<s:else>
<td><s:property/></td>
</s:else>
</tr>
</s:iterator>
</table>
例3:
<s:iterator value="groupDao.groups" status="groupStatus">
<tr class="<s:if test="#groupStatus.odd == true ">odd</s:if><s:else>even</s:else>">
<td><s:property value="name" /></td>
<td><s:property value="description" /></td>
<td>
<s:iterator value="users" status="userStatus">
<s:property value="fullName" />
<s:if test="!#userStatus.last">,</s:if>
</s:iterator>
</td>
</tr>
</s:iterator>
xhtml主题下的label 标签输出两个 HTML的label标签(simple主题下的label标签只输出一个HTML label标签)。分别位于一行的两列,左列的label标签器提示作用,右列的label标签用于显示只读的action属性数据。
例子:
<s:label label="用户名" name="user.username"/>
上述代码再客户端浏览器里面输出如下:
<tr>
<td class="tdLabel"><label for="userManager_user_username"
class="label">用户名:</label></td>
<td><label id="userManager_user_username"
class="label"></label></td>
</tr>
如果Action实例已经创建,并且user.username有值,那么在表的右列中将显示user.username的值
optgroup标签用于生成一个下拉列表框的选项组,因此,该标签必须放在<s:select>标签中使用,一个下拉列表框中可以包含多个选项组,因此可以在一个<s:select>标签中使用多个<s:optgroup>标签。例子代码如下:
<%@ page contentType="text/html; charset=GBK" language="java"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK"/>
<title>使用s:optgroup生成下拉选择框的选项组</title>
<s:head/>
</head>
<body>
<h3>使用s:optgroup生成下拉选择框的选项组</h3>
<s:form>
<!-- 使用Map对象来生成下拉选择框的选项组 -->
<s:select label="选择您喜欢的图书"
name="book"
list="#{'Spring2.0':'李刚','J2EE':'李','Ajax宝典':'李'}"
listKey="value"
listValue="key">
<s:optgroup label="Rod Johnson"
list="#{'Expert One-on-One J2EE Design and Development':'Johnson'}"
listKey="value"
listValue="key"/>
<s:optgroup label="David Flanagan"
list="#{'JavaScript: The Definitive Guide':'David'}"
listKey="value"
listValue="key"/>
</s:select>
</s:form>
</body>
</html>
通过浏览以上页面,我们可以看到:直接通过select标签的list属性生成的选项,是单独的选项,但通过optgroup标签的list属性生成的选项,则形成一个选项组,对于选项组的组名,是无法选择的。
optiontransferselect标签创建一个选项转移列表组建,它由两个<select>标签以及它们之间的用于将选项在两个<select>之间相互移动的按钮组成。表单提交时,将提交两个列表框中选中的选项。
名称 |
必需 |
默认 |
类型 |
描述 |
list
|
是
|
无
|
Cellection Map Enumeration Iterator array
|
要迭代的集合,使用集合中的元素来设置各个选项,如果list的属性为Map则Map的key成为选项的value,Map的value会成为选项的内容,该选项只对第一个列表框起作用 |
listKey
|
否
|
无
|
String
|
指定集合对象中的哪个属性作为选项的value,该选项只对第一个列表框起作用 |
listValue
|
否
|
无
|
String
|
指定集合对象中的哪个属性作为选项的内容,该选项只对第一个列表框起作用 |
headerKey
|
否
|
无
|
String
|
设置当用户选择了header选项时,提交的的value,如果使用该属性,不能为该属性设置空值 |
headerValue |
否 |
无 |
String |
显示在页面中header选项内容 |
multiple |
否 |
false |
Boolean |
是否多选 |
size
|
否
|
无
|
Integer
|
显示的选项个数,该选项只对第一个列表框起作用 |
doubleId |
否 |
无 |
String |
指定第二个列表框的ID |
doubleList
|
是
|
无
|
Cellection Map Enumeration Iterator array |
要迭代的集合,使用集合中的元素来设置各个选项,如果doubleList的属性为Map则Map的key成为选项的value,Map的value会成为选项的内容,该选项只对第二个列表框起作用 |
doubleListKey
|
否
|
无
|
String
|
指定集合对象中的哪个属性作为选项的value,该选项只对第二个列表框起作用 |
doubleListValue
|
否
|
无
|
String
|
指定集合对象中的哪个属性作为选项的内容,该选项只对第二个列表框起作用 |
doubleHeaderKey
|
否
|
无
|
String
|
设置当用户选择了header选项时,提交的的value,如果使用该属性,不能为该属性设置空值 |
doubleHeaderVale |
否 |
无 |
String |
显示在页面中header选项内容 |
doubleEmptyOption
|
否
|
无
|
String
|
是否在第二列表框的header后面添加一个空选项 |
doubleMultiple |
否 |
true |
Boolean |
是否多选 |
doubleSize |
否 |
无 |
Integer |
选项个数 |
doubleName |
否 |
无 |
String |
指定第二个列表框的name映射 |
doubleValue |
否 |
无 |
Object |
第二个列表框的初始选种项 |
leftTitle |
否 |
无 |
String |
左边列表框的标题 |
rightTitle |
否 |
<- |
String |
右边列表框的标题 |
addToLeftLable |
否 |
|
String |
|
addToRightLable |
|
|
|
|
addAllToLeftLable |
|
|
|
|
addAllToRightLable |
|
|
|
|
leftUpLabel |
|
|
|
|
leftDownLabel |
|
|
|
|
rightUpLabel |
|
|
|
|
rightDownLabel |
|
|
|
|
allowAddToLeft |
|
|
|
|
allowAddToright |
|
|
|
|
allowAddAllToLeft |
|
|
|
|
allowAddAllToRight |
|
|
|
|
allowSelectAll |
否 |
无 |
Boolean |
设置是否使用全部选择按钮 |
allowUpdownOnLeft |
|
|
|
|
allowUpDownOnRight |
|
|
|
|
例子:
<s:head/>
<s:form>
<s:optiontransferselect
label="最喜爱的图书"
name="javaBook"
list="{'《Java Web开发详解》', '《Struts 2深入详解》', '《Java快速入门》'}"
doubleName="cBook"
doubleList="{'《VC++深入详解》', '《C++ Primer》', '《C++程序设计语言》'}"/>
</s:form>
---------------------------
<s:form>
<s:optiontransferselect
label="最喜爱的图书"
name="book1"
leftTitle="Java图书"
rightTitle="C/C++图书"
list="{'《Java Web开发详解》', '《Struts 2深入详解》', '《Java快速入门》'}"
headerKey="-1"
headerValue="--- 请选择 ---"
emptyOption="true"
doubleName="book2"
doubleList="{'《VC++深入详解》', '《C++ Primer》', '《C++程序设计语言》'}"
doubleHeaderKey="-1"
doubleHeaderValue="--- 请选择 ---"
doubleEmptyOption="true"
addToLeftLabel="向左移动"
addToRightLabel="向右移动"
addAllToLeftLabel="全部左移"
addAllToRightLabel="全部右移"
selectAllLabel="全部选择"
leftUpLabel="向上移动"
leftDownLabel="向下移动"
rightUpLabel="向上移动"
rightDownLabel="向下移动"/>
</s:form>
合并遍历集合出来的值,与<s:append>标签用法相似。
MergeAction.java
@Override
public String execute() throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
List list1 = new ArrayList();
list1.add("11");
list1.add("22");
List list2 = new ArrayList();
list2.add("aa");
list2.add("bb");
List list3 = new ArrayList();
list3.add("AA");
list3.add("BB");
XmxxBean xmxxBean = new XmxxBean(11 , "XMBH001" , "ERP");
List list4 = new ArrayList();
list4.add(xmxxBean);
request.setAttribute("list1", list1);
request.setAttribute("list2", list2);
request.setAttribute("list3", list3);
request.setAttribute("list4", list4);
return "mergeTag";
}
struts.xml
<action name="mergeTag" class="com.butone.struts2.taguser.MergeTagAction">
<result name="mergeTag">/taguser/mergeTag.jsp</result>
</action>
mergeTag.jsp
<s:form action="" theme="simple">
<s:merge id="list">
<s:param value="#request.list1"/>
<s:param value="#request.list2"/>
<s:param value="#request.list3"/>
<s:param value="#request.list4"/>
</s:merge>
<s:iterator value="%{list}">
<s:property/><br>
</s:iterator>
<s:iterator value="#request.list4">
<s:property value="XMXXID"/>
<s:property value="XMMC"/>
</s:iterator>
</s:form>
param标签 主要用于为其他标签提供参数
param标签属性:
name: 可选,指定需要设置参数的参数名
value: 可选,指定需要设置参数的参数值
id: 可选,指定引用该元素的id
用法:
<param name="color" value="blue" />
这里color参数的值是,blue对象的值----如果blue对象不存在,则color为null。
如果要指定字符串则value=” ‘blue’ “
<s:password>标签类同于HTML的<input type=”password” …>,其name和label类同于<s:textfield>
例子:
<s:password name="password" label="密码"/>
<!--EndFragment-->