• 使用OGNL表达式


    OGNL表达式(#号的用法)

    用法1:访问OGNL上下文和Action上下文,#相当于ActionContext.getContext()

    1、如果访问其他Context中的对象,由于他们不是根对象,所以在访问时,需要添加#前缀

     

    2、  如果访问根对象(即ValueStack)中对象的属性,则可以省略#命名对象,直接访问该对象中的属性即可。

             对象栈中的元素是有顺序的,底层是ArrayList封装容器。使用ognl搜索顺序自上而下

    OGNL表达式%{}用法

    %符号的用途是在标签的属性值被理解为字符串类型时,高数执行环境%{}里的是OGNL表达式

    OGNL表达式${}形式用法:

             用在两个地方:

    一是在国际化资源文件中使用ognl表达式

    二是在struts2配置文件中使用ognl表达式

    例子:

    test.jsp:

     <body>
        测试值栈:<br/>
        <a href="${pageContext.request.contextPath }/ognl/ValueStackAction_test.do">test</a><br/>
        <br/>
        <br/>
        <br/>
        测试ognl表达式的用法:<br/>
        <a href="${pageContext.request.contextPath }/ognl/OgnlAction_test.do?cid=9">test</a><br/>
        
        测试标签<br/>
        <a href="${pageContext.request.contextPath }/ognl/OgnlTagAction_test.do?cid=9">test</a><br/>
      </body>

    OgnlAction.java:

    public class OgnlAction extends ActionSupport {
        private String cid;
        
        private String name="oname";
        
        private String sex="male";
        
        public String test(){
            System.out.println("OgnlAction ************ test()");
            
            HttpServletRequest req=ServletActionContext.getRequest();
            req.setAttribute("username", "request_username");
            
            Map<String,Object> sessionMap=ServletActionContext.getContext().getSession();
            sessionMap.put("username", "session_username");
            
            ServletContext application=ServletActionContext.getServletContext();
            application.setAttribute("username","application_username");
            
            ValueStack stack=ServletActionContext.getContext().getValueStack();
            stack.set("error", "error_valueStack");
            stack.set("msg", "msg_valueStack");
            
            stack.getRoot().add(0,new Person());
            stack.getRoot().add(new Employee());
            
            return "ognl";
        }
    
        public void setCid(String cid) {
            this.cid = cid;
        }
    
        public String getCid() {
            return cid;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        public String getSex() {
            return sex;
        }
    
    }

    ognlAction.jsp:

    <body>
       &lt;:ognl.jsp <br>
       使用EL表达式取值---------------------------------<br/>
       ${requestScope.username }<br/>
       ${sessionScope.username }<br/>
       ${applicationScope.username }<br/><br/><br/>
       使用Ognl表达式取值--------------------------------<br/>
       1 # 如果访问其他Context中的对象,由于他们不是根对象,所以在访问时,需要添加#前缀。<br/>
       <s:property value="#request.username"/><br/>
       <s:property value="#session.username"/><br/>
       <s:property value="#application.username"/><br/>
       <s:property value="#application['username']"/><br/>
       <s:property value="#parameters.cid[0]"/><br/>
       <s:property value="#attr.username"/><br/><br/>
       2 如果访问根对象(即ValueStack)中对象的属性,则可以省略#命名对象,直接访问该对象中的属性即可。<br/>
       <s:property value="cid"/><br/>
       <s:property value="error"/><br/>
       <s:property value="msg"/><br/><br/>
       深入理解ObjectStack<br/>
       对象栈中的元素是有顺序的,底层是ArrayList封装容器。使用ognl搜索顺序自上而下,搜索带了一个就返回<br/>
       <s:property value="name"/><br/> 
       <s:property value="sex"/><br/>
       <s:property value="age"/><br/>
       <s:property value="salary"/><br/>
             构造map:<br/>
          <s:radio name ="sex" list="#{'01':'男','02':'女'}"></s:radio> <br/><br/>  <!-- 这里一定要注意:必须给加上一个name属性或者id属性 -->
        
        %用法,告诉执行器里面是一个OGNL表达式(有的时候,执行器可能将""内的内容理解成字符串,这样就无法得到正确执行效果了,使用%{},有备无患。注意,无论什么表达式在struts2中使用这种形式都会被理解成ognl表达式):<br/>
        <s:property value="#request.username"/><br/> 
        <s:property value="%{#request.username}"/><br/> <br/>
        
        $有两个主要的用途<br/>
        用于国际化资源文件中,引用OGNL表达式<br/>
        
        <s:text name="ognl"></s:text><br/>
        
        在struts2配置文件中,引用OGNL表达式<br/>
        <s:property value="#parameters.msgxx[0]"></s:property><br/><br/>
        
        <s:debug></s:debug>
      </body>

    struts_ognl.xml:(这里使用了ognl表达式)

    <struts>
    
         <package name="ognl" namespace="/ognl" extends="struts-default">
            <action name="*_test" class="cn.itcast.ognl.{1}" method="test">
                <result name="ValueStack">/ognl/ValueStackAction.jsp</result>
                <result name="ognl">/ognl/ognlAction.jsp?msgxx=${msg}</result>
            </action>
        </package>
        
    </struts>

    国际化资源文件:

    resources.properties

    items.username=username
    items.psw=password
    items.login=login
    items.param=firstName:{0} lastName:{1}
    ognl=${error}_ognl

    resources_en_US.properties

    items.username=username_en
    items.psw=password_en
    items.login=login_en
    items.param=firstName_en:{0} lastName_en:{1}
    ognl=${error}_ognl_en

    resources_zh_CN.properties

    items.username=u7528u6237u540D
    items.psw=u5BC6u7801
    items.login=u767Bu5F55
    items.param=u59D3:{0} u540D:{1}
    ognl=${error}_u5BF9u8C61u56FEu5F62u5BFCu822Au8BEDu8A00

    总结一下:

    首先要理解好ognl的ValueStack概念。知道ognl存储的信息分为两个部分,一个是在context这个map里面,一个是在root这个集合里面。map里面存储了request--reuqest对应的map集合,session--session对应的map集合,application--对应的map集合,parameters--对应的map集合等。

    第一种用法:不使用{}.使用#与没有#的区别:

    注意一点:在struts2中ognl表达式需要在struts标签内使用。#表示的是context这个map,不使用#表示直接使用root中的元素,root中的元素是有序的。查找最先匹配的返回。例子上面有。

    第二种用法%{ognl表达式}:

    这个也没什么说的,就是为了防止执行器将ognl表达式当成普通的字符串加了一层保险,里面的ognl表达式其实是第一种的使用

    这里其实我前面一直有疑惑:

    怎么使用<s:property>标签输出字符串呢?毕竟执行器总是将我们的字符串想像成ognl,从第一种用法的时候就可以看出来。

    比如:输出你好,可以这样试试:

    <s:property value="%{'你好'}"/>

    第三种用法${ognl表达式}:

    只能在struts2配置文件或者国际化资源文件中使用,{}内内容就是第一种的使用

  • 相关阅读:
    HDU 1863 畅通工程(并查集)
    HDU 1232 畅通工程
    洛谷 1162 填涂颜色 (dfs,染色法)
    HDU 2689 sort it(树状数组 逆序数)
    mod_js.so下载 转自网络
    The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
    B计划 第七周
    B计划 第六周
    B计划 第五周
    B计划 第四周(开学第一周)
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/5900154.html
Copyright © 2020-2023  润新知