struts2下的tag使用情况演示

关于Tag的相关信息在struts2中主要实现在:org.apache.struts2.views.jsp(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

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

<s:property 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()"/>


<s:set 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']"/>

<s:text 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中的消息信息,以及怎么传递参数进去的效果
    note:
        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

<s:bean 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()"/>方式来输出数据对象信息。

<s:action 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上面赫然的写着这段信息:
Note: Any additional params supplied to the included page are not accessible within the rendered page through the <s:property...> tag!
-------------------------------------
    <s:iterator>标签:
    <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"/> 两者的效果是一样的;

<s:merge 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标签
<s:append 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
------------------------------------------------
<s:sort comparator="myComparator" source="data list">
   这个标签中comparator属性是必须要被指定的.

-------------
<s:subset 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=" <s:url action="edit" includeParams="none"/>">
这个类型是指明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
------------------------

你可能感兴趣的:(apache,jsp,bean,struts,servlet)