`

Struts2标签

 
阅读更多

一. Struts2标签概述

Struts2把所有的标签都定义在URI”/struts-tag”的命名空间下。

Struts2标签分类如下:

(1) UI标签:生成HTML元素的标签。

    表单标签:主要用于生成HTML页面的表单元素的标签。

    非表单标签:主要用于生成页面上的treeTab页等标签。

(2) UI标签:数据访问和逻辑控制等标签。

    流程控制标签:主要包含用于实现分支,循环等流程控制的标签。

    数据访问标签:主要包含用于输出ValueStack中的值,完成国际化等功能的标签。

(3) Ajax标签:用于Ajax支持的标签。(该标签不常用,因为最常使用的是Ajax框架。)

 

 

二. 使用Struts2标签库的准备

可以在struts2-core-2.0.11.jar压缩文件的META-INF目录下找到struts-tags.tld文件,该文件里定义了Struts2的标签。

要在jsp中使用Struts2的标志,先要指明标志的引入。通过jsp的代码的顶部加入以下的代码:

<%@taglib prefix="s" uri="/struts-tags" %>

 

 

 

三. Struts2标签语法

Struts2的标签都支持动态数据的访问,标签的属性都可以使用OGNL表达式,struts2标签的属性具有类型,这些类型可以简单地分为字符串类型非字符串类型

 

(1) 对于字符串类型的属性,如果要访问动态数据,需要使用%{}这样的语法。

例如:<s:include value="%{url}" />

Include标签的value属性是字符串类型,Struts2将对这个属性进行解析,查找符合%{}样式的字符串,然后将花括号之间的内容作为OGNL表达式进行求值。如果属性中没有%{}样式的字符串,那么属性的值将被直接看成是字符串数据。

例如:<s:include value="urlTag.action" />

 

(2) 对于非字符串类型的属性,将作为OGNL表达式进行求值。

例如:<s:property value="username"/>

说明:property标签的value属性是Object类型,username将作为OGNL表达式进行求值,即取得值栈栈顶的对象的username

 

如果要为非字符串类型的属性直接指定字符串数据,那么需要使用OGNL中的字符串常量,即用单引号(')或双引号(")将字符串括起来。

例如:<s:property value="'zhangsan'"/>

value属性的值’zhangsan’作为字符串常量,计算结果就是zhangsan,因此输出zhangsan

 

(3) 除上述用法之外,可以使用%{}这样的语法来指定字符串常量。

例如:<s:property value="%{'zhangsan' }"/>

在这种情况下,%{ }将被忽略,花括号中的内容将作为表达式被计算。

 

总结一下,struts2标签的属性按照下列的三个规则进行计算。

a. 所有的字符串属性类型都会解析“%{}”这样的语法。

b. 所有的非字符属性类型都不会被解析,而是直接被看作一个OGNL表达式进行求值

c. 对于第二个规则的例外情况是,如果非字符串属性使用了“%{}”语法,那么%{}将被忽略,花括号中的内容将作为表达式计算。

 

如果使用标签时, 忘记了某个属性是字符串类型,还是非字符串类型,那么有一个简单的方法,那就是不考虑它是什么类型,统一使用“%{}”语法。

 

 

 

四. Struts2通用标签

参考链接 http://struts.apache.org/2.x/docs/struts-tags.html  

说明:官方文档可能有写地方是错误的。关键是自己的理解和实验。

 

Struts2中通用标签可以分为二类:数据标签控制标签。控制标签用于呈现页面时控制执行流程,数据标签用于访问值栈中的数据。

 

数据标签:用于访问ActionContext和值栈中的数据。数据标签包括:

property   set   push          param      bean         action       include    

url    a       i18n text  date debug

 

控制标签:用于在呈现结果页面时控制程序的执行流程,根据程序执行的状态输出不同的结果,控制标签包括下列标签:

if/elseif/else           iterator         append         merge

generator               subset sort          

 

 

1. property标签

property标签用于输出指定值。使用value属性来指定要输出的对象属性,如果没有指定value属性,那么默认输出值栈栈顶对象。 

property标签的属性

default :String类型。如果value属性是null,则使用default.

Escape :Boolean类型。是否转义输出内容中的HTML,例如,当该属性的值为true时,.&将被转移为&amp;

value :Object类型。进行求值的表达式。默认为栈顶对象。

例:<s:property value=”usename” default=”游客” />

 

 

2. set标签   http://struts.apache.org/2.x/docs/set.html

set标签用于将值赋给指定范围内的变量。即将对象放入值栈中指定的范围中去。使用set标签常用于在循环或其他情况下更换名称。

name :2.1废弃。

val :String类型。新变量的名字。

value :Object类型。指定一个表达式,计算的结果赋给变量。默认为栈顶对象。

scope :String类型。变量的范围,可选的值为application、session、request、page、action。默认为action。

说明:

set标签以name属性的值作为键(key),将value属性的值保存到指定的范围对象中。scope属性取值中的pagerequestsessionapplicationJSP4种范围,如果指定action范围(默认值)value属性的值将被同时保存到request范围和OgnlContext中。

 

 

3. include标签

include标签的属性

 

jsp2.jsp中,我们使用JSPEL表达式来获取传的请求参数。注意:在include标签内部使用param标签向被包含的页面传递的请求参数,不能使用如下的property标签来访问:<s:property value=#parameters.username />

 

#parameters引用的实质是一个Map对象,并不等同于HttpServletRequest对象。

 

在包含页面时,如果页面中有中文,将会出现乱码,要解决这个问题,可以在struts.xml文件中配置struts.i18n.encoding属性,如下:

<constant name=“struts.i18n.encoding” value=“gbk” />

 

访问路径:http://localhost:8080/.../includeTag.jsp

 

 

 

4. date标签

date标签用于格式化输出日期值,也可用于输出当前日期值与指定日期值之间的时差

date标签的属性

 

注意:

1format属性用于指定日期的格式化样式,具体的样式规则可以参看java.text.SimpleDateFormat类的API文档。

2、将nice属性设为true,可以输出指定日期值和当前日期值之间的时差,此时format属性失效,也就是说,当nice属性为true时,即使你指定了format属性,它也不会起作用

3、如果没有使用nice属性,也没有指定format属性,那么date标签将会在国际化资源包中查找struts.date.format键,并以这个键的值作为日期的格式化样式;如果这个键不存在,那么默认将会使用DateFormat.MEDIUM格式化样式。

4、如果找不到name属性指定的Date对象,那么将返回空。

 

date标签示例

第一步

ApplicationResources.properties文件中添加struts.date.format

struts.date.format=yyyy/MM/dd hh:mm:ss

 

第二步

可以使用struts2struts.custom.i18n.resources属性来设置默认的资源包,编辑struts.xml文件,使用constant元素来配置struts.custom.i18n.resources属性,内容如下

<constant name=“struts.custom.i18n.resources” value=“ApplicationResources”/>

 

 

 

 

控制标签

if/elseif/else 标签

分支控制

格式:

<s:if test=”表达式”>

    标签体

</s:if>

<s:elseif test=”表达式”>

    标签体

</s:elseif>

……其他<s:elseif>标签……

<s:else>

    标签体

</s:else>

 

 

 

 

 

 

 

 

 

iterator标签

主要用于对集合进行遍历。

<s:iterator…/>标签对集合进行遍历输出时.可以指定如下3个属性.

 

 

IteratorStauts实例包含方法

int getCount():返回当前迭代过元素的总数。

int getIndex():返回当前迭代元素的索引。

boolean isEven():判断当前迭元素是否为偶数。

boolean isOdd():判断当前迭元素是否为奇数。

boolean isFirst():判断当前迭元素是否为第一个元素。

boolean isLast():判断当前迭元素是否为最后一个元素

 

IteratorStauts的这些方法分别对应了count,index,even,odd,first,last属性

 

控制标签----- iterator标签示例

 

 

控制标签----- iterator(迭代标签)举例

<s:iterator value ="{'第一个元素','第二个元素'}" >

  <p>day is: <s:property/></p>

</s:iterator>

 

private List myList;

private Map myMap;

public String execute() throws Exception {

myList = new ArrayList();

myList.add("第一个元素");

myList.add("第二个元素");

myList.add("第三个元素");

myMap = new HashMap();

myMap.put("key1", "第一个元素");

myMap.put("key2", "第二个元素");

myMap.put("key3", "第三个元素");

return SUCCESS;

}

 省略生成setter/getter方法

 

<table>

                   <s:iterator value="{'第一个元素','第二个元素'}" status="st">

                   <tr>

                   <td><s:property value="#st.getIndex()" /></td>

                            <td><s:property /></td>

                   </tr>

                            </s:iterator>

         </table>

 

                   <h2>显示List属性</h2>

                   <table>

                 <s:iterator value="myList" status="st">

                            <tr>

                                     <td><s:property value="#st.getIndex()" /></td>

                                     <td><s:property /></td>

                            </tr>

                        </s:iterator>

                   </table>

<h2>显示Map</h2>

         <table>

                   <s:iterator value="#{'key1':'第一个元素','key2':'第二个元素'}" status="st">

                          <tr>

                            <td><s:property value="#st.getIndex()" /></td>

                            <td><s:property /></td>

                          </tr>

                   </s:iterator>

         </table>

 

                   <h2>显示Map属性</h2>

         <table>

                   <s:iterator value="myMap" status="st">

                         <tr>

                            <td><s:property value="#st.getIndex()" /></td>

                            <td><s:property /></td>

                        </tr>

                   </s:iterator>

         </table>

 

 

 

select标签

select标签输出一个HTML列表框,等价于HTML代码:

 

select标签示例

示例一:

<s:form>

                   <s:select label=“最高学历” name=“education”  list=“{‘高中大学硕士’}”  />

</s:form>

select标签的list属性中直接使用OGNL表达式创建了一个列表,列表中的每一项都将作为HTML列表框的一个选项。

 

示例二:

<s:form>

                   <s:select label=“最高学历” name=“education”  list=“#{1:‘高中2:‘大学3:‘硕士’}”  />

</s:form>

select标签的list属性中直接使用OGNL表达式创建了一个Map。在这里要注意的是,Mapkey是作为列表框选项的值,而Map中的value是作为列表框选项的内容。

 

示例三:

<s:form>

                   <s:select label=“最高学历” name=education list={‘高中’,‘大学’,‘硕士’}  headerKey=-1   headerValue=“请选择你的学历”  />

Header选项主要用来越提示作用,因此应该将header选项的值(通过headerKey属性设置)设为无意义的值,例如此处的-1.

 

示例四:

<s:form>

                   <s:select label=“最高学历” name=education list={‘高中’,‘大学’,‘硕士’}  headerKey=-1   headerValue=“请选择你的学历”   emptyOption=true  multiple=true / >

         使用emptyOption属性在header选项后添加一个空的选项。

         multiple属性设为false,则只能从下拉列表中选择一个选项,如果设为true,则可以多选。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics