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

2 篇文章 0 订阅
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="http://free9277.blog.163.com/blog/upload.jsp">   
                     Remote Tab 1  
                </sx:div>   
             <sx:div label="Remote Tab 2" href="http://free9277.blog.163.com/blog/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="http://free9277.blog.163.com/blog/upload.jsp">   
                 Remote Tab 1  
             </sx:div>    
             <sx:div label="Remote Tab 2" href="http://free9277.blog.163.com/blog/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="http://free9277.blog.163.com/blog/upload.jsp" refreshOnShow="true">   
                 Remote Tab 1  
             </sx:div>    
             <sx:div label="Remote Tab 2" href="http://free9277.blog.163.com/blog/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>
  • 0
    点赞
  • 0
    收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值