OGNL不多说,看下面的结构,不懂再去搜,直到明白(注意区分ActionContext 、ValueStack 、Stack Context)
OGNL上下文:
|--request
|
|--application
|
context map---|--OgnlValueStack(root) [ user, action, OgnlUtil, ... ]
|
|--session
|
|--attr
|
|--parameters
标签:
1.Struts2分类
(1)UI标签:(User Interface, 用户界面)标签,主要用于生成HTML元素标签,UI标签又可分为表单标签非表单标签
《1》表单标签
一、表单标签的通用属性
所有表单标签处理类都继承了UIBean类,UIBean包含了一些通用属性,分为3种:
1、 模板相关属性
2、 JavaScript相关属性
3、 通用属性
除此之外,所有表单元素标签都存在一个特殊属性:form,通过该属性可以实现表单元素和表单之间的交互。例如,我们可以通过${parameters.form.id}来取得表单元素所在表单的ID。下面是表单标签的通用属性。
模板相关的通用属性如下:
1、 templateDir:指定该表单所用的模板文件目录。
2、 theme:指定该表单所用的主题
3、 template:指定该表单所用的模板
JavaScript相关的通用属性如下:
1、 onclick:指定鼠标在该标签生成的表单元素上单击时触发的JavaScript函数。
2、 ondbclick:指定鼠标在该标签生成的表单元素上双击时触发的JavaScript函数。
3、 onmousedown:指定鼠标在该标签生成的表单元素上按下时触发的JavaScript函数。
4、 onmouseup:指定鼠标在该标签生成的表单元素上松开时触发的JavaScript函数。
5、 onmouseover:指定鼠标在该标签生成的表单元素上悬停时触发的JavaScript函数。
6、 onmouseout:指定鼠标移除该标签生成的表单元素时触发的函数。
7、 onfocus:指定该标签生成的表单元素得到焦点时触发的函数。
8、 onblur:指定该标签生成的表单元素失去焦点时触发的函数。
9、 onkeypress:指定单击键盘上某个键时触发的函数。
10、 onkeyup:指定松开键盘上某个键时触发的函数。
11、 onkeydown:指定按下键盘上某个键时触发的函数。
12、 onselect:对下拉列表项等可以选择表单的元素,指定选中该元素时触发的JavaScript函数。
13、 onchange:对于文本框等可以接受输入的表单元素,指定当值改变时触发的javaScript函数。
因为Html本身的限制,并不是每个Html元素都可以触发以上的所有函数。因此,上面的属性并不是对Struts2 的每个标签都有效。
Struts2还允许为表单元素设置提示,单鼠标在这些元素上停悬时,系统将出现提示。Struts2将这种特性称为Tooltip。相关的通用属性如下:
1、 tooltip:设置此组件的Tooltip。
2、 tooltipIcon:设置Tooltip图标的URL路径。
3、 tooltipAboveMousePointer:是否在光标位置上显示Toopltip。也可以通过设置tooltipOffseY属性,设置Tooltip与光标位置的垂直位移。
4、 tooltipBgColor:设置Tooltip的背景色。
5、 tooltipBgImg:设置Tooltip的背景图片。
6、 tooltipBorderWidth:设置Tooltip边框的宽度
二、表单标签的name和value属性
Name和value属性之间存在一个独特的关系:因为表单元素的name属性会映射到Action的属性当对应的Action已经被实例化,且对应属性有值时,表单元素会显示出该属性的值,该值就是表单元素的value值。
三、checkboxlist标签
checkboxlist标签可以一次创建多个复选框,要根据list属性指定的集合。还有两个常用的属性。
1、 listKey:该属性指定集合元素中的某个属性作为复选框的value值
2、 listValue:该属性指定集合元素中的某个属性作为复选框的标签。
四、doubleselect标签
doubleselect标签会生成一个级联列表框(会生成两个下拉列表框),当选第一个列表框时,第二个的内容也会随之改变。常用属性如下:
1、 list:指定用于输出第一个下拉列表框中选项的集合
2、 listKey:该属性指定集合元素中的某个属性作为复选框的value值
3、 listValue:该属性指定集合元素中的某个属性作为复选框的标签。
4、 doubleList:指定用于输出的第一个下拉列表框中选项的集合
5、 doubleList key:该属性指定集合元素中的某个属性作为复选框的value值
6、 doubleList Value:该属性指定集合元素中的某个属性作为复选框的标签。
7、 doubleName:指定第二个下拉列表框的name属性。
五、head标签
六、optiontransferseselect标签
七、select标签
八、radio标签
九、optgroup标签
十、token标签
十一、 updownselect标签
《2》非表单标签
一、actionerror和actionmessage标签
二、component标签
三、tree和treenode初步
(2)非UI标签,主要用于数据访问,逻辑控制等的标签。非UI标签可分为流程控制标签(包括用于实现分支、循环等流程控制的标签)和数据访问标签(主要包括用户输出ValueStack中的值,完成国际化等功能的)
《1》控制标签
|
《2》数据标签
- 通过指定命名空间和action名称,该标签允许你在jsp页面直接调用Action. 标签体用来渲染Action执行结果. 除非你设定了executeResult参数为true,否则你在xwork.xml中为该Action指定的Result Processor不会执行.
名称 必填 缺省 类型 描述 id false String 如果设定,将作为该Action在栈中的标识 name true String action名字(不包括后缀,如.action) namespace false String action所在命名空间 executeResult false false Boolean Action的result是否需要被执行 ignoreContextParams false false Boolean request中的参数是否需要传入该Action
实例化一个符合JavaBeans规范的class,标签体内可以包含几个Param元素,用于调用setter方法给此class的属性赋值.如果是定了id属性,则该实例将会放到stack的context中.
名称 必填 缺省 类型 描述 name true String 要被实例化的class名字(必须符合JavaBeans规范) id false String/Object 标识该元素
- 将某个特定resource bundle放入value stack. 然后通过text标签拿到相应message, 而不是仅限于绑定到当前action的bundle.
名称 必填 缺省 类型 描述 name true String 要使用的resource bundle.(如 foo/bar/customBundle) id false String/Object 标识该元素
- 包含servlet的输出(servlet或JSP页面)
名称 必填 缺省 类型 描述 value true String 包含的jsp或servlet id false Object/String 元素标识
- 例子:
- <ww:include value="myJsp.jsp">
- <ww:param name="param1" value="value2" />
- <ww:param name="param2" value="value2" />
- </ww:include>
为其他标签提供参数,比如include标签和bean标签.
参数的name属性是可选的,如果提供,会调用Component的方法addParameter(String, Object),如果不提供,则外层嵌套标签必须实现UnnamedParametric接口(如TextTag).
该标签的两个属性
-
- name (String) - 参数名
- value (Object) - 参数值
-
注意 : value的提供有两种方式,通过value属性或者标签中间的text,不同之处我们看一下例子: <param name= "color">blue</param> <-- (A) --> <param name= "color" value= "blue"/> <-- (B) --> (A)中,参数值会以String的格式放入statck. (B)中该值会以java.lang.Object的格式放入statck.
- push值到堆栈中,方便应用.
-
名称 必填 缺省 类型 描述 value true Object/String 要push到堆栈中的值 id false Object/String 该元素标识
- <ww:push value="user">
- <ww:propery value="firstName" />
- <ww:propery value="lastName" />
- </ww:push>
- 将user的值push到栈中,从而使property标签的能够获取user的属性(firstName, lastName etc)
- set标签赋予变量一个特定范围内的值. 当希望给一个变量赋一个复杂的表达式,每次访问该变量而不是复杂的表达式时用到.其在两种情况下非常有用: 复杂的表达式很耗时 (性能提升) 或者很难理解 (代码可读性提高).
-
名称 必填 缺省 类型 描述 name true String 变量的名字 scope false action String 变量作用域,可以为application, session, request, page, 或action. value false Object/String 将会赋给变量的值 id false Object/String 元素标识
- <ww:set name="personName" value="person.name"/>
- Hello, <ww:property value="#personName"/>. How are you?
支持国际化信息的标签
国际化信息必须放在一个和当前action同名的resource bundle中,如果没有找到相应message,tag body将被当作默认message,如果没有tag body,message的name会被作为默认message
-
名称 必填 缺省 类型 描述 name true Object/String 资源属性的名字 name false Object/String 该元素标识
该标签用于创建url,可以通过"param"标签提供request参数.
注意:
当includeParams的值时'all'或者'get', param标签中定义的参数将有优先权,也就是说其会覆盖其他同名参数的值.
-
名称 必填 缺省 类型 描述 includeParams false get Object/String 值为'none', 'get' 或'all'. scheme false Object/String scheme属性 value false Object/String value如果不提供就用当前action action false Object/String 用来生成url的action,如果没有则使用value namespace false Object/String 命名空间 method false Object/String 使用的action的方法 encode false true Boolean 是否encode参数 includeContext false true Boolean 是否实际的上下文环境应该包含在url中 portletMode false Object/String 结果portlet 的模式(mode) windowState false Object/String 结果portlet窗口的状态 portletUrlType false Object/String 指定这时一个 portlet 输出还是一个 action url anchor false Object/String URL的锚点( anchor) id false Object/String 该元素标识
<ww:url value="editGadget.action">
<ww:param name="id" value="%{selected}" />
</ww:url>
- 得到'value'的属性,如果value没提供,默认为堆栈顶端的元素.
-
名称 必填 缺省 类型 描述 default false String 如果属性是null则显示的default值 escape false true Boolean 是否escape HTML value false <top of stack> Object value to be displayed id false Object/String 该元素标识
<ww:push value="myBean">
<!-- Example 1: -->
<ww:property value="myBeanProperty" />
<!-- Example 2: -->
<ww:property value="myBeanProperty" default="a default value" />
</ww:push>
(3)ajax标签 2.Struts2标签使用前的准备: (1)在要使用标签的jsp页面引入标签库: <%@ taglib uri="/struts-tags" prefix="s"%> (2)在web.xml中声明要使用的标签 这样是struts2 2.3.1.2版本的引入方式 <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> 3.常用的标签用法: (1)property标签 用于输出指定的值: <s:property value="%{@cn.csdn.hr.domain.User@Name}"/><br/> <s:property value="@cn.csdn.hr.domain.User@Name"/><Br/><!-- 以上两种方法都可以 --> <s:property value="%{@cn.csdn.hr.domain.User@study()}"/> 以上可以访问某一个包的类的属性的集中方式,study()是访问方法的方法,并输出。 以下用java代码代替的,访问某一个范围内的属性 <% //采用pageContext对象往page范围内存入值来 验证#attr搜索顺序是从page开始的 ,搜索的顺序为:page,reques,session,application。 set存值的时候存到的是request中,在jsp页面中访问的时候不用加任何的标识符,即可直接访问,如果不同的作用域不一样了, pageContext.setAttribute("name", "laoowang", PageContext.PAGE_SCOPE); %> <s:property value="#attr.name" /> 假设在action中设置了不同作用域的类 不同的作用域的标签的访问: <h3>获取的是requet中的对象值</h3> 第一种方式:<s:property value="#request.user1.realName"/> <br/> 第二种方式:<s:property value="#request.user1['realName']"/> <br/> 第三种方式:<s:property value="#user1.realName"/> <br/> 第四种方式:<s:property value="#user1['realName']"/> <br/> 第五种方式:${requestScope.user1.realName } || ${requestScope.user1['realName'] } 第六种:<s:property value="#attr.user1.realName"/> attr对象按page==> request sessionapplictio找的 <h3>获取session中的值</h3> 第一种方式:<s:property value="#session.user1.realName"/> <br/> 第二种方式:<s:property value="#session.user1['realName']"/> 第五种方式:${sessionScope.user1.realName } || ${sessionScope.user1['realName'] } <h3>获取application中的对象的值</h3> 第一种方式:<s:property value="#application.user1.realName"/> <br/> 第二种方式:<s:property value="#application.user1['realName']"/> 第五种方式:${applicationScope.user1.realName } || ${applicationScope.user1['realName'] } (2)iterator标签的使用 第一种:list集合 <!-- 设置set集合 value--> <!-- status 可选属性,该属性指定迭代时的IteratorStatus实例 --> <!-- value="#attr.list" list存放到了request中 可以value="#request.list" statu.odd返回当前被迭代元素的索引是否是奇数 --> <s:set name="list" value="{'a','b','c','d'}"></s:set> <s:iterator var="ent" value="#request.list" status="statu"> <s:if test="%{#statu.odd}"> <font color="red"><s:property value="#ent" /> </font> </s:if> <s:else> <s:property value="#ent" /> </s:else> </s:iterator> 第二种:map集合中的使用 <h3>Map集合</h3> <!-- map集合的特点: 语法格式:# {key:value,key1:value1,key2:value2,.....} 以上的语法中就直接生成了一个Map类型的集合,该Map对象中的每个key-value对象之间用英文的冒号隔开 ,多个元素之间用逗号分隔。 --> </div> <s:set var="map" value="#{'1':'laowang','2':'老王','3':'猩猩'}"></s:set> 遍历Map: <br /> <s:iterator value="#map"> <s:property value="key" />:::<s:property value="value" /> <Br /> </s:iterator>\ 第三种:集合的变量 <h3>遍历集合:::</h3> <div> <!-- 遍历出价格大于3000的 --> <s:iterator var="user" value="#session['users']"> <s:if test="%{#user['price']>3000}"> <s:property value="#user['price']"/> </s:if> </s:iterator> <hr color="blue"/><!-- $是取出价格 大于3000的最后一个值 --> <s:iterator var="u" value="#session.users.{$(#this['price']>3000)}"> <s:property value="price"/> </s:iterator> </div> 注:users是User的对象,price是User中的一个属性 简述一下iterator的介绍: iterator标签用于对集合进行迭代,这里的集合包含List、Set和数组。 <s:set name="list" value="{'zhangming','xiaoi','liming'}" /> <s:iterator value="#list" status="st"> <font color=<s:if test="#st.odd">red</s:if><s:else>blue</s:else>> <s:property /></font><br> </s:iterator> value:可选属性,指定被迭代的集合,如果没有设置该属性,则使用ValueStack栈顶的集合。 id:可选属性,指定集合里元素的id。 status:可选属性,该属性指定迭代时的IteratorStatus实例。该实例包含如下几个方法: int getCount(),返回当前迭代了几个元素。 int getIndex(),返回当前迭代元素的索引。 boolean isEven(),返回当前被迭代元素的索引是否是偶数 boolean isOdd(),返回当前被迭代元素的索引是否是奇数 boolean isFirst(),返回当前被迭代元素是否是第一个元素。 boolean isLast(),返回当前被迭代元素是否是最后一个元素。 (3)if else语句的使用 <s:set name="age" value="21" /> <s:if test="#age==23"> 23 </s:if> <s:elseif test="#age==21"> 21 </s:elseif> <s:else> 都不等 </s:else> (4)URL标签 <!-- 声明一个URL地址 --> <s:url action="test" namespace="/tag" var="add"> <s:param name="username">laowangang</s:param> <s:param name="id">12</s:param> </s:url> <s:a href="%{add}">测试URL</s:a> <s:a action="test" namespace="/tag"></s:a> 以上的两个<s:a>标签的作用是一样的。 (5)data标签 <% pageContext.setAttribute("birth",new Date(200,03,10),PageContext.REQUEST_SCOPE); %> <s:date name="#request.birth" format="yyyy年MM月dd日"/> <s:date name="#request.birth" nice="true"/> 这个标签是按照format的格式去输出的。 (6)表单 <h1>from表单</h1> <s:form action="test" namespace="/tag"> <s:textfield label="用户名" name="uname" tooltip="你的名字" javascriptTooltip="false"></s:textfield> <s:textarea name="rmake" cols="40" rows="20" tooltipDelay="300" tooltip="hi" label="备注" javascriptTooltip="true"></s:textarea> <s:password label="密码" name="upass"></s:password> <s:file name="file" label="上传文件"></s:file> <s:hidden name="id" value="1"></s:hidden> <!-- <select name="edu"> <option value="listKey">listValue</option> --> <s:select list="#{'1':'博士','2':'硕士'}" name="edu" label="学历" listKey="key" listValue="value"></s:select> <s:select list="{'java','.net'}" value="java"></s:select><!-- value是选中的 --> <!-- 必须有name --> <s:checkbox label="爱好 " fieldValue="true" name="checkboxFiled1"></s:checkbox> <!-- 多个checkbox --> <s:checkboxlist list="{'java','css','html','struts2'}" label="喜欢的编程语言" name="box" value="{'css','struts2'}"></s:checkboxlist> <!-- map集合前要加# --> <s:checkboxlist list="#{1:'java',2:'css',3:'html',4:'struts2',5:'spring'}" label="喜欢的编程语言" name="boxs" value="{1,2}"></s:checkboxlist> <!-- listKey listValue <input type="text" name="boxs" value="listKey">显示值listValue --> <!-- radio --> <% //从服务器传过来值 pageContext.setAttribute("sex","男",PageContext.REQUEST_SCOPE); pageContext.setAttribute("sex1","男",PageContext.REQUEST_SCOPE); %> <s:radio list="{'男','女'}" name="sex" value="#request.sex"></s:radio> <s:radio list="#{1:'男',2:'女'}" name="sex1" listKey="key" listValue="value" value="#request.sex1"></s:radio> <!-- 防止表单提交的方式 --> <s:token></s:token> <s:submit value="提交"></s:submit> </s:form>