使用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配置文件或者国际化资源文件中使用,{}内内容就是第一种的使用

原文地址:https://www.cnblogs.com/aigeileshei/p/5900154.html