学习笔记---Ognl表达式和struts2的Ui

本文详细介绍了Struts2框架中OGNL表达式和UI标签的应用,包括debug、property、iterator、if等标签的功能及使用方法,以及如何在页面中实现奇偶行变色效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ognl表达式:
    专门是负责从值栈中取出数据的表达式。


    只要需要在jsp中声明包即可使用:
      <%@ taglib url="/struts-tags" prefix="s"%>
      1:<s:debug>显示值栈的所有数据信息。

    输出值栈结构
      说明:s:debug对象栈中显示的数据来自于getXxx方法
          把getXxx的"get"去掉,把剩余的第一个字母变成小写xxx
          把返回值作为value值,返回到s:debug中,所以action中请求的方法
          最好别以get方法开头
 
 
 2:<s:property   value="*或(#*)">标签:输出栈中指定信息显示到页面上
     map栈的访问:
        说明:
        访问OGNL上下文和action上下文,#相当于ActionContext.getContext();
    
        如果访问的是map中的值而不是对象栈中的值,由于map中的数据不是根对象,所以在访问时需要添加#前缀。

        例子:
            名称                 作用                             例子:
             parameters        包含当前HTTP请求的Map             #parameters.id[0]=request.getParameter(“id”)

         request     包含当前HttpServletRequest属性的Map     #request.username=request.getAttribute(“username”);

         session      包含当前HttpSession属性的Map           #session.username=session.getAttribute(“username”);

           application   包含当前ServletContext属性的Map         #application.username=application.getAttribute(“username”);
             
        **  attr      用于按照request>session>application顺序访问其属性 ---》#attr.username相当于按照顺序在以上三个范围内读取username的属性,直到找到为止。

            注:也可以写为#request[‘username’]  #sesssion[‘username’]  #application[‘username’]
                                                                

       

    对象栈:
        1、把一个对象放入到对象栈中,其属性可以直接访问
        Person person = new Person();
        person.setDescription("帅");
        person.setName("王武");
        ActionContext.getContext().getValueStack().push(person);


           在页面中:<s:property value="name"/>即可访问person.name;

          原因是该属性直接暴漏出来了,所以可以直接访问。
        
         2、如果在对象栈中出现好几个相同的属性,从栈顶往下找,找到为止
        
        3、把一个map放入到对象栈,直接访问其key值就可以了
        
        4、把String放入到对象栈的栈顶,可以利用<s:property/>访问,
            因为该标签如果不写value属性,默认访问栈顶的元素





标签:
   1、s:debug
      如果把该标签放入到s:iterator中可以看到当前正在迭代的元素的状态
   2、s:property
      1、输出
      2、value属性:值能直接跟ognl表达式
      3、如果value属性不写,则默认输出栈顶的元素
 
   
  3:s:iterator标签
      1、iterator迭代Collection,Map,Object[],还可以以组合的形式迭代
      
      2、当前正在迭代的元素在栈顶
      
      3、如果value属性不写,则默认迭代栈顶的元素
      
      4、如果迭代的是map元素,当前正在迭代的元素是Entry<key,value>,这个时候key和value是对象栈
         中的属性
     
      5、var属性,var='aa'相当于给当前正在迭代的元素在map栈又存放了一次,key值为aa
      
      6、status属性,可以获取当前正在迭代的元素所在行的信息count,index,odd,event、end,first,step属性
                Count() 返回当前迭代的元素个数
                Index() 返回当前迭代元素的索引
                Even() 返回当前迭代元素的索引是否是偶数
                Odd()  返回当前迭代元素的索引是否是奇数
                First()  返回当前迭代元素是否为第一个元素
                Last()  返回当前迭代元素是否为最后一个元素
 
   4、s:if  s:elseif
       注意:使用该标签不能使用单个字符用==进行判断

            使用equals判断。

           <s:if test="name=='1'">这种写法不对,程序会报错。

            <s:if test="name=='a'">这种写法不对,程序会报错


    例:
    在action中将map存放在map栈中:

    Map map = new HashMap<String,Person>();
        Person person = new Person();
        person.setDescription("帅");
        person.setName("王武");
        map.put("person", person);
        ActionContext.getContext().put("map", map);
        return "index";



    <s:iterator value="#map">
        <s:property value="key"/>//输出key的值
         <s:property value="value.name"/>//输出person的name的值
     </s:iterator>


    在页面中迭代map  取出的结果会在栈顶,属性暴露,所以可以直接在value中写key或value。
    而value代表的是person,所以可以直接value.name来获取person的属性。

    当迭代的结果还是一个集合的话,内部嵌套<s:iterator>标签即可。有多少层嵌套多少次,
    原理不变,记住当前迭代的对象在栈顶,并且迭代之后会弹出这个原理即可。



    综合案例在页面中实现奇偶行变色的效果:
    
    利用iterator的status属性完成隔行变色:<br>
<a
href="${pageContext.request.contextPath}/ognl/ognlTagAction_testList6.action">测试</a><br>
OgnlTagAction
/*
     *    利用iterator的status属性完成表格的隔行变色
     */
    public String testList6(){
        ServletActionContext.getRequest().setAttribute("request_username", "username");
        List<Person> personList = new ArrayList<Person>();
        for(int i=0;i<10;i++){
            Person person = new Person();
            person.setPid(i);
            person.setPname("person"+i);
            person.setComment("person"+i);
            personList.add(person);
        }
        ActionContext.getContext().put("personList", personList);
        return "ognlList6";
    }
successOgnlTag.jsp



<style type="text/css">
          .odd{
              background-color:red;
          }
          .even{
              background-color:blue;
          }
  </style>




UI标签

    Html有的UI标签 struts2的UI也都支持,只是在之前加个s即可操作。
    1、在struts.xml文件中,加入:
     <constant name="struts.ui.theme" value="simple"/>

    struts2解析标签的时候不会自动添加table,tr,td等元素.

   

   2、回显
    1、如果数据在map栈中,则直接根据value的属性进行回显
    2、如果数据在对象栈中,直接根据name的属性进行回显

    在回显的时候只要将数据放入对象栈即可,不用非得放入到栈顶。

    回显的时候在password的时候不会显示密码,只要在标签中声明:showpassword="true"即可。


    ognl表达式的标签显示数据:
    
    下面的标签的value属性能直接跟ognl表达式
           s:property
           s:if
           s:iterator
           s:select list属性直接跟ognl表达式
    
    下面的标签的value属性不能直接跟ognl表达式
           s:testfiled
           s:password
           s:textarea
           value="%{ognl表达式}"   

           value加%{#*} 在字符串中使用ognl表达式。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值