`
wei5201
  • 浏览: 185243 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

struts2 ongl的理解以及struts2标签详解

阅读更多
OGNL表达式语言很抽象,按下面的方式应该很好理解,解释了我们为什么在struts2的action中能为复合类型的属性赋值,以及我们为什么可以在jsp页面里使用ongl表达式(从request,session,application中取值等)
  
     Struts2的OGNL表达式语言是基于Xwork的OGNL的,它在Xwork的基础上对OGNL进行了一些封装,因此先了解Xwork的OGNL是十分有必要的。Xwork的OGNL使用时比较容易理解。它有两个重要的概念:上下文环境和根对象。上下文环境是一个Map对象,所有的数据存取都是在上下文环境中进行的,你可以在存取数据时指定不同Map作为上下文环境。访问根对象时不需要加#前缀,而访问上下文环境中的其它对象需要加入#前缀。
Xwork中的OGNL通过Ognl类操作数据。
Java代码
     public void testGetValue() throws Exception{  
        User user = new User();  
        user.setId(1);  
        user.setName("lijie");   
 
        Object name = Ognl.getValue(Ognl.parseExpression("name"), user);  
        System.out.println(name);  
    } 

         public void testGetValue() throws Exception{
User user = new User();
user.setId(1);
user.setName("lijie");

Object name = Ognl.getValue(Ognl.parseExpression("name"), user);
System.out.println(name);
}

以上代码将User作为根对象(可以参见Ognl的API),访问其name属性,所以不需要前缀#,输出lijie。
Java代码
     public void testGetValue() throws Exception{  
        User user = new User();  
        user.setId(1);  
        user.setName("lijie");  
          
        Map context = new HashMap();  
        context.put("user", user);  
          
    Object name = Ognl.getValue(Ognl.parseExpression("name"), context,user);  
        System.out.println(name);   
    } 

         public void testGetValue() throws Exception{
User user = new User();
user.setId(1);
user.setName("lijie");

Map context = new HashMap();
context.put("user", user);

Object name = Ognl.getValue(Ognl.parseExpression("name"), context,user);
System.out.println(name);
}

上述代码将Map对象context作为上下文,user是其中的根对象,所以直接访问name属性,输出lijie。
Java代码
     public void testGetValue() throws Exception{  
        User user = new User();  
        user.setId(1);  
        user.setName("lijie");   
          
        Map context = new HashMap();  
        context.put("user", user);   
        context.put("country", "China");  
          
        Object country = Ognl.getValue(Ognl.parseExpression("#country"), context,user);  
        System.out.println(country);           
    } 

         public void testGetValue() throws Exception{
User user = new User();
user.setId(1);
user.setName("lijie");

Map context = new HashMap();
context.put("user", user);
context.put("country", "China");

Object country = Ognl.getValue(Ognl.parseExpression("#country"), context,user);
System.out.println(country);
}

上述代码在context上下文中加入了一个String对象country,由于country不是根对象,所以访问时必须加前缀#,否则会抛出异常,指明根对象中没有country属性。上述代码输出China。
Java代码
     public void testGetValue() throws Exception{  
        User user = new User();  
        user.setId(1);  
        user.setName("lijie");    
           
        Ognl.setValue("name", user, "Tom");  
        System.out.println(user.getName());     
    } 

         public void testGetValue() throws Exception{
User user = new User();
user.setId(1);
user.setName("lijie"); 

Ognl.setValue("name", user, "Tom");
System.out.println(user.getName());  
}

上述代码向User对象设置,输出Tom。
    Struts2中的OGNL表达式语言是对Xwork的OGNL的封装。我们要理解一下几点:
1. Struts2中将ActionContext作为OGNL的上下文环境(ActionContext内部含有一个Map对象)
2. Struts2中的OGNL表达式语言的根对象是一个ValueStack,ValueStack中的每一个对象都被视为根对象。
Struts2框架将实例化的Action对象放入ValueStack中,如果是Action链,则多个Action都存在于ValueStack中。而ValueStack中除了Action外,Struts2框架还将parameters,request,response,session,application,attr等对象放到ActionContext中,访问这些对象需要加前缀#。

总结:Struts2中的数据处理基于Xwork的OGNL,它在OGNL的基础上进行了一定的封装。OGNL的核心概念是根对象(root)和上下文环境(context)---你可以传入一个Map对象作为上下文,向其中put进一个对象,那么这个对象可以作为根对象(ognl中可以向函数中传入不同的Map对象作为根对象来操作,也可以指定不同的根对象,而Struts2中,它固定了根对象ValueStack)。在Struts2中,ActionContext作为OGNL的上下文环境,它的根对象是一个ValueStack,ValueStack中的每个对象都被视为根对象。Struts2中的Action作为根对象存在(如果多个Action以chain的形式存在,则多个Action均存在于ValueStack中,均为根对象)。

以上是我大概的理解,具体的细节大家可以参考一些资料,不妥之处,希望大家批评指正。
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

以下,为摘抄别人的ongl表达式:
struts2总结之  OGNL表达式(2010-02-23 12:19:52) 

     最近的项目开发中使用了struts2的框架,但是好多人都不清楚struts2的标签的具体的用法,要想完全掌握struts2标签的用法,那么你必须先精通了struts2中OGNL的用法。struts2中很多东西其实理解就行,但是惟独OGNL虽然内容不多,但是确必须的精通,这是学习struts2的基础。

     Struts2 中内置了OGNL表达式的支持,使得Struts2的具有比Struts1更为强大的数据访问的功能。本文主要讲解OGNL的使用方法,并不会去讲解一些原理性的东西,想要了解的朋友可以自己去查阅相关的资料

     在OGNL的使用主要分以下部分来讲解:1.使用OGNL访问对象(不同范围的取值)

                                       2.OGNL的集合操作(OGNL元素符,以及过滤和投影功能)

                                       3.OGNL访问静态成员(怎么访问静态成员)

                                       4. lambda表达式,在OGNL中使用一些简单的函数以及OGNL总结(在总结之后会详解Struts2的标签的使用)


一、使用OGNL访问对象

   1 读取struts2中的ValueStack中的值

     struts2中引入了ValueStack的概念,在struts2中默认使用ValueStack作为OGNL的StackContext的根元素

   OGNL在读取根元素的时候能够直接进行读取

     假设action中有

     private Cat cat;  private Dog dog; 俩个对象,那么在jsp页面读取方法就是

    <s:property value="cat.name"/>  读取Cat的name属性的值

    <s:property value="dog.name"/>  读取Dog的name属性值

   2 使用#读取parameters  request  session  application 范围内的值()
     <s:property value="#request.id"/>  相当于 request.getAttribute("id")

     <s:property value="#parameters.id"/>  相当于 request.getParameter("id")

     <s:property value="#session.id"/>  相当于 session.getAttribute("id")

     <s:property value="#application.id"/>  相当于 application.getAttribute("id")

     <s:property value="#attr.id"/>   依次搜索PageContext HttpServletRequest   HttpSession  ServletContext 范围 ,查找属性,找到为止
二、OGNL的集合操作

   1 创建一个集合

    {e1,e2,e3} 直接创建一个List类型的集合

    #{Key1:Value1,Key2:Value2} 构建一个Map类型的集合

    使用: <s:set name="sex" value="#{'1':'男','2':'女'}"/>

         <s:property value="#sex[id]"/>  在ValueStack范围内找到id的值, 并用它作为key去查找对应的

                                         value 并显示出来  
   2 OGNL元素符
     对于集合,OGNL提供了两个元素符:in和not in,其中in判断某个元素是否在指定集合中;not in则用于

    判断某个元素是否不在指定集合中。

    判断一个对象是否在List内存在:

   <s:if test="'foo' in {'foo','bar'}">

      muhahaha

   </s:if>

   <s:else>

      boo

   </s:else>


   <s:if test="'foo' not in {'foo','bar'}">

      muhahaha

   </s:if>

   <s:else>

      boo

   </s:else>

   3 过滤与投影集合

     假设有一个books的List集合存在于ValueStack中,存放了多个Book类型的对象

      我们可以通过这样进行过滤取值

     <s:iterator value="books.{?#this.price>35}"> 这样只会取到价格大于35的书籍,很好的起到了过滤的

     作用,

     ?取出所有符合逻辑的元素

     ^ 取出符合逻辑的第一个元素

     $ 取出符合逻辑的最后一个元素

三、OGNL访问静态成员

    在实际的开发中像页面的参数传递是绝对拒绝使用硬编码的,最好的解决方式有2种:一种是写在国际化配置文件中;另外的一种就是建立一个类,专门维护静态成员,所有硬编码的地方都调用它就可以了。

    struts2 中默认提供了一些访问静态成员的方式,但是默认是关闭的,所以应该在struts2的配置文件中先设置

   <constant name="struts.ognl.allowStaticMethodAccess" value="true"/>

   设置之后就可以用以下的表达式来访问静态成员了。

  1 访问静态方法

     <s:property value="@com.netsdar.song.manager.util.AppUtil@getName()"/>

  2 访问静态常量

     <s:property value="@com.netsdar.song.manager.util.AppUtil@Index_Title"/>

四、lambda表达式,在OGNL中使用一些简单的函数以及OGNL总结

   1 lambda表达式

     这个表达式,我其实也很少去用,这里给大家拿个例子讲解一下吧

     <s:property value="#conv =:[#this==1?'男':#this==2?'女':''], #conv(1)" />

     这句的作用就是,value="#conv =:   定义一个函数 conv

     [#this==1?'男'       定义 conv(1)=男

     #this==2?'女'        定义 conv(2)=女

     当然这个只是一个简单的例子,这里支持复杂的函数运算。对于一些简单的逻辑更推荐使用struts2的标签来处理。复杂点的不做具体讲解,引用别人的一个例子

  
例如:

Fibonacci:

if n==0 return 0;

elseif n==1 return 1;

else return fib(n-2)+fib(n-1);

fib(0) = 0

fib(1) = 1

fib(11) = 89


OGNL的Lambda表达式如何工作呢?

Lambda表达式必须放在方括号内部,#this表示表达式的参数。例如:

<s:property value="#fib =:[#this==0 ? 0 : #this==1 ? 1 : #fib(#this-2)+#fib(#this-1)], #fib(11)" />


#fib =:[#this==0 ? 0 : #this==1 ? 1 : #fib(#this-2)+#fib(#this-1)]定义了一个Lambda表达式,

#fib(11) 调用了这个表达式。

   2 总结

     这里主要讲解一下使用注意事项

     <s:url value="#foobar['foo1']">   如果你这样使用标签 ,那么它绝对不会是你想要的,它会按照你的

                                       输入原样的输出的  #foobar['foo1']

    正确的使用:   <s:url value="%{#foobar['foo1']}">   %{} 用于对括号内用ognl求值

    struts2的action,大家都习惯了生成get与set方法,其实新版的没有这俩个方法也能插值进去的,它采用了java的反射机制来实现,不过官方还是建议按照旧的方法用。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~jsp页面代码:
 
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
<%@page import="com.rao.bean.Sex"%>  
<%@ taglib prefix="s" uri="/struts-tags"%>  
<%@ taglib prefix="sx" uri="/struts-dojo-tags"%>  
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
<html>  
<head>  
  <title>My page</title>  
  <s:head theme="xhtml"/>  
  <sx:head parseContent="true"/>  
</head>  
 
  <body>  
    Struts 2.1 Tags  
    <br/>  
    <br/>  
    一、控制标签<br/><hr size="3" color="red">  
      
     #、if /elseif/ else @用于逻辑判断<br/>  
     <s:set name="bir" value="-12"></s:set>  
     <s:if test="#bir>=180 || #bir<0">  
        你是何方妖怪?  
     </s:if>  
     <s:elseif test="#bir<=18 && #bir>=0">  
        未成年人不能进入!  
     </s:elseif>  
     <s:elseif test="#bir<=60 && #bir>=18">  
        您已经成年!  
     </s:elseif>  
     <s:else>  
        您已经老了!  
     </s:else>  
     <br/>--------------------------------------------------------------<br/>  
     #、append @用于将多个集合合并<br/>  
     <s:set name="appList1" value="{'111','222','333','444'}"></s:set>  
     <s:set name="appList2" value="{'aaa','bbb','ccc','ddd'}"></s:set>  
     <s:append var="newAppList">  
        <s:param value="appList1"></s:param>  
        <s:param value="appList2"></s:param>  
     </s:append>  
     <s:iterator value="#newAppList">  
        <s:property/> |   
     </s:iterator>  
      <br/>--------------------------------------------------------------<br/>  
     #、generator  <br/>  
     generator标签,该标签可以将指定字符串按指定分隔符分割成多个字串。生成的多个字串可以用iterator标签进行迭代输出。可以这么理解:generator标签将一个字符串转换成一个List集合。在该标签体内,整个临时生成的集合将为Valuestack的顶端,但一旦该标签结束,生成的集合将被移除Valuestack。generator标签有如下几个属性:  
    <br/>  
    1、count属性:指定生成集合中元素的总数。可选属性。<br/>  
      
    2、val属性:必填属性,指定被解析的字符串。<br/>  
      
    3、separator属性:这是一个必填属性,指定用于分割字符串的分隔符。<br/>  
      
    4、converter属性:可选属性,指定一个转换器,转换器负责将生成的集合中的每个字符串转换成对象,通过这个转换器可以将一个含有分隔符的字符串解析成对象的集合。转换器必须一个继承org.apache.struts2.util.IteratorGenerator.Converter的对象。  
    <br/>  
    5、var属性,可选属性。如果指定了该属性,则将生成的集合保存在Stack Context中。如果不指定该属性,则将生成的集合放入ValueStack的顶端,该标签一结束,生成的集合就被移除。该属性也可替换成id。  
    <br/>  
     <s:generator  val="'aaa,bbb,ccc,ddd'"  separator="," count="2">  
        <s:iterator>  
            <s:property/>  
        </s:iterator>  
     </s:generator><br/>  
 
      <br/>--------------------------------------------------------------<br/>  
     #、iterator 用于迭代数据<br/>  
     <s:set name="iterList" value="{'aaa','bbb','ccc','ddd'}"></s:set>  
     <table border="1">  
     <tr>     
                <td>   索引   </td>     
                <td>   值   </td>     
                <td>   奇?   </td>     
                <td>   偶?    </td>     
                <td>   首?    </td>     
                <td>   尾?    </td>     
                <td>  当前迭代数量    </td>     
            </tr>     
       
        <s:iterator value="{'aaa','bbb','ccc','ddd','eee','fff'}" begin="1" status="s">  
            <tr bgcolor="<s:if test="#s.odd">pink</s:if>">  
                <td><s:property value="#s.index"/></td>  
                <td><s:property/></td>  
                <td><s:property value="#s.even"/></td>  
                <td><s:property value="#s.odd"/></td>  
                <td><s:property value="#s.first"/></td>  
                <td><s:property value="#s.last"/></td>  
                <td><s:property value="#s.count"/></td>  
            </tr>  
        </s:iterator>        
     </table>  
       
       
      <br/>--------------------------------------------------------------<br/>  
     #、merge @和类似:用于将多个集合合并<br/>  
     <s:set name="merList1" value="{'111','222','333','444'}"></s:set>  
     <s:set name="merList2" value="{'aaa','bbb','ccc','ddd'}"></s:set>  
     <s:append var="newMerList">  
        <s:param value="merList1"></s:param>  
        <s:param value="merList2"></s:param>  
     </s:append>  
     <s:iterator value="#newMerList">  
        <s:property/> |   
     </s:iterator>  
      <br/>--------------------------------------------------------------<br/>  
     #、sort @用于排序<br/>  
     <s:bean var="myComparator" name="com.rao.comparator.MyComparator"></s:bean>  
     <s:sort comparator="#myComparator" source="{1,45,56,0,345,3}">  
        <s:iterator>  
            <s:property/>,  
        </s:iterator>  
     </s:sort>  
      <br/>--------------------------------------------------------------<br/>  
     #、subset @用户截取集合中的子集;   注:decider:可选属性,指定由开发者自己决定是否选中该元素.    
     <br/>  
     <s:set name="subList" value="{'@@@','***','&&&','###'}"></s:set>  
     <s:subset source="#subList" start="1" count="2">  
        <s:iterator>  
            <s:property/>,  
        </s:iterator>  
     </s:subset>  
      <br/>--------------------------------------------------------------<br/>  
       二、数据标签<br/>  
      <hr size="3" color="red">  
    #、action @用于导入一个Action<br/>  
    使用action标签,可以允许在jsp页面中直接调用Action,在调用Action时候,可以指定需要被调用的Action的name和namespace.如果指定了executeResult参数的属性值为true,该标签会把Action的处理结果(视图资源)包含到本页面中. 使用action标签指定属性有:  
    <br/>  
    id: 可选属性,作为该Action的引用ID   <br/>   
     
    name:必选属性,指定调用Action    <br/>  
         
    namespace:可选属性,指定该标签调用Action所属namespace    <br/>  
         
    executeResult:可选属性,指定是否将Action的处理结果包含到本页面中.默认值为false,不包含.    <br/>  
         
    ignoreContextParam:可选参数,指定该页面的请求参数是否需要传入调用的Action中,默认值是false,即传入参数.<br/>  
      
    s:param是以request方式的值的,而不是以参数传值,所以request.getParameter("")会获取不到值,通过request.getAttribute("")方式可以获取<br/>  
 
    <s:action name="tagsAction1" ignoreContextParams="true" executeResult="true" namespace="/com/rao">  
        <s:param name="userName" value="'三毛'"></s:param>  
    </s:action>  
      
      <br/>--------------------------------------------------------------<br/>  
    #、bean @用于导入一个javaBean,相当于:jsp:useBean 标签<br/>  
    <s:bean name="com.rao.bean.UserBean" var="user">  
        <s:param name="userId" value="1001"></s:param>  
        <s:param name="userName" value="'张三'"></s:param>  
    </s:bean>  
    userId:<s:property value="#user.userId"/><br>  
    userName:<s:property value="#user.userName"/>  
      <br/>--------------------------------------------------------------<br/>  
    #、date @用于格式化日期<br/>  
    <s:set name="dt" value="new java.util.Date()"></s:set>  
    当期系统时间是:<s:date name="dt" format="yyyy-MM-dd HH:ss:mm"/>  
      <br/>--------------------------------------------------------------<br/>  
    #、debug @用于调试程序,让开发人员一目了然的知道当前请求、值栈、栈中的各项参数<br/>  
    <s:debug/>  
      <br/>--------------------------------------------------------------<br/>  
    #、i18n @用于访问国际化资源文件的内容<br/>  
                1.默认访问全局范围内的资源文件;  
                <br>  
                <s:text name="welcome">  
                    <s:param>三毛</s:param>  
                    <s:param>学习</s:param>  
                </s:text>  
          
                <hr>  
                2.访问包范围内的资源文件;  
                <br>  
                <s:i18n name="com/rao/action/package">  
                    <s:text name="welcome">  
                        <s:param>三毛</s:param>  
                        <s:param>学习</s:param>  
                    </s:text>  
                </s:i18n>  
                <hr>  
                3.访问Action范围内的资源文件;  
                <br>  
                <s:i18n name="com/rao/action/GlobalNativeAction">  
                    <s:text name="welcome">  
                        <s:param>三毛</s:param>  
                        <s:param>学习</s:param>  
                    </s:text>  
                </s:i18n>  
      <br/>--------------------------------------------------------------<br/>  
    #、include @用于导入一个jsp文件,等同于:jsp:include标签<br/>  
    <s:include value="success.jsp"></s:include>  
      <br/>--------------------------------------------------------------<br/>  
    #、param @用于给指定参数设置值<br/>  
    <s:bean name="com.rao.bean.UserBean" var="user">  
        <s:param name="userId" value="1001"></s:param>  
        <s:param name="userName" value="'张三'"></s:param>  
    </s:bean>  
    userId:<s:property value="#user.userId"/><br>  
    userName:<s:property value="#user.userName"/>  
      <br/>--------------------------------------------------------------<br/>  
    #、property @输出结果,很像EL表达式,但是可以依托于OGNL表带是很强大<br/>  
    同上  
      <br/>--------------------------------------------------------------<br/>  
    #、push @该标签可以把程序员在ActionContext中引用的对像压入valuestack中,为以后访问对象提供了方便<br/>  
    <s:push value="#request.user"><s:property value="userName"/></s:push>  
      <br/>--------------------------------------------------------------<br/>  
    #、set @用户声明对象或属性<br/>  
    <s:set name="uName" value="#request.user.userName"></s:set>  
    <s:property value="#uName"/>,你好啊!  
      <br/>--------------------------------------------------------------<br/>  
    #、text @用户获取国际化资源文件的内容<br/>  
    请参考 il8n标签  
      <br/>--------------------------------------------------------------<br/>  
    #、url @用于组拼一个请求路径<br/>  
    <s:url var="url1" action="MyAction" method="add">  
        <s:param name="id" value="%{23}"></s:param>  
        <s:param name="name" value="%{'tom'}"></s:param>  
    </s:url>  
    <s:property value="#url1"/>  
    <br/>  
    注意:<br/>     
        <s:set name="myurl" value="'http://www.baidu.com'"></s:set>     
        value以字符处理:   <s:url value="#myurl"></s:url><br>     
        value明确指定以ognl表达式处理:    <s:url value="%{#myurl}"></s:url>     
      
      <br/>--------------------------------------------------------------<br/>  
      
       三、UI标签<br/>  
    <hr size="3" color="red">  
    <s:form>  
    #、checkboxlist @复选框列表<br>  
         1> .list 生成;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>     
        name:checkboxlist的名字<br>     
        list:checkboxlist要显示的列表<br>     
        value:checkboxlist默认被选中的选项,checked=checked<br>     
        <s:checkboxlist theme="simple" name="checkbox1" list="{'上网','看书','爬山','游泳','唱歌'}" value="{'上网','看书'}" ></s:checkboxlist>     
        <br>     
         
        2> .Map 生成;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>     
        name:checkboxlist的名字<br>     
        list:checkboxlist要显示的列表<br>     
        listKey:checkbox 的value的值<br>     
        listValue:checkbox 的lablel(显示的值)<br>     
        value:checkboxlist默认被选中的选项,checked=checked<br>     
        <s:checkboxlist theme="simple" name="checkbox2" list="#{1:'上网',2:'看书',3:'爬山',4:'游泳',5:'唱歌'}" listKey="key" listValue="value" value="{1,2,5}" ></s:checkboxlist>     
    
         <br/>--------------------------------------------------------------<br/>  
     #、combobox <br/>  
    <s:combobox theme="simple" label="选择你喜欢的颜色" name="colorNames"  headerValue="------请选择------" headerKey="1"  list="{'红','橙','黄','绿','青','蓝','紫'}" />   
    <br/>--------------------------------------------------------------<br/>  
     #、radio @单选框<br/>   
         <%     
            Sex sex1 = new Sex(1,"男");      
            Sex sex2 = new Sex(2,"女");     
            List<Sex> list = new ArrayList<Sex>();      
            list.add(sex1);     
            list.add(sex2);     
            request.setAttribute("sexs",list);      
        %>     
                      这个与checkboxlist差不多;<br>     
        1>.如果集合为javabean:<s:radio theme="simple" name="sex" list="#request.sexs" listKey="id" listValue="name"></s:radio><br>     
        2>.如果集合为list:<s:radio theme="simple" name="sexList" list="{'男','女'}"></s:radio><br>     
        3>.如果集合为map:<s:radio theme="simple" name="sexMap" list="#{1:'男',2:'女'}" listKey="key" listValue="value"></s:radio><br>     
        <hr>     
     <br/>--------------------------------------------------------------<br/>  
     #、select @下拉列表框<br/>    
        这个与s:checkboxlist差不多;<br>     
        1>.如果集合为javabean:<s:select theme="simple" name="sex" list="#request.sexs" listKey="id" listValue="name"></s:select><br>     
        2>.如果集合为list:<s:select theme="simple" name="sexList" list="{'男','女'}"></s:select><br>     
        3>.如果集合为map:<s:select theme="simple" name="sexMap" list="#{1:'男',2:'女'}" listKey="key" listValue="value"></s:select><br>     
       
     <br/>--------------------------------------------------------------<br/>  
     #、doubleselect @级联菜单 <br/>  
    <!--   可以用直接指定,当然也可以跟数据库绑定的 -->  
     <s:set name="proviList" value="{'江西省','湖北省'}"></s:set>  
     <s:set name="jxList" value="{'南昌市','赣州市','九江市','上饶市','鹰潭市'}"></s:set>  
     <s:set name="hbList" value="{'武汉市','恩施市','十堰市','荆州市','襄樊市'}"></s:set>  
     <s:doubleselect theme="simple"  name="provi" doubleList="top=='江西省' ? #jxList : #hbList" list="#proviList" doubleName="city"></s:doubleselect>  
     <br/>--------------------------------------------------------------<br/>  
     #、optiontransferselect <br/>  
     <s:optiontransferselect theme="simple" label="change" name="abc" doubleList="{'111','222','333','444'}" list="{'aaa','bbb','ccc','ddd'}" doubleName="number"></s:optiontransferselect>  
     <br/>--------------------------------------------------------------<br/>  
     #、updownselect @可上下选择的select <br/>  
     <s:updownselect label="selectCity" emptyOption="true" name="selectCity" list="#jxList" headerValue="-Please Select The City-" headerKey="-1"></s:updownselect>  
      <br/>--------------------------------------------------------------<br/>  
     #、sx:datetimepicker @日期选择控件 <br/>  
     使用步骤:声明:我这里用的是strut 2.1.8.1,在struts2.0的版本中可能有所不同;<br/>  
              1.导入struts2-dojo-plugin-2.1.8.1.jar DoJo 插件包;<br/>  
              2. 导入标签:<%--@ taglib prefix="sx" uri="/struts-dojo-tags"--%>;<br/>  
              3.在需要使用的页面中的head标签之间加上<%-- <sx:head parseContent="true"/> --%>;<br/>  
     <sx:datetimepicker label="birthday" name="bir" value="#dt"></sx:datetimepicker>  
      <br/>--------------------------------------------------------------<br/>  
     #、sx:tabbedpanel @选项卡控件 <br/>  
      声明:这个标签代码转至:http://blog.sina.com.cn/s/blog_6145ed810100ecud.html,版权归作者所有;写的挺好拿来大家共同学习。  
       
      <!-- tabbedpanel标签 -->  
        <!-- 最简单的选项卡,两个选项卡加载都是本页面 -->  
          <hr color="blue">  
          <b>最简单的选项卡:</b>  
          <br>  
                <sx:tabbedpanel id="tab1" beforeSelectTabNotifyTopics="/beforeSelect">  
             <sx:div label="Tab 1" >  
                 Local Tab 1 
             </sx:div>    
             <sx:div label="Tab 2" >  
                 Local Tab 2 
             </sx:div>    
                </sx:tabbedpanel>  
          
          
        <!-- 加载其他页面的选项卡 -->  
          <hr color="blue">  
          <b>加载其他页面的选项卡:</b>  
          <br>  
          <sx:tabbedpanel id="tab2">  
          <sx:div label="Remote Tab 1" href="upload.jsp">  
                     Remote Tab 1 
                </sx:div>  
             <sx:div label="Remote Tab 2" href="multipleUpload.jsp" >  
                     Remote Tab 1 
                </sx:div>  
          </sx:tabbedpanel>  
          
          
        <!-- 设置选项卡底下的内容懒加载,即等需要的时候再加载,使用属性preload="false"-->  
          <hr color="blue">  
          <b>设置选项卡底下的内容懒加载,即等需要的时候再加载,使用属性preload="false":</b>  
          <br>  
                <sx:tabbedpanel id="tab3">  
             <sx:div label="Remote Tab 1" href="upload.jsp">  
                 Remote Tab 1 
             </sx:div>   
             <sx:div label="Remote Tab 2" href="multipleUpload.jsp" preload="false">  
                 Remote Tab 1 
             </sx:div>       
                </sx:tabbedpanel>  
          
          
        <!-- 固定大小的选项卡 -->  
          <hr color="blue">  
          <b>固定大小的选项卡,使用属性cssStyle和doLayout:</b>  
          <br>  
                <sx:tabbedpanel cssStyle="width: 200px; height: 100px;" doLayout="true" id="tab4">  
             <sx:div label="Tab 1" >  
                 Local Tab 1 
             </sx:div>    
             <sx:div label="Tab 2" >  
                 Local Tab 2 
             </sx:div>    
                </sx:tabbedpanel>  
          
          
        <!-- 每次点击选项卡时都重新刷新内容 -->  
          <hr color="blue">  
          <b>每次点击选项卡时都重新刷新内容,使用属性refreshOnShow:</b>  
          <br>  
          <sx:tabbedpanel id="tab5">  
             <sx:div label="Remote Tab 1" href="upload.jsp" refreshOnShow="true">  
                 Remote Tab 1 
             </sx:div>   
             <sx:div label="Remote Tab 2" href="multipleUpload.jsp" refreshOnShow="true">  
                 Remote Tab 2 
             </sx:div>       
          </sx:tabbedpanel>  
          
           
          
        <!-- 使得其中一个选项卡失效 -->  
          <hr color="blue">  
          <b>使得其中一个选项卡失效:</b>  
          <br>  
                 <sx:tabbedpanel id="tab6">  
            <sx:div label="Tab 1" >  
                Local Tab 1 
            </sx:div>    
            <sx:div label="Tab 2" disabled="true">  
                Local Tab 2 
            </sx:div>    
                </sx:tabbedpanel>  
          
          
        <!-- 设置选项卡在底部显示 (可以是: top, right, bottom, left) -->  
          <hr color="blue">  
          <b>设置选项卡在底部显示 (可以是: top, right, bottom, left):</b>  
          <br>  
          <sx:tabbedpanel id="tab7" labelposition="bottom" cssStyle="width:200px;height:100px;" doLayout="true">  
             <sx:div label="Tab 1" >  
                 Local Tab 1 
             </sx:div>    
             <sx:div label="Tab 2" >  
                 Local Tab 2 
             </sx:div>    
          </sx:tabbedpanel>  
          
        <!-- 设置选项卡允许关闭,使用属性closeable -->  
          <hr color="blue">  
          <b>设置选项卡允许关闭,使用属性closeable:</b>  
          <br>         
          <sx:tabbedpanel id="tab8">  
             <sx:div label="Tab 1" >  
                 Local Tab 1 
             </sx:div>    
             <sx:div label="Tab 2"  closable="true">  
                 Local Tab 2 
             </sx:div>    
          </sx:tabbedpanel>  
 
     <br/>--------------------------------------------------------------<br/>  
     #、sx:textarea @textarea控件 <br/>  
     <sx:textarea label="简介" value="sx:textareasx:textareasx:<br/>textareasx:textareasx:textareasx:<br/>textareasx:textareasx:<br/>textareasx:textarea"></sx:textarea>  
       
     <br/>--------------------------------------------------------------<br/>  
     #、sx:tree @树控件 <br/>  
     <sx:tree id="tree1" label="根节点">  
       <sx:treenode id="tn1" label="财务部" />  
       <sx:treenode id="tn2" label="开发部">  
           <sx:treenode id="tn3" label="JAVA" />  
           <sx:treenode id="tn4" label=".NET" />  
       </sx:treenode>  
       <sx:treenode id="tn5" label="人事部" />  
    </sx:tree>  
       
</s:form>     
       
  </body>  
</html> 


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics