struct2模板介绍

因为Struts2所有的UI标签都是基于主题和模板的,主题和模板是Struts2所有UI标签的核心。模板是一个UI标签的外在表示形式,例如:当我们使用<s:select ... ... />标签时,Struts2就会根据对应select模板来生成一个有模板特色的下拉列表框。如果为所有的UI标签都提供了对应的模板,那么这系列的模板就形成了一个主题。

对于一个JSP页面里包含的UI标签而言,即可以直接设置该UI标签需要使用的模板,也可以设置该UI标签使用的主题。实际上对开发者而言,并不推荐直接设置模板属性,而是应该选择特定主题。设置主题的方法有以下几种:

  1. 通过设定特定UI标签上的theme属性来指定主题。
  2. 通过设定特定UI标签外围的Form标签的theme属性来指定主题。
  3. 通过取得page会话范围内以theme为名称的属性来确定主题。
  4. 通过取得request会话范围内以theme为名称的属性来确定主题。
  5. 通过取得session会话范围内以theme为名称的属性来确定主题。
  6. 通过取得application会话范围内以theme为名称的属性来确定主题。
  7. 通过取得名为struts.ui.theme的常量(默认值是xhtml)来确定主题,该常量可以在struts.properties文件或者struts.xml文件中确定。

上面介绍的几种指定UI标签主题的方式,它们的优先级也是按照上面的顺序来的。

Struts2的模板目录是通过struts.ui.templateDir常量来指定的,该常量的默认值是template,即意味着Struts2会从Web应用的template目录,CLASSPATH(包括Web应用的WEB-INF\classes路径和WEB-INF\lib路径)的template目录来依次加载特定模板文件。如果我们只使用一个select标签,且指定主题为xhtml,则加载模板文件的顺序为:

  1. 搜索Web应用里/template/xhtml/select.ftl文件
  2. 搜索CLASSPATH路径下的template/xhtml/select.ftl文件

Struts2的模板文件是.ftl文件,它是FreeMarker的模板文件。用户也可以通过修改struts.ui.templateSuffix常量的值来改变Struts2默认的模板技术,该常量接受如下几个值:

  • ftl:基于FreeMarker的模板技术
  • vm:基于Velocity的模板技术
  • jsp:基于JSP的模板技术

虽然Struts2允许使用自己的模板技术,但如果用户选择了使用Velicoty或JSP作为模板技术,就要实现所有的模板和主题,这个是工作量很大的事情。

Struts2默认提供了4个主题:simple,xhtml,css_xhtml和ajax,这4个主题的模板文件放在Struts2的核心类库里(struts2-core.jar包)。

用户也可以创建自己的主题

创建自定义的主题有如下3种方式:

  1. 开发者完全实现一个全新的主题,这种方式要求开发者为每个UI标签都提供自定义的模板文件,不推荐
  2. 包装一个现有的主题,这种方式要求开发者为每个UI组件都提供自定义主题的模板文件,即使自定义主题里某个UI组件与原来主题里UI组件的行为完全一样。也不推荐。
  3. 扩展一个现有的主题,这种方式开发者只需要提供自定义的模板文件

例子如下:

用户自定义的主题是以xhtml主题为基础的,并且只想改变select UI标签的行为,则可以提供一个自己的select.ftl文件,并将该文件放在对应的主题目录下。

select.ftl文件代码如下:

Java代码 收藏代码
  1. <!--加入自己的文字部分-->
  2. <h3>作者李:</h3>
  3. <!--包含xhtml主题下的controlheader.ftl模板-->
  4. <#include"/${parameters.templateDir}/xhtml/controlheader.ftl"/>
  5. <!--包含simple主题下的select.ftl模板-->
  6. <#include"/${parameters.templateDir}/simple/select.ftl"/>
  7. <!--包含xhtml主题下的controlfooter.ftl模板-->
  8. <#include"/${parameters.templateDir}/xhtml/controlfooter.ftl"/>
  9. 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/memory_xj/archive/2008/11/27/3390591.aspx

将该文件放在Web应用的WEB-INF\classes\template\lee路径下,这表明创建了一个自定义模板,该模板名为lee。

除此之外,还必须在主题目录下增加一个theme.properties文件,该文件指定自定义模板是以哪个模板为基础进行扩展的,文件内容为:

Java代码 收藏代码
  1. parent=xhtml
  2. #指定该主题以xhtml主题为基础进行扩展

该文件也放在WEB-INF\classes\template\lee路径下,然后在JSP页面中使用如下代码就可调用此模板了:

Java代码 收藏代码
  1. <%--
  2. *@authoryeeku.H.leekongyeeku@163.com
  3. *@version1.0
  4. *<br>Copyright(C),2005-2008,yeeku.H.Lee
  5. *<br>Thisprogramisprotectedbycopyrightlaws.
  6. *<br>ProgramName:
  7. *<br>Date:
  8. --%>
  9. <%@pagecontentType="text/html;charset=GBK"language="java"%>
  10. <%@taglibprefix="s"uri="/struts-tags"%>
  11. <html>
  12. <head>
  13. <metahttp-equiv="Content-Type"content="text/html;charset=GBK"/>
  14. <title>使用自定义模板来生成下拉列表</title>
  15. </head>
  16. <body>
  17. <s:selectname="aa"theme="lee"
  18. list="{'Spring2.0','J2EE','Ajax'}"size="3"/>
  19. </body>
  20. </html>

Struts2提供的ajax主题就是以xhtml主题为基础进行扩展的。

Struts2的内建主题

Struts2内建了4个主题,分别是simple,xhtml, css_xhtml和ajax。

simple主题是最简单的主题,它是最底层的结构,主要用于构建附加的功能或者行为(例如在此主题基础上进行扩展),使用simple主题时,每个UI标签只生成一个简单的HTML元素,不会生成其他额外的内容。

Struts2的xhtml, css_xhtml主题都是对simple主题的包装和扩展。

xhtml主题是Struts2的默认主题,它对simple主题进行扩展,在该主题的基础上增加了如下附加的特性:

1,针对HTML标签(如textfield和select标签)使用标准的两列表格布局。

2,每个HTML标签的Label,即可以出现在HTML元素的左边,也可以出现在上边,这取决于labelposition属性的设置。

3,自动输出校验错误信息。

4,输出JavaScript的客户端校验。

css_xhtml主题则对原有的xhtml主题进行了扩展,在xhtml主题基础上加入了CSS样式控制。

ajax主题目对xhtml主题目进行了扩展,在xhtml主题上为每个标签提供了额外的Ajax支持。ajax主题的Ajax支持是以Dojo和DWR为基础的。ajax主题在xhtml主题基础上增加了如下特性:

1,支持Ajax方式的客户端校验。

2,支持远程表单的异步提交(最好和submit标签一起使用)。

3,提供高级的div标签,允许实现局部更新部分HTML的功能。

4,提供高级的a标签,允许动态加载并执行远端的javaScript代码。

5,提供支持ajax的tabbedPanel。

6,提供"富客户端"模型的pub-sub事件模型。

5,Struts2的表单标签

所有的表单标签可以分为两种:form标签本身和单个表单元素的标签。Struts2的表单元素标签都包含了非常多的属性。但有很多属性完全是通用的。

表单标签的通用属性

所有表单标签处理类都继承了UIBean类,UIBean包含了一些通用属性,这些通用属性分成3种:

1,模板相关属性;2,javascript相关属性;3,通用属性。

除了这些属性之外,所有的表单元素标签都存在一个特殊的属性:form,这个属性引用表单元素所在的表单,通过该form属性,可以实现表单元素和表单之间的交互。例如,我们可以通过${parameters.form.id}来取得表单元素所在表单的ID。表单标签的通用属性有以下几类:

1,模板相关的通用属性:可以指定该表单标签所用的模板和主题。

2,javascript相关的通用属性:指定在鼠标在该标签上操作时的javascript函数。

3,设置表单元素的提示:当鼠标在这引动元素上时,系统将出现提示。Struts2将这种特性称为Tooltip。

4,设置表单元素的CSS样式。

表单标签的name和value属性

name属性会映射到Action中的属性名称,value属性则代表此属性的值。例子如下:

<!-- 将下面文本框的值绑定到Action的person属性的firstName属性 -->
<s:textfield name="person.firstName" />

<!-- 使用表达式生成表单元素的值 -->
<s:textfield name="person.firstName" value="${person.firstName}" />

实际上Struts2已经自动处理了属性内容的赋值工作,因此我们只需要使用第一种方式就可以了。

checkboxlist标签

checkboxlist标签可以一次创建多个复选框,用于一次生成多个HTML标签中的<input type="checkbox">,它根据list属性指定的集合来生成多个复选框。因此使用该标签要指定一个list属性。其它都是通过属性,但是有两个常用属性:

1,listKey:该属性指定集合元素中的某个属性作为复选框的key

2,listValue:该属性指定集合元素中的某个属性作为复选框的value

下面是一个JSP页面的例子:

Java代码 收藏代码
  1. <%@pagecontentType="text/html;charset=GBK"language="java"%>
  2. <%@taglibprefix="s"uri="/struts-tags"%>
  3. <html>
  4. <head>
  5. <metahttp-equiv="Content-Type"content="text/html;charset=GBK"/>
  6. <title>使用s:checkboxlist生成多个复选框</title>
  7. <s:head/>
  8. </head>
  9. <body>
  10. <h3>使用s:checkboxlist生成多个复选框</h3>
  11. <s:form>
  12. <!--使用简单集合来生成多个复选框-->
  13. <s:checkboxlistname="a"label="请选择您喜欢的图书"labelposition="top"list="{'Spring2.0','J2EE','Ajax'}"/>
  14. <!--使用简单Map对象来生成多个复选框-->
  15. <s:checkboxlistname="b"label="请选择您想选择出版日期"labelposition="top"list="#{'Spring2.0':'2006年10月','J2EE':'2007月4月','Ajax':'2007年6月'}"listKey="key"listValue="value"/>
  16. <s:beanname="lee.BookService"id="bs"/>
  17. <!--使用集合里放多个JavaBean实例来生成多个复选框-->
  18. <s:checkboxlistname="b"label="请选择您喜欢的图书"labelposition="top"list="#bs.books"listKey="name"listValue="author"/>
  19. </s:form>
  20. </body>
  21. </html>
  22. JavaBean和JavaBean的访问类代码如下:
  23. packagelee;
  24. publicclassBook
  25. {
  26. privateStringname;
  27. privateStringauthor;
  28. publicBook()
  29. {
  30. }
  31. publicBook(Stringname,Stringauthor)
  32. {
  33. this.name=name;
  34. this.author=author;
  35. }
  36. publicvoidsetName(Stringname)
  37. {
  38. this.name=name;
  39. }
  40. publicStringgetName()
  41. {
  42. returnthis.name;
  43. }
  44. publicvoidsetAuthor(Stringauthor)
  45. {
  46. this.author=author;
  47. }
  48. publicStringgetAuthor()
  49. {
  50. returnthis.author;
  51. }
  52. }
  53. packagelee;
  54. publicclassBookService
  55. {
  56. publicBook[]getBooks()
  57. {
  58. returnnewBook[]
  59. {
  60. newBook("Spring2.0","李"),
  61. newBook("J2EE","李"),
  62. newBook("Ajax","李")
  63. };
  64. }
  65. }

combobox标签

combobox标签生成一个单行文本框和下拉列表框的结合,但两个表单元素只对应一个请求参数,只有单行文本框里的值才包含请求参数,而下拉列表框则只是用于辅助输入,并没有name属性,也就不会产生请求参数。使用该标签时,需要指定一个list属性,该list属性指定的集合将用于生成列表框。例子如下:

Java代码 收藏代码
  1. <%@pagecontentType="text/html;charset=GBK"language="java"%>
  2. <%@taglibprefix="s"uri="/struts-tags"%>
  3. <html>
  4. <head>
  5. <metahttp-equiv="Content-Type"content="text/html;charset=GBK"/>
  6. <title>使用s:combobox生成下拉输入框</title>
  7. <s:head/>
  8. </head>
  9. <body>
  10. <h3>使用s:combobox生成下拉输入框</h3>
  11. <s:form>
  12. <s:comboboxlabel="请选择您喜欢的图书"theme="css_xhtml"labelposition="top"
  13. list="{'Spring2.0','J2EE','Ajax'}"
  14. size="20"maxlength="20"name="book"/>
  15. </s:form>
  16. </body>
  17. </html>

通过访问上面的JSP页面,我们可以看到上面的文本框,用户可以自行输入,可也以选择下面的checkbox中的内容来进行输入。需要注意的是,此时的下拉列表仅仅是用于辅助输入的,并没有任何实际意义,因此不能指定它的listKey和listValue属性。

datetimepicker标签

datetimepicker标签生成一个日期,时间下拉选择框,当我们使用该日期,时间选择框选择某个日期,时间时,系统会自动将选中的日期,时间输入指定的文本框。系统将指定日期,时间输入指定文本框时,必须转换成日期,时间字符串,为了设置该字符串的格式,必须使用日期,时间的格式符。datetimepicker使用例子如下:

Java代码 收藏代码
  1. <%@pagecontentType="text/html;charset=GBK"language="java"%>
  2. <%@taglibprefix="s"uri="/struts-tags"%>
  3. <html>
  4. <head>
  5. <metahttp-equiv="Content-Type"content="text/html;charset=GBK"/>
  6. <title>使用s:datetimepicker生成日期选择框</title>
  7. <s:head/>
  8. </head>
  9. <body>
  10. <h3>使用使用s:datetimepicker生成日期选择框</h3>
  11. <s:formtheme="simple">
  12. 日期选择部件,指定toggleType属性,且指定value="today"<br>
  13. <s:datetimepickername="order.date"label="购买日期"toggleType="explode"value="today"/><hr>
  14. 日期选择部件,指定了format属性<br>
  15. <s:datetimepickername="order.date"label="购买日期"displayFormat="dddd年MM月dd日"/><hr>
  16. 日期选择部件,指定了weekStartsOn属性<br>
  17. <s:datetimepickername="order.date"label="购买日期"displayFormat="dddd年MM月dd日"weekStartsOn="2"/><hr>
  18. 时间选择部件<br>
  19. <s:datetimepickerlabel="选择出发时间'"name="start"type="time"value="13:00"/><hr>
  20. </s:form>
  21. </body>
  22. </html>

doubleselect标签

doubleselect标签会生成一个级联列表框(两个下拉列表框),当选择第一个下拉列表框时,第二个下拉列表框中的内容会随之改变。使用例子如下:

Java代码 收藏代码
  1. <%@pagecontentType="text/html;charset=GBK"language="java"%>
  2. <%@taglibprefix="s"uri="/struts-tags"%>
  3. <html>
  4. <head>
  5. <metahttp-equiv="Content-Type"content="text/html;charset=GBK"/>
  6. <title>使用s:doubleselect生成级联下拉列表框</title>
  7. <s:head/>
  8. </head>
  9. <body>
  10. <h3>使用s:doubleselect生成级联下拉列表框</h3>
  11. <s:formaction="x">
  12. <s:doubleselect
  13. label="请选择您喜欢的图书"
  14. name="author"list="{'李','David'}"
  15. doubleList="top=='李'?{'Spring2.0','J2EE','Ajax'}:{'JavaScript:TheDefinitiveGuide'}"
  16. doubleName="book"/>
  17. </s:form>
  18. </body>
  19. </html>

默认情况下,第一个下拉列表框只支持两项,如果超过两项则不能这样处理。

我们可以先定义一个Map对象,该Map对象的value都是集合,这样就能以Map对象的多个key创建一个下拉列表框的列表项,而每个key对应的集合则用于创建第二个下拉列表框的列表项。例子如下:

Java代码 收藏代码
  1. <%@pagecontentType="text/html;charset=GBK"language="java"%>
  2. <%@taglibprefix="s"uri="/struts-tags"%>
  3. <html>
  4. <head>
  5. <metahttp-equiv="Content-Type"content="text/html;charset=GBK"/>
  6. <title>使用s:doubleselect生成级联下拉列表框</title>
  7. <s:head/>
  8. </head>
  9. <body>
  10. <h3>使用s:doubleselect生成级联下拉列表框</h3>
  11. <s:setname="bs"
  12. value="#{'李':{'Spring2.0','J2EE','Ajax'},
  13. 'David':{'JavaScript:TheDefinitiveGuide'},
  14. 'Johnson':{'ExpertOne-on-OneJ2EEDesignandDevelopment'}}"/>
  15. <s:formaction="x">
  16. <s:doubleselect
  17. label="请选择您喜欢的图书"
  18. size="3"
  19. name="author"list="#bs.keySet()"
  20. doubleList="#bs[top]"
  21. doubleSize="3"
  22. doubleName="book"/>
  23. </s:form>
  24. </body>
  25. </html>

从访问看到的效果来看,结果并不理想。还可以直接用javascript代码来实现以上效果,这里就不给出代码了。自己去思考一下。

head标签

head标签主要用于成生HTML主要页面的HEAD部分。国为有些主题需要包含特定的CSS和javascript代码,而该标签则用于生成对这此CSS和javaScript代码的引用。

例如,如果需要在页面中使用ajax组件,则使用一个带theme="ajax"属性的head标签,就可以将标准Ajax的头信息包含在页面中。

使用Ajax主题时,可以通过设置head标签的debug参数为true,从而打开调试标志。

一般使用Struts2的UI标签,javascript客户端校验等需要javascript库和CSS支持功能时,都应该先使用head标签。这个标签没有其它特别的用法,前面也已经使用过了。不再写例子。

optiontransferselect标签

optiontransferselect标签会创建两个选项用来转移下拉列表项,该标签会生成两个<select>标签,并且会生成系列的按钮,这系列的按钮可以控制选项在两个下拉列表之间移动,升降,当提交该表单时,两个<select>标签的请求参数都会被提交。例子代码如下:

Java代码 收藏代码
  1. <%@pagecontentType="text/html;charset=GBK"language="java"%>
  2. <%@taglibprefix="s"uri="/struts-tags"%>
  3. <html>
  4. <head>
  5. <metahttp-equiv="Content-Type"content="text/html;charset=GBK"/>
  6. <title>使用s:optiontransferselect来生成可移动列表项的下拉列表框</title>
  7. <s:head/>
  8. </head>
  9. <body>
  10. <h3>使用s:optiontransferselect来生成可移动列表项的下拉列表框</h3>
  11. <s:form>
  12. <!--使用简单集合对象来生成可移动的下拉列表框-->
  13. <s:optiontransferselect
  14. label="请选择你喜欢的图书"
  15. name="cnbook"
  16. leftTitle="中文图书:"
  17. rightTitle="外文图书"
  18. list="{'Spring2.0','J2EE','Ajax'}"
  19. multiple="true"
  20. addToLeftLabel="向左移动"
  21. selectAllLabel="全部选择"
  22. addAllToRightLabel="全部右移"
  23. headerKey="cnKey"
  24. headerValue="---选择中文图书---"
  25. emptyOption="true"
  26. doubleList="{'ExpertOne-on-OneJ2EEDesignandDevelopment','JavaScript:TheDefinitiveGuide'}"
  27. doubleName="enBook"
  28. doubleHeaderKey="enKey"
  29. doubleHeaderValue="---选择外文图书---"
  30. doubleEmptyOption="true"
  31. doubleMultiple="true"
  32. />
  33. </s:form>
  34. </body>
  35. </html>

select标签

select标签用于生成一个下拉列表框,通过为该元素指定list属性,系统会使用list属性指定的集合来生成下拉列表框的选项。这个list属性指定的集合,即可以是普通集合,也可以是Map对象,还可以是集合中的对象的实例。例子如下:

Java代码 收藏代码
  1. <%@pagecontentType="text/html;charset=GBK"language="java"%>
  2. <%@taglibprefix="s"uri="/struts-tags"%>
  3. <html>
  4. <head>
  5. <metahttp-equiv="Content-Type"content="text/html;charset=GBK"/>
  6. <<title>使用s:select生成下拉选择框</title>
  7. <<s:head/>
  8. </head>
  9. <body>
  10. <<h3>使用s:select生成下拉选择框</h3>
  11. <s:form>
  12. <<!--使用简单集合来生成下拉选择框-->
  13. <s:selectname="a"label="请选择您喜欢的图书"labelposition="top"multiple="true"
  14. list="{'Spring2.0','J2EE','JavaScript:TheDefinitiveGuide'}"/>
  15. <!--使用简单Map对象来生成下拉选择框-->
  16. <s:selectname="b"label="请选择您想选择出版日期"labelposition="top"
  17. list="#{'Spring2.0':'2006年10月','J2EE':'2007月4月','Ajax':'2007年6月'}"
  18. listKey="key"
  19. listValue="value"/>
  20. <s:beanname="lee.BookService"id="bs"/>
  21. <!--使用集合里放多个JavaBean实例来生成下拉选择框-->
  22. <s:selectname="b"label="请选择您喜欢的图书"labelposition="top"multiple="true"
  23. list="#bs.books"
  24. listKey="author"
  25. listValue="name"/>
  26. </s:form>
  27. </body>
  28. </html>

radio标签

radio标签的用法与checkboxlist的用法几乎完全相同,一样可以指定label, list, listKey, listValue等属性。例子代码如下:

Java代码 收藏代码
  1. <%@pagecontentType="text/html;charset=GBK"language="java"%>
  2. <%@taglibprefix="s"uri="/struts-tags"%>
  3. <html>
  4. <head>
  5. <metahttp-equiv="Content-Type"content="text/html;charset=GBK"/>
  6. <title>使用s:radio生成多个单选框</title>
  7. <s:head/>
  8. </head>
  9. <body>
  10. <h3>使用s:radio生成多个单选框</h3>
  11. <s:form>
  12. <!--使用简单集合来生成多个单选框-->
  13. <s:radioname="a"label="请选择您喜欢的图书"labelposition="top"
  14. list="{'Spring2.0','SpringInAction','JavaScript:TheDefinitiveGuide'}"/>
  15. <!--使用简单Map对象来生成多个单选框-->
  16. <s:radioname="b"label="请选择您想选择出版日期"labelposition="top"
  17. list="#{'Spring2.0':'2006年10月','J2EE':'2007月4月','Ajax':'2007年6月'}"
  18. listKey="key"
  19. listValue="value"/>
  20. <s:beanname="lee.BookService"id="bs"/>
  21. <!--使用集合里放多个JavaBean实例来生成多个单选框-->
  22. <s:radioname="c"label="请选择您喜欢的图书"labelposition="top"
  23. list="#bs.books"
  24. listKey="author"
  25. listValue="name"/>
  26. </s:form>
  27. </body>
  28. </html>

optgroup标签

optgroup标签用于生成一个下拉列表框的选项组,因此,该标签必须放在<s:select>标签中使用,一个下拉列表框中可以包含多个选项组,因此可以在一个<s:select>标签中使用多个<s:optgroup>标签。例子代码如下:

Java代码 收藏代码
  1. <%@pagecontentType="text/html;charset=GBK"language="java"%>
  2. <%@taglibprefix="s"uri="/struts-tags"%>
  3. <html>
  4. <head>
  5. <metahttp-equiv="Content-Type"content="text/html;charset=GBK"/>
  6. <title>使用s:optgroup生成下拉选择框的选项组</title>
  7. <s:head/>
  8. </head>
  9. <body>
  10. <h3>使用s:optgroup生成下拉选择框的选项组</h3>
  11. <s:form>
  12. <!--使用Map对象来生成下拉选择框的选项组-->
  13. <s:selectlabel="选择您喜欢的图书"
  14. name="book"
  15. list="#{'Spring2.0':'李刚','J2EE':'李','Ajax宝典':'李'}"
  16. listKey="value"
  17. listValue="key">
  18. <s:optgrouplabel="RodJohnson"
  19. list="#{'ExpertOne-on-OneJ2EEDesignandDevelopment':'Johnson'}"
  20. listKey="value"
  21. listValue="key"/>
  22. <s:optgrouplabel="DavidFlanagan"
  23. list="#{'JavaScript:TheDefinitiveGuide':'David'}"
  24. listKey="value"
  25. listValue="key"/>
  26. </s:select>
  27. </s:form>
  28. </body>
  29. </html>

通过浏览以上页面,我们可以看到:直接通过select标签的list属性生成的选项,是单独的选项,但通过optgroup标签的list属性生成的选项,则形成一个选项组,对于选项组的组名,是无法选择的。


token标签

token标签是用于防止多次提交的标签。避免了刷新页面时多次提交,如果需要该标签起作用,则应该在Struts2的配置文件中启用TokenInterceptor拦截器或TokenSessionStoreInterceptor拦截器。

token标签的实现原理是在表单中拉架一个隐藏域,每次加载该页面时,该隐藏域的值都不相同。而TokenInterceptor拦截器则拦截所有用户请求,如果两次请求时该隐藏域的值相同,则阻止表单提交。

使用该标签很简单,如下代码:

Java代码 收藏代码
  1. <h3>使用s:token防止重复提交</h3>
  2. <s:form>
  3. <s:token/>
  4. </s:form>

从访问后产生的HTML页面的源代码可以看到如下HTML代码:

Java代码 收藏代码
  1. <inputtype="hidden"name="struts.token.name"value="struts.token"/>
  2. <inputtype="hidden"name="struts.token"value="NUM1WVZQO3QTGKNZAKD7OA7C2YKWULVJ"/>

updownselect标签

updownselect标签的用法非常类似于select标签的用法,区别是该标签生成的列表框可以支持选项的上下移动。例子代码如下:

Java代码 收藏代码
  1. <%@pagecontentType="text/html;charset=GBK"language="java"%>
  2. <%@taglibprefix="s"uri="/struts-tags"%>
  3. <html>
  4. <head>
  5. <metahttp-equiv="Content-Type"content="text/html;charset=GBK"/>
  6. <title>使用s:updownselect生成可上下移动选项的下拉选择框</title>
  7. <s:head/>
  8. </head>
  9. <body>
  10. <h3>使用s:updownselect生成可上下移动选项的下拉选择框</h3>
  11. <s:form>
  12. <!--使用简单集合来生成可上下移动选项的下拉选择框-->
  13. <s:updownselectname="a"label="请选择您喜欢的图书"labelposition="top"
  14. moveUpLabel="向上移动"
  15. list="{'Spring2.0','J2EE','JavaScript:TheDefinitiveGuide'}"/>
  16. <!--使用简单Map对象来生成可上下移动选项的下拉选择框
  17. 且使用emptyOption="true"增加一个空选项-->
  18. <s:updownselectname="b"label="请选择您想选择出版日期"labelposition="top"
  19. moveDownLabel="向下移动"
  20. list="#{'Spring2.0':'2006年10月','J2EE':'2007月4月','Ajax':'2007年6月'}"
  21. listKey="key"
  22. emptyOption="true"
  23. listValue="value"/>
  24. <s:beanname="lee.BookService"id="bs"/>
  25. <!--使用集合里放多个JavaBean实例来可上下移动选项的生成下拉选择框-->
  26. <s:updownselectname="c"label="请选择您喜欢的图书的作者"labelposition="top"
  27. selectAllLabel="全部选择"multiple="true"
  28. list="#bs.books"
  29. listKey="author"
  30. listValue="name"/>
  31. </s:form>
  32. </body>
  33. </html>

6,Struts2的非表单UI标签

非表单标签主要用于在页面中生成一引动非表单的可视化元素,例如Tab页面,输出HTML页面的树形结构等,当然,非表单标签也包含在页面显示Action里封装的信息。非表单标签主要有如下几个:

  1. a:生成一个超链接
  2. actionerror:如果Action实例的getActionErrors()方法返回不为null,则该标签负责输出该方法返回的系列错误。
  3. actionmessage:如果Action实例的getActionMessages()方法返回不为null,则该标签负责输出该方法返回的系列消息。
  4. component:使用此标签可以生成一个自定义组件。
  5. div:此标签负责生成一个div片段
  6. fielderror:如果Action实例存在表单域的类型转换错误,校验错误,该标签则负责输出这些错误提示。
  7. tabbedPanel:生成HTML页面的Tab页。
  8. tree:生成一个树形结构。
  9. treenode:生成树形结构的节点。

actionError和actionMessage标签

这两个标签负责输出错误或提示信息到客户端,例子如下:

Action代码如下:

Java代码 收藏代码
  1. packagelee;
  2. importcom.opensymphony.xwork2.ActionSupport;
  3. publicclassDemoActionextendsActionSupport
  4. {
  5. @Override
  6. publicStringexecute()
  7. {
  8. addActionError("第一条错误消息!");
  9. addActionError("第二条错误消息!");
  10. addActionMessage("第一条普通消息!");
  11. addActionMessage("第二条普通消息!");
  12. returnSUCCESS;
  13. }
  14. }

JSP页面代码如下:

Java代码 收藏代码
  1. <%@pagecontentType="text/html;charset=GBK"language="java"%>
  2. <%@taglibprefix="s"uri="/struts-tags"%>
  3. <html>
  4. <head>
  5. </head>
  6. <body>
  7. <s:actionerror/>
  8. <s:actionmessage/>
  9. </body>
  10. </html>

component标签

conponent标签用于使用自定义标签,因为使用自定义组件还是基于主题,模板管理的,因此在使用component标签,常常需要指定如下3个属性:

theme:自定义组件所使用的主题,默认使用xhtml主题。

templateDir:指定自定义组件的主题目录,默认使用系统的主题目录,即template目录。

template:指定自定义组件所使用的模板。

此外,还可以component标签中使用param标签来注入参数的值。例子如下:

Java代码 收藏代码
  1. <%@pagecontentType="text/html;charset=GBK"language="java"%>
  2. <%@taglibprefix="s"uri="/struts-tags"%>
  3. <html>
  4. <head>
  5. <title>使用s:component标签</title>
  6. </head>
  7. <body>
  8. <h3>使用s:component标签</h3>
  9. 使用自定义主题,自定义主题目录<br>
  10. 从Web应用根路径下加载模板,使用ftl模板。
  11. <s:component
  12. theme="customTheme"
  13. templateDir="customTemplateDir"
  14. template="ftlCustomTemplate">
  15. <s:paramname="list"value="{'Spring2.0','J2EE','Ajax'}"/>
  16. </s:component>
  17. <hr/>
  18. 使用自定义主题,自定义主题目录<br>
  19. 从Web应用根路径下加载模板,使用JSP模板。
  20. <s:component
  21. theme="customTheme"
  22. templateDir="customTemplateDir"
  23. template="jspCustomTemplate.jsp">
  24. <s:paramname="list"value="{'Spring2.0','J2EE','Ajax'}"/>
  25. </s:component>
  26. <hr/>
  27. 使用默认主题(xhtml),默认主题目录(template)<br>
  28. 从Web应用中加载模板,使用JSP模板。
  29. <s:componenttemplate="mytemplate.jsp">
  30. <s:paramname="list"value="{'Spring2.0','J2EE','Ajax'}"/>
  31. </s:component>
  32. <hr/>
  33. 使用自定义主题,自定义主题目录<br>
  34. 从/WEB-INF/classes路径下加载模板,使用ftl模板。
  35. <s:component
  36. theme="myTheme"
  37. templateDir="myTemplateDir"
  38. template="myAnotherTemplate">
  39. <s:paramname="list"value="{'Spring2.0','J2EE','Ajax'}"/>
  40. </s:component>
  41. </body>
  42. </html>

上面使用了FreeMarker和JSP模板,FreeMarker模板的ftlCustomTemplate.ftl代码如下:

Java代码 收藏代码
  1. <divstyle="background-color:#bbbbbb;">
  2. FreeMarker自定义模板<br>
  3. 请选择您喜欢的图书<br>
  4. <@s.selectlist="parameters.list"/>
  5. </div>
  6. JSP模板jspCustomTemplate.jsp的代码如下:
  7. <%@pagecontentType="text/html;charset=GBK"language="java"%>
  8. <%@taglibprefix="s"uri="/struts-tags"%>
  9. <divstyle="background-color:#eeeeee;">
  10. <b>JSP自定义模板<br>
  11. 请选择您喜欢的图书<br></b>
  12. <s:selectlist="parameters.list"/>
  13. </div>

tree和treenode标签

tree和treenode标签可以在页面生成一个树形结构,其中tree生成一个树形结构,treenode生成一个树节点。例子如下:

Java代码 收藏代码
  1. <%@pagecontentType="text/html;charset=GBK"language="java"%>
  2. <%@taglibprefix="s"uri="/struts-tags"%>
  3. <html>
  4. <head>
  5. <title>使用s:tree和s:treenode标签生成静态树</title>
  6. <s:headtheme="ajax"debug="true"/>
  7. </head>
  8. <body>
  9. <h3>使用s:tree和s:treenode标签生成静态树</h3>
  10. <s:treelabel="图书"id="book"theme="ajax"
  11. showRootGrid="true"showGrid="true"treeSelectedTopic="treeSelected">
  12. <s:treenodetheme="ajax"label="李"id="yeeku">
  13. <s:treenodetheme="ajax"label="Spring2.0"id="spring"/>
  14. <s:treenodetheme="ajax"label="J2EE"id="lightweight"/>
  15. <s:treenodetheme="ajax"label="Ajax"id="ajax"/>
  16. </s:treenode>
  17. <s:treenodetheme="ajax"label="David"id="David">
  18. <s:treenodetheme="ajax"label="JavaScript:TheDefinitiveGuide"id="javascript"/>
  19. </s:treenode>
  20. <s:treenodetheme="ajax"label="Johnson"id="Johnson">
  21. <s:treenodetheme="ajax"label="ExpertOne-on-OneJ2EEDesignandDevelopment"id="j2ee"/>
  22. </s:treenode>
  23. </s:tree>
  24. </body>
  25. </html>

至此Struts2的标签都已经讲完了。

来源:http://easonfans.iteye.com/blog/458481



你可能感兴趣的:(struct)