OGNL+标签---struts2学习笔记

来源:互联网 发布:mac系统崩溃 怎么恢复 编辑:程序博客网 时间:2024/04/29 22:46

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》控制标签

  if/elseif/else标签

    test属性:决定标签内容是否显示的表达式。

  iterator标签:iterator标签用于迭代一个集合,这里的集合可以是Collection、Map、Enumeration、Iterator或数组。iterator在迭代过程中,会把迭代的每一个对象暂时压入值栈中,这样在标签的内部就可以直接访问对象的属性和方法,在标签体执行完毕,位于栈顶的对象就会被删除,在第二次迭代的时候再压入新的对象。

    id属性:如果指定了该属性,迭代的集合元素将被保存到OgnlContext中,可以使用该属性值来引用集合中的元素。该属性几乎不用;

    value属性:指定迭代的集合。如果没有指定,则标签会把栈顶的对象放入一个新创建的List中进行迭代;

    status属性:如果指定该属性,一个以属性值命名的IteratorStatus实例将被放入到OgnlContext中,可以通过该实例获得迭代过程中的状态信息;

      IteratorStatus类中有如下方法:

        public int getCount(); 得到当前迭代的元素的总数;

        public int getIndex(); 得到当前迭代元素的索引;

        public boolean isEven(); 判断当前元素的顺序是否为偶数;

        public boolean isOdd(); 判断当前元素的顺序是否为奇数;

        public boolean isFirst(); 判断当前元素是否为第一个;

        public boolean isLast(); 判断当前元素是否为最后一个。

      这些方法分别对应count、index、even、odd、first和last属性。

 append标签:用于将不同的迭代器合并在一起,使一个迭代器迭代完成后转移到下一个迭代器中继续迭代。在append标签内部,使用一个或多个param标签来指定要一起迭代的集合。它的迭代顺序是第一个迭代器迭代完,再迭代后面的迭代器。

    id属性:指定该属性后,组合后的迭代器会被保存到OgnlContext中,可以通过id属性来引用。

 merge标签:与append标签类似,但迭代的顺序有所不同:merge合并后的迭代器先迭代所有迭代器中的第一个元素,再迭代所有迭代器中的第二个元素,以此类推。

 generator标签:generator标签根据separator属性指定的分隔符,将val属性指定的值进行拆分,然后生成一个迭代器,压入值栈的顶部。在generator标签内部,可以使用iterator标签取出栈顶的迭代器对拆分后的各个部分进行迭代。当generator标签结束时,栈顶的迭代器将被删除。

    val属性:指定要解析的值;

    seperator属性:指定用于解析val属性的分隔符;

    count属性:指定在生成的迭代器中可用的元素数量;

    converter属性:指定一个转换器,用于将解析后的各个字符串转换为对象。转换器是实现org.apache.struts2.util.IteratorGenerator.Converter接口的类,可以用bean标签来实例化和引用;

    id属性:如果指定了该属性,生成的迭代器将以该属性值为key保存到pageContext对象中;这一点与其他标签不同。

 subset标签:subset标签用于截取一个迭代器的子集;

    source属性:指定源集合,如果没有指定,则以值栈的栈顶对象作为源集合;

    start属性:指定从源集合的第几个元素开始截取子集,索引从0开始;

    count属性:指定截取元素的个数;

    decider属性:指定一个Decider对象,用于判断一个元素是否应该被包含在子集里。decider是一个实现org.apache.struts2.util.SubsetIteratorFilter.Decider接口的类,可以使用bean标签来实例化和引用;

    id属性:如果指定了该属性,截取后的子集将以该属性值为key保存在pageContext对象中。

 sort标签:sort标签根据comparator属性指定的比较器对集合进行排序,并将排序后的迭代器压入值栈的栈顶。在sort标签内部,可以使用iterator标签取出栈顶的迭代器对排序后的元素进行迭代。当sort标签结束时,栈顶的迭代器将被删除;

    source属性:指定要排序的集合。如果不指定,则以栈顶的对象作为排序的集合;

    comparator属性:指定使用的比较器。比较器类是实现java.util.Comparator接口的类,可以用bean标签来实例化和引用;

    id属性:如果指定该属性,排序后的迭代器将以该属性值为key保存到pageContext对象中。

《2》数据标签

  • action 
  • 通过指定命名空间和action名称,该标签允许你在jsp页面直接调用Action. 标签体用来渲染Action执行结果. 除非你设定了executeResult参数为true,否则你在xwork.xml中为该Action指定的Result Processor不会执行.
  • 名称必填缺省类型描述idfalse String如果设定,将作为该Action在栈中的标识nametrue Stringaction名字(不包括后缀,如.action)namespacefalse Stringaction所在命名空间executeResultfalsefalseBooleanAction的result是否需要被执行ignoreContextParamsfalsefalseBooleanrequest中的参数是否需要传入该Action
  • bean 
  • 实例化一个符合JavaBeans规范的class,标签体内可以包含几个Param元素,用于调用setter方法给此class的属性赋值.如果是定了id属性,则该实例将会放到stack的context中.

  • 名称必填缺省类型描述nametrue String要被实例化的class名字(必须符合JavaBeans规范)idfalse String/Object标识该元素

  • debug 
  • i18n 
  • 将某个特定resource bundle放入value stack. 然后通过text标签拿到相应message, 而不是仅限于绑定到当前action的bundle.
  • 名称必填缺省类型描述nametrue String要使用的resource bundle.(如 foo/bar/customBundle)idfalse String/Object标识该元素
  • include 
  • 包含servlet的输出(servlet或JSP页面)
  • 名称必填缺省类型描述valuetrue String包含的jsp或servletidfalse Object/String元素标识
  • 例子:
  • <ww:include value="myJsp.jsp">
  •    <ww:param name="param1" value="value2" />
  •    <ww:param name="param2" value="value2" />
  • </ww:include>
  • param 
  • 为其他标签提供参数,比如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 
    • push值到堆栈中,方便应用.
    • 名称必填缺省类型描述valuetrue Object/String要push到堆栈中的值idfalse Object/String该元素标识
    • <ww:push value="user">
    •     <ww:propery value="firstName" />
    •     <ww:propery value="lastName" />
    • </ww:push>
    • 将user的值push到栈中,从而使property标签的能够获取user的属性(firstName, lastName etc)
    • set 
    • set标签赋予变量一个特定范围内的值. 当希望给一个变量赋一个复杂的表达式,每次访问该变量而不是复杂的表达式时用到.其在两种情况下非常有用: 复杂的表达式很耗时 (性能提升) 或者很难理解 (代码可读性提高).
    • 名称必填缺省类型描述nametrue String变量的名字scopefalseactionString变量作用域,可以为application, session, request, page, 或action.valuefalse Object/String将会赋给变量的值idfalse Object/String元素标识
    • <ww:set name="personName" value="person.name"/>
    • Hello, <ww:property value="#personName"/>. How are you?
    • text 
    • 支持国际化信息的标签

    • 国际化信息必须放在一个和当前action同名的resource bundle中,如果没有找到相应message,tag body将被当作默认message,如果没有tag body,message的name会被作为默认message

    • 名称必填缺省类型描述nametrue Object/String资源属性的名字namefalse Object/String该元素标识

    • url 
    • 该标签用于创建url,可以通过"param"标签提供request参数.

    • 注意:

    • 当includeParams的值时'all'或者'get', param标签中定义的参数将有优先权,也就是说其会覆盖其他同名参数的值.

    • 名称必填缺省类型描述includeParamsfalsegetObject/String值为'none', 'get' 或'all'.schemefalse Object/Stringscheme属性valuefalse Object/Stringvalue如果不提供就用当前actionactionfalse Object/String用来生成url的action,如果没有则使用valuenamespacefalse Object/String命名空间methodfalse Object/String使用的action的方法encodefalsetrueBoolean是否encode参数includeContextfalsetrueBoolean是否实际的上下文环境应该包含在url中portletModefalse Object/String结果portlet 的模式(mode)windowStatefalse Object/String结果portlet窗口的状态portletUrlTypefalse Object/String指定这时一个 portlet 输出还是一个 action urlanchorfalse Object/StringURL的锚点( anchor)idfalse Object/String该元素标识

    • <ww:url value="editGadget.action">

    •     <ww:param name="id" value="%{selected}" />

    • </ww:url>

    • property 
    • 得到'value'的属性,如果value没提供,默认为堆栈顶端的元素.
    • 名称必填缺省类型描述defaultfalse String如果属性是null则显示的default值escapefalsetrueBoolean是否escape HTMLvaluefalse<top of stack>Objectvalue to be displayedidfalse 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>