Struts2学习之二--Struts2标签介绍
Struts2的介绍及总结

Struts2在WebWork基础上发展起来的,可扩展的JAVA EE web框架。
框架设计的目标贯穿整个开发周期,从开发到发布,包括维护的整个过程。
Action类:Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。
Struts2提供一个ActionSupport基类去实现常用的接口。
Action接口不是必须的,任何有execute标识的POJO 对象都可以用作Struts2的Action对象。
线程模式:Struts2Action对象为每一个请求产生一个实例,因此没有线程安全问题。
Servlet依赖:Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。
如果需要,Struts2 Action仍然可以访问初始的request和response。
但是,其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。
可测试性:Struts2 Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更容易。
捕获输入:Struts2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。
Action属性能够通过web页面上的taglibs访问。
表达式语言:Struts 2 使用"ValueStack"技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。
ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。
Struts2不仅支持JSTL,Struts2 还可使用OGNL进行类型转换。
提供基本和常用对象的转换器。
校验:Struts2支持通过validate方法和XWork校验框架来进行校验。
XWork 校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性。
struts2标签详解[1]
![struts2标签详解[1]](https://img.taocdn.com/s3/m/4432e174f46527d3240ce0e5.png)
要在jsp中使用Struts2的标志,先要指明标志的引入。
通过jsp的代码的顶部加入以下的代码:<%@taglib prefix="s" uri="/struts-tags" %>If elseif else描述:执行基本的条件流转。
参数:例子:<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><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(迭代)描述:用于遍历集合(java.util.Collection)或枚举值(java.util.iterator) 参数I18n(国际化操作)描述:加载资源包到值堆栈。
Struts2标签库

method
否
指定使用Action旳措施
encode
否
指定是否需要对祈求参数进行编码
includeContex t
否
指定是否需要将目前上下文涉及在URL地址中
anchor id
否
指定URL旳锚点
否
指定该url元素旳引用ID,使用该属性时,生成旳URL不16会 在页面上输出,但能够引用
<h3>s:url生成一种URL地址</h3> 指定value属性旳形式,生成相对途径<br /> <s:url value="reg.action" /> 指定value属性旳形式,生成绝对途径<br /> <s:url value="/reg.action" /><hr /> 指定action属性,而且使用param传入参数旳形式<br /> <s:url action="reg">
<s:param name="method" value="'list'" /> </s:url> 指定action属性,和namespace联合使用<br /> <s:url action="reg" namespace="/admin">
Struts2 表单标签简介

5.5 Struts2 表单标签简介如果有对 HTML 比较熟悉的读者,肯定知道诸如 select 、 chekbox 这些HTML 标签的使用方式。
这些标签其实是可以归类为表单标签。
在 Struts2 中除了这些基本的 HTML 标签的定义外,它还定义了许多特殊的但又基于前述这些HTML 表单标签的个性化标签。
这些表单标签各具特色,是很值得介绍的。
在开发中负责 view 层功能开发的开发人员如果使用这些标签,就能发现 Struts2 提供了多么丰富的 view 层功能。
5.5.1 基础表单标签使用介绍技术要点本节代码具体介绍各个基础表单标签的使用方式。
这些标签其实都可以用HTML 的表单标签来实现。
读者可以了解 Struts2 的这部分表单标签和原有HTML 表单标签实现功能几乎是相同的。
基础表单标签使用。
基础表单标签功能演示。
演示代码基础表单标签的 JSP 文件:Java代码1.<!------------------文件名:basicFormTag.jsp--------------->2.<%@ page language="java" contentType="text/html; charset=gb2312" pageEncoding="gb2312"%>3.<%@ taglib prefix="s" uri="/struts-tags"%>4.………5. <body>6. <h3 align="left">7.基础表单标签使用范例(可使用HTML标签替代)8. </h3>9. <h3 align="left">10. checkbox标签使用范例11. </h3>12. <p>13. <s:checkbox label="别墅" name="bieshu" value="true" />14. <s:checkbox label="公寓" name="gongyu" />15. </p>16. <h3 align="left">17. checkboxlist标签使用范例18. </h3>19. <p>20. <s:checkboxlist label="材料" list="{'进户门套油漆', '踢脚线', '大理石', '吊顶'}"21. name="material" />22. </p>23. <h3 align="left">24. file标签使用范例25. </h3>26. <p>27. <s:file name="file" accept="text/*"/>28. <s:file name="file" accept="image/jpeg"></s:file>29. </p>30. <h3 align="left">31. select标签使用范例32. </h3>33. <p>34. <s:select label="下拉框示例" name="material" headerKey="0" headerValue=" "35. list="#{'01':'进户门套油漆','02':'踢脚线','03':'大理石','04':'吊顶'}" />36. </p>37. <h3 align="left">38. optgroup标签使用范例39. </h3>40. <p>41. <s:select label="示例" name="material" headerKey="0" headerValue=" "42. list="#{'01':'进户门套油漆','02':'踢脚线','03':'大理石','04':'吊顶'}" >43.44.45. <s:optgroup label="材料品牌"46.47. list="#{'01':'多乐士超易洗','02':'绿太阳'}"/>48.49. </s:select>50.51. </p>52.53. <h3 align="left">54.55. radio标签使用范例56.57. </h3>58.59. <p>60.61. <s:radio label="材料" list="{'进户门套油漆', '踢脚线', '大理石', '吊顶'}"62.63. name="material"/>64.65. </p>66.67. <h3 align="left">68.69. textarea标签使用范例70.71. </h3>72.73. <p>74.75. <s:textarea label="输入文本" labelposition="left" name="textarea" cols="40" rows="10"/>76.77. </p>78.79. <h3 align="left">80.81. textfield标签使用范例82.83. </h3>84.85. <p>86.87. <s:textfield label="输入文本" name="textfield" size="40" maxlength="10"/>88.89. </p>90.91. <h3 align="left">92.93. password标签使用范例94.95. </h3>96.97. <p>98.99. <s:password label="输入密码" name="password" size="20" maxlength="8"/> 100.101. </p>102.103. </body>104.105.</html>功能演示如图 5.18 和图 5.19 。
struts标签使用

HTML:
只能用js写了.事实上struts2 的datetimepicker也是js的封装.
隐藏域:
strut2:
<s:hidden name="Value"/>
struts2的select标签中,常用的有以下几个属性:
(1)struts2中的select 标签中,必须设置的属性只有一个,即是list。
(2)select标签的list中必须有值,不然会报错。如果没有值,可以加上headerKey, headerValue,这样就可以通过了。如:
<select name="lst_QproProduce" id="lst_QproProduce">
<option value="1" selected>英语</option>
<option value="2" selected>汉语</option>
toggleType="wipe"
toggleDuration="300"
displayFormat="yyyy-MM-dd"
name="orderMain.orderDate"/>
说明:${orderMain.orderDate}取类的值,这个参数也可不写,用name就可以。
代码
<s:select name="geElement.childType" list="childTypeList" listKey="key"
struts2资料2

Struts2 标签库详解Struts2标签库包括:OGNLStruts2标签分类控制标签:(if, elseif,else, iterator, append, merge, generator, subset, sort)数据标签:(bean, param,date, debug, include, set, url, push)OGNLObject-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(ExpressionLanguage,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性:,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。
Struts2默认的表达式语言是OGNLOGNL的符号--#:1、访问OGNL上下文和Action上下文,#相当于ActionContext.getContext() .2、构造Map用于过滤和投影(projecting)集合?——所有匹配选择逻辑的元素^——只提取符合选择逻辑的第一个元素$——只提取符合选择逻辑的最后一个元素范例:<s:iterator value="#{'china':'中国','usa':'美国','e':'俄国'}" var="c"><s:property value="#c.key"/>--<s:propertyvalue="#c.value"/><br/></s:iterator>范例:<s:property value="#attr.list.{sname}[0]"/><s:property value="#attr.list.{$#this.sid== 3}.{sname}[0]"/>支持对象方法调用:<s:property value="#attr.p.doSomeThing('李四')"/>调用保存在pageContext中的Student对象的doSomeThing()[N]语法:从ValueStack的第N个位置开始取值top关键字:取出最顶端的对象示例::<s:push value="'阿拉伯联合酋长国'"><s:property value="[0].top"/></s:push>从ValueStack中的第0个位置开始取出最顶部的对象,返回为”阿拉伯联合酋长国”Struts2标签分类1.分类:Struts2标签库:用户界面标签库(表单/非表单标签库),非用户界面标签库(控制标签库,数据访问标签库),ajax支持标签库2.导入taglib<%@taglib prefix=“s”uri=“/struts-tags” %>控制标签1、条件标签if…elseif…else主要属性:: test : 测试条件范例:<%! Random rnd = newRandom(); %><% int n = rnd.nextInt(200);pageContext.setAttribute("n", n); %><s:if test="#attr.n % 7 == 0">恭喜,您中了一等奖! </s:if><s:elseif test="#attr.n % 5 ==0">恭喜,您中了二等奖! </s:elseif><s:else>欢迎惠顾!</s:else>2、迭代标签iterator用于循环数组,集合和Map属性:value:数组,集合或Mapvar:当前元素status:当前元素的状态index,count,even,odd,first,last示例:遍历List<s:iterator value="{'中华人民共和国', '美利坚合众国', '阿拉伯联合酋长国'}" var="cur"status="st"><s:property value="#st.count"/><s:property value="#cur"/><br/></s:iterator>遍历Map<s:iterator value="#{1: '中国', 2: '美国', 3: '日本'}" var="cur"><s:property value="#cur.key"/><s:property value="#cur.value"/><br/></s:iterator>3、集合合并标签append和merge将多个集合合并成一个集合属性::var - 新集合的名称示例:<s:appendvar="newCollection"><s:param value="{'中国', '美国', '日本'}"></s:param><s:param value="{'德国', '泰国', '新加坡'}"></s:param></s:append><s:iterator value="#newCollection"var="cur"><s:property value="#cur"/><br/></s:iterator>注:merge用法和append相同,结果的组织不一样.4、字符串分割标签generator将一个字符串按照指定分隔符分割成一个字符串数组separator: 分隔符val(value): 字符串count:字符串數組中元素個數示例:<s:generator separator=","val="'中,华人,民共和,国'" var="arr"/><s:iterator value="#arr"var="cur"><s:property value="#cur"/><Br/></s:iterator>5、集合子集标签subset从集合中取出一个子集,注意:子集被放在值栈的顶部,subset标签执行完后子集自动移除属性::source: 集合start: 起始索引count: 子集中元素个数示例:<s:subset source="{'中国', '美国', '日本', '德国', '泰国', '新加坡'}" start="1"count="3"><s:iterator var="cur"><s:property value="#cur"/></s:iterator></s:subset>6、排序标签sort根据定义的排序规则,对集合中的元素进行排序,排序后生成的新的集合放在值栈顶部,标签结束后自动删除.属性::comparator: 实现Comparator的类source: 集合示例:<s:bean name="com.aptech.sorted.LengthSorted"var="ls“/><s:sort comparator="#ls"source="{'中1','88w','777','6666'}"><s:iterator><s:property/><br/></s:sort>数据标签1、设置变量标签set用于设置一个新变量,并将新变量放入指定的作用域中属性:Var: 新变量的引用Value:值示例:<s:set var="v1"value="'中华人民共和国'" scope="page"></s:set><s:property value="#attr.v1"/>注:如果不指定,默认放在Stack Context中2、栈顶置值标签push将某个值置于值栈的顶部,标签结束后,将从值栈中移除.属性:value: 即值示例:<s:push value="'中华人民共和国'" ><s:property/></s:push>3、javabean创建标签bean用于创建javabean的实例,如果设置了var值,则存于Stack Context,否则,标签结束后自动移除. 属性:name: javabean类名(带包)var: 名称示例:<s:bean name="com.aptech.entity.Student"var="stu"><s:param name="sid">1</s:param><s:param name="sname">张三好</s:param><s:param name="sbirthday">2009-9-9</s:param></s:bean><s:property value="#stu.sbirthday"/>4、日期格式化标签date格式化日期并输出属性:name:日期format:格式化字符串示例:<%pageContext.setAttribute("d", new Date()); %><s:date name="#attr.d"format="yyyy年MM月dd日HH时mm分ss秒"/> 5、调试标签debug用于当前环境下Value Stack和stackcontext中保存的数据6、资源包含标签include用于将一个html,jsp或servlet包含到当前页面中,使用param传递参数属性:value:包含页面名称示例:<s:include value="MyHtml.html"></s:include>7、URL生成标签url生成URL地址,可以通过param标签传递请求参数,如果参数为中文,自动编码属性:value: url值action: action名称,自动加上.action示例:<s:url value="control.jsp"var="url"><s:param name="id">中华人民共和国</s:param></s:url><a href="<s:propertyvalue="#url" />">链接</a><s:url action="test"var="url2"></s:url><s:property value="#url2"/>8、数据输出标签property用于输出值栈,Stack Context中的数据属性:value:要输出的值如果输出值栈中的值,不用#如果输出Stack Context中的值,要用#如果省略value,表示取出值栈的栈顶对象输出总结OGNL是标签的基础,要理解OGNL的基本使用,在struts2中,OGNL必须和标签紧密配合控制标签包含一组条件判断标签和一组集合遍历和操作标签数据标签包含一组数据访问相关的标签。
通过代码实例跟我学Struts2框架从入门到精通——Struts2框架系统的标签库及iterator标签的应用示例

1.1通过代码实例跟我学Struts2框架从入门到精通——Struts2框架系统的标签库及iterator标签的应用示例1.1.1标签技术概述1、为什么要提出标签库(1)分离页面和逻辑处理几乎是每个MVC框架的重要组成部分。
从Struts1开始,到Webwork2,SpringMVC,都有自己的定义的一套标签库。
但标签库,只是框架的一部分,为了解决页面显示数据、封装简单页面逻辑而产生的类HTML标记的组件。
(2)标签产生的初衷在JSP诞生之初,JSP提供了在HTML代码中嵌入Java代码的特性。
这种特性使得我们可以比较容易的利用Java这种强类型语言的优势,完成许多复杂的业务逻辑。
不过随着时间的推移,我们发现在HTML代码中嵌入过多的Java代码,非常不利于JSP 的维护和扩展。
对于动辄上千行的JSP代码,很多时候,程序员基本丧失了对JSP的维护能力。
基于上述的这个问题,我们尝试使用一种新的技术,来解决上面这些问题。
这也就是标签产生的初衷:1)尽量避免在JSP页面中使用Java代码,而改用类似HTML的标签的形式来表达页面逻辑,让逻辑与显示分离,提高JSP的可维护性;2)由于HTML自身的标签的表达能力不足,通过使用JSP Tag,可以对HTML语义进行扩展,从而完成许多HTML自身标签无法完成的工作2、应用标签技术的优缺点(1)主要的优点1)标签产生的初衷没有错,它的存在,能够简化JSP开发的难度,并对HTML的许多标签进行功能扩展;2)标签从效果上的确在一定程度上解决了在JSP页面中,避免使用Java代码的情况3)由于Java的语法与表现能力上的优势,使用Taglib能够极大程度的封装成块的HTML代码,从而形成一套完整的页面组件,能够极大的简化页面开发(2)主要的缺点●标签只是为了尝试避免在JSP页面中使用Java代码,实际上,这种情况很难避免。
有时候,为了达到这个目的,反而带来了更多的代码和沉重的维护成本。
Struts2的OGNL标签详解

Struts2的OGNL标签详解一、Struts2可以将所有标签分成3类:UI标签:主要用于生成HTML元素的标签。
非UI标签:主要用于数据库访问,逻辑控制等标签。
Ajax标签:用于Ajax支持的标签。
对于UI标签,则有可以分为两类:表当标签:表单标签主要用与生成HTML页面的from元素,以及普通表单元素的标签。
非表单标签:非表单标签主要用于生成页面的树、Tab页等。
流程控制标签:主要包含用于实现分页、循环等流程的标签。
数据访问标签:主要包含用于输出ValueStack中的值,完成国际化等功能的标签。
Struts2标签库分类图:二、使用Struts2标签库的准备:1、在Web.Xml文件中增加标签库d定义。
(如果应用使用的是Servlet2.3以前)2、现在jsp中使用taglib编辑指令导入标签库,然后才可以使用标签。
三、Struts2的OGNL标签:OGNL是Object Graphic Navigation Language的缩写,它是一个开源项目。
Struts2框架使用OGNL作为默认的表达式语言。
在传统的OGNL表达式求值中,系统会假设系统只要一个根对象,但Struts2的Stack Context需要多个“根”对象,其中ValueStacke只是多个“根”对象的其中之一。
假设:使用标签OGNL表达式求值,不是用Struts2的OGNL表达式是求之。
如果系统的Context中包含两个对象:foo对象,它在Context中的名字为foo;bar对象, 并且它在Context中的名为bar。
将foo对象设置成Context的根对象。
返回foo.getBlah()方法的返回值#foo.blah返回bar.getBlah()方法的返回值#bar.blah可以看出ONGL表达式的语法非正常简洁。
Struts2不知根据表达式从ValueStack中取的对象,还可以直接从对象中获取属性。
Struts2提供了一个特殊的OGNL ProperAccessories(属性访问器),它可以自动搜寻栈内的所有实体(从上到下),直接找到求值表达式匹配的属性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Struts2学习之二--Struts2标签介绍热12已有 14625 次阅读 2009-07-12 18:53[顶]3G移动--Android开发工程师全能班(转) Struts2学习之二--Struts2标签介绍在上一篇文章《为Struts 2.0做好准备》中,我过于详细地介绍了Struts 2.0开发环境和运行环境的配置,所以,本文很少涉及的以上两方面的细节。
如果,您看完《为Struts 2.0做好准备》后,还有什么不明白,或者没法运行文中例子,请联系我。
我的E-MAIL:Max.M.Yuan@。
在介绍常用标志前,我想先从总体上,对Struts 1.x与Struts 2.0的标志库(Tag Library)作比较。
分类将标志库按功能分成HTML、Tiles、Logic和Bean等几部分严格上来说,没有分类,所有标志都在URI为“/struts-tags”命名空间下,不过,我们可以从功能上将其分为两大类:非UI标志和UI标志表达式语言(expression languages)不支持嵌入语言(EL)OGNL、JSTL、Groovy和Velcity以上表格,纯属个人总结,如有所不足或错误,请不吝指正好了,我要开始介绍“常用”(这里所谓的“常用”,是指在已往工作中使用Struts里经常用到的)的标志了。
1.非UI标志o if、elseif和else描述:执行基本的条件流转。
参数:名称必需默认类型描述备注test 是Boolean 决定标志里内容是否显示的表达式else标志没有这个参数id 否Object/String 用来标识元素的id。
在UI和表单中为HTML的id属性例子:<%@ page contentType="text/html; charset=UTF-8" %><%@ taglib prefix="s" uri="/struts-tags" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>Condition Flow</title></head><body><h3>Condition Flow</h3><!--这里有点小技巧:本来可以用#[0]来获得,请求中name的值。
但是,在我实现include例子时,无论我用param标志给name赋任何值,#parameters里面不会含有任何值,所以#也为空值。
其原因为:当使用include标志时,被包含的页面(included)里#paramete rs拿到的是包含页面里的请求参数。
因此,这里必须手工调用request.getParameter("name")。
--><s:set name="name" value="<%= "'" + request.getParameter("na me") + "'" %>" /><s:if test="#name == 'Max'">Max's file here</s:if><s:elseif test="#name == 'Scott'">Scott's file here</s:elseif><s:else>Other's file here</s:else></body></html>例1 condition.jspo iterator描述:用于遍历集合(java.util.Collection)或枚举值(java.util.Iterator)。
参数:名称必需默认类型描述status 否String 如果设置此参数,一个IteratorStatus的实例将会压入每个遍历的堆栈value 否Object/String 要遍历的可枚举的(iteratable)数据源,或者将放入新列表(List)的对象id 否Object/String 用来标识元素的id。
在UI和表单中为HTML的id属性例子:<%@ page contentType="text/html; charset=UTF-8" %><%@ page import="java.util.List" %><%@ page import="java.util.ArrayList" %><%@ taglib prefix="s" uri="/struts-tags" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <%List list = new ArrayList();list.add("Max");list.add("Scott");list.add("Jeffry");list.add("Joe");list.add("Kelvin");request.setAttribute("names", list);%><html><head><title>Iterator</title></head><body><h3>Names: </h3><!--1、此处的空property元素用于获得当前iterator的值2、status被设成stuts,在iterator的里面就可以通过#stuts取得IteratorStatus的对象。
IteratorStatus类包含当前序号信息,如是否第一个或最后一个,是否为奇数序号。
这些信息在我们做格式化的时候,显得非常有用。
--><ol><s:iterator value="#s" status="stuts "><s:if test="#stuts.odd == true"><li>White <s:property /></li></s:if><s:else><li style="background-color:gray"><s:property /> </li></s:else></s:iterator></ol></body></html>例2 iterator.jspo i18n描述:加载资源包到值堆栈。
它可以允许text标志访问任何资源包的信息,而不只当前action 相关联的资源包。
参数:value 是Object/String 资源包的类路径(如com.xxxx.resources.AppMsg)id 否Object/String 用来标识元素的id。
在UI和表单中为HTML的id属性例子:HelloWorld=Hello Wrold!例3 classes\ ApplicationMessages.properties<%@ page contentType="text/html; charset=UTF-8" %><%@ 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>例3 i18n.jspo include描述:包含一个servlet的输出(servlet或jsp的页面)。
参数:名称必需默认类型描述value 是String 要包含的jsp或servletid 否Object/String 用来标识元素的id。
在UI和表单中为HTML的id属性例子:<%@ page contentType="text/html; charset=UTF-8" %><%@ taglib prefix="s" uri="/struts-tags" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>Iterator</title></head><body><h3>Interator Page</h3><s:include value="/condition.jsp"><s:param name="name">Max</s:param></s:include><h3>i18n</h3><s:include value="/i18n.jsp"/></body></html>例4 include.jspo param描述:为其他标签提供参数,比如include标签和bean标签. 参数的name属性是可选的,如果提供,会调用Component的方法addParameter(String, Object), 如果不提供,则外层嵌套标签必须实现UnnamedParametric接口(如TextTag)。