struts2下的tag使用情况演示

[b]关于Tag的相关信息在struts2中主要实现在:org.apache.struts2.views.jsp[/b](Package)
其实现的时候需要考虑如下的一些资源类:
javax.servlet.jsp.tagext.JspTag(Interface)
javax.servlet.jsp.tagext.Tag(Interface)
javax.servlet.jsp.tagext.IterationTag(Interface)
javax.servlet.jsp.tagext.TagSupport(class)

javax.servlet.jsp.tagext.BodyTag
setBodyContent:
doInitBody
javax.servlet.jsp.tagext.BodyTagSupport

[b]struts2在上面的基础上进行了如下的扩展:[/b]
org.apache.struts2.views.jsp.StrutsBodyTagSupport:
org.apache.struts2.views.jsp.ComponentTagSupport: (注意这里的Component的概念)
-----------------------------------------------
这里来具体讨论标签的使用:
这个标签的的body是empty类型的...

[b]<s:property[/b] value="" escape="true" default="默认值"/>
输出一个常量
<s:property value='"这个是需要输出的内容<font color=red>红色</font>"' escape="false" default=""/>
这里如果escape的取值为true,则<font color=red>红色</font>将作为一个字符串输出,相反则为"红色"
调用一个对象的方法:<s:property value="#myBean.toString()"/>


[b]<s:set[/b] name="myVar" value="'变量的取值'" scope="action|application|request|session|page"
这里需要注意的问题是 name和id属性已经有被depricated的趋势了,取而代之的将会是var
这个标签的scope属性的默认取值为action
例如: <s:set name="myVar" value="'变量数据值'" scope="action"/>
显示:<s:property value="%{myVar}"/> <s:property value="#myVar"/> <s:property value="myVar"/>

例如: <s:set name="myVar1" value="'变量数据值request'" scope="request"/>
显示: <s:property value="#request.myVar1"/> 或者 <s:property value="#request['myVar1']"/>

[b]<s:text[/b] name="struts.messages.invalid.token"></s:text>
<s:text name="struts.internal.invalid.token"><s:param>取值1</s:param><s:param>取值2</s:param></s:text>
上面演示了如何得到位于.properties中的消息信息,以及怎么传递参数进去的效果
[color=blue]note:[/color]
struts.messages.invalid.token=The form has already been processed or no token was supplied, please try again.
struts.internal.invalid.token=Form token {0} does not match the session token {1}.
这里需要注意的一点是如果我们直接访问页面数据信息的话,消息文件应该被存储在位置:
org/apache/struts2/struts-messages,
com/opensymphony/xwork2/xwork-messages

[b]<s:bean[/b] name="com.chsi.sample.model.SampleObject" id="myBean">
<s:param name="name" value="'属性name的取值'" />
The value of foot is : <s:property value="name"/>, when inside the bean tag <br />
</s:bean>

这个的效果就是设置一个变量myBean,其类型为com.chsi.sample.model.SampleObject,并且设置其属性name的取值为'属性name的取值'

然后我们可以在页面中使用:<s:property value="#myBean.name"/> 或者<s:property value="#myBean.getName()"/>来得到对应的数据值
当然和我们想当然的认为<s:property value="#myBean"/>将使用<s:property value="#myBean.toString()"/>方式来输出数据对象信息。

[b]<s:action [/b]name="list" namespace="/demo/form" executeResult="true" />
这个标签将在页面中标签出现的位置执行href = /demo/form/list.action并把执行结果镶嵌到标签出现的位置:其中属性execueteResult主要用来
控制是否执行结果
当然数据的配置信息也可以是如下的形式:
<s:action name="list!list" namespace="/demo/form" executeResult="true" />, 这个配置主要指定list对应的Action中(com.chsi.sample.action.SampleEAction)的某个特定的方法(这里是list方法)被调用,这里的效果和<s:action name="list" namespace="/demo/form" executeResult="true" />类似
上面演示了如何得到位于.properties中的消息信息,以及怎么传递参数进去的效果

<s:include value="forInclude.jsp">
<s:param name="p" value="123"/>
</s:include>

这个标签的使用的时候遇到一个非常郁闷的问题就是:我们可以通过request.getParameter("p");得到传递进来的数据信息,但是却无法通过<s:property value="#parameters['p']"/>来得到得到
也就是说如果[上面的内容]在a.jsp中的话,访问/a.jsp 然后在forInclude.jsp中无法使用#parameters['p']来得到信息,相反需要/a.jsp?p=123456则#parameters['p']=123456,但request.getParameter("p")=123不变,这可真是诡异……

查看源代码后我们不难发现,实现类中并没有往Stack中写信息,同时发现doc上面赫然的写着这段信息:
[color=blue]Note: Any additional params supplied to the included page are not accessible within the rendered page through the <s:property...> tag![/color]
-------------------------------------
[b]<s:iterator>标签:[/b]
<s:set name="datas" value="{'a', 'b','c',123}"/>
<s:iterator value="datas" id="v" status="status">
index[<s:property value="#status.index"/>]=<s:property/>
</s:iterator>
这个标签主要是完成对一个集合的循环显示,其中status属性定义的变量主要用来控制循环出现的次序问题,而id则是定义每次循环时出现的值变量,value是待循环的数据集合……
这里需要注意的一点还有:
status.index 元素的位置,以0开头
status.count 元素的序号,以1开头

如果我们要在循环体中访问某个元素的某个属性可以通过 id引用的变量的名字来得到元素的对象,然后再使用其属性来得到数据信息,也可以直接通过变量的属性得到数据信息,如:
<s:iterator value="availableItems" status="status" id="v">
姓名:<s:property value="#v.name"> 或者 姓名:<s:property value="name"/> 两者的效果是一样的;

[b]<s:merge[/b] id="myMergedIterator">
<s:param value="{'e','f','g'}"/>
<s:param value="{'a','b','c','d'}"/>
</s:merge>

<s:iterator value="%{#myMergedIterator}"> 当然这里的写法和<s:iterator value="myMergedIterator">效果相当
<s:property />
</s:iterator>
这个组合的输出结果是: e a f b g c d;

如果我们merge标签这种合并集合的形式感到不爽的话,我们可以使用append标签
[b]<s:append[/b] id="myAppendIterator">
<s:param value="{1,2,3,4,5,6}" />
<s:param value="{'a','b','c'}" />
<s:param value="{'A','B','C','D'}" />
</s:append>
<s:iterator value="%{#myAppendIterator}">
<s:property />
</s:iterator>
这个组合的执行结果是:最主要的是它在合并集合的时候保持了原有集合的顺序, 当然如果元素有重复的话,也是不会被剔除的
1 2 3 4 5 6 a b c A B C D
------------------------------------------------
[b]<s:sort[/b] comparator="myComparator" source="data list">
这个标签中comparator属性是必须要被指定的.

-------------
[b]<s:subset[/b] id="mySubset" source="myList" count="13" start="3" />
这个标签的主要作用是从start指定的位置开始访问数据元素,直到count个数据终止,这里的start是元素的index属性标记的位置(index 以0为起始位置),count的值如果小于0,或者大于元素的总个数,则取开始位置直到剩余的数据被取完全,当取值为0的时候表示不取元素。而start的起始位置如果小于0则效果等效于0,当大于元素集合的总数时则不会取出任何数据信息
----------------------------------------------------
形式1:不指明namespace的取值, 在这种情况下action的namespace信息从访问连接的的来源获取, 比如:/a/b/x.jsp则namespace="/a/b",
<a href="[b]<s:url action="edit" includeParams="none"/>[/b]">
这个类型是指明namespace资源的:从而产生的连接就是/list
<a href="<s:url action="list" namespace="/" includeParams="none"/>">
这里列举namespace不同取值的情况,以action="list"为例来说明:
namespace="" 或者 namespace="/" 则产生的连接都是 /list
namespace="a/b" 如果访问路径是/x/y/x.jsp则产生的链接就是: /x/y/a/b/list
namespace="/a/b" 如果访问路径是/x/y/x.jsp则产生的链接就是: /a/b/x.jsp
------------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值