免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Ognl表達式基本原理和使用方法

1.Ognl表達式語言

1.1.概述

OGNL表達式
OGNL是Object Graphic Navigation Language(對象圖導(dǎo)航語言)的縮寫,他是一個開源項目。Struts框架使用OGNL作為默認的表達式語言。
OGNL優(yōu)勢

  • 支持對象方法調(diào)用,如:×××.doSomeSpecial();
  • 支持類靜態(tài)的方法調(diào)用和值訪問,表達式的格式

    @[類全名(包括包路徑)]@[方法名 |  值名],例如:
    @java.lang.String@format('foo %s', 'bar')
    或@tutorial.MyConstant@APP_NAME;

  • 支持賦值操作和表達式串聯(lián),

    如price=100, discount=0.8,calculatePrice(),這個表達式會返回80;

  • 訪問OGNL上下文(OGNL context)和ActionContext;
  • 操作(創(chuàng)建)集合對象。

總結(jié):OGNL 有一個上下文(Context)概念,說白了上下文就是一個MAP結(jié)構(gòu),它實現(xiàn)了java.utils.Map 的接口。

Struts框架默認就支持Ognl表達式語言。(從struts項目必須引入ognl.jar包可以看出)

Ognl表達式語言的作用:

  • jsp頁面取值用
  • EL表達式語言,也用于頁面取值,是jsp頁面取值的標準(默認就可以使用)
  • Ognl表達式語言,Struts標簽?zāi)J支持的表達式語言,必須配置Struts標簽用,不能離開Struts標簽直接使用,就是說Ognl必須在Struts中使用
  • 對比來看,EL使用范圍更廣,項目中不限制使用哪一種,哪一種熟悉就使用哪一種

1.2.OgnlContext對象(了解)

OgnlContext對象是ognl表達式語言的核心。
但是項目中不會要求寫OgnlContext的代碼,Ognl標簽其實是調(diào)用了OgnlContext對象。所以只做了解即可。

OgnlContext對象在源碼中實現(xiàn)了Map接口:
public class OgnlContext implements Map {……}

Ognl表達式語言取值,也是用java代碼取值的,原理就是使用OgnlContext和Ognl這兩個類,只需要記住,Ognl取根元素不用#號,取非根元素要使用#號

OgnlContext類
硬編碼方式,了解OgnlContext對象,因為OgnlContext對象實現(xiàn)是Map接口,所有OgnlContext本質(zhì)就是一個Map,可以使用map方法:

OgnlContext context = new OgnlContext();
context.put("uesr",user);
context.put("address",address);
context.setRoot(address);

Ognl類
Ognl類也是Ognl底層運行的代碼,常用的api如下:

Object obj1 = Ognl.parseExpression(“country”); 解析ognl表達式
Ognl.getValue(obj1, context, context.getRoot()); 獲取ognl的表達式值,obj1是上面一個api,其他兩個分別是創(chuàng)建的上下文對象以及一個不用修改的參數(shù)
Object obj2 = Ognl.parseExpression(“l(fā)anguage.toUpperCase()”); 方法調(diào)用
Object obj3 = Ognl.parseExpression("@java.lang.Integer@toBinaryString(10)");等同于上面
Object obj4 = Ognl.parseExpression(“@@min(10,4)”); Math類的方法直接調(diào)用,靜態(tài)方法的調(diào)用

代碼示例如下:

package o_ognl;import ognl.Ognl;import ognl.OgnlContext;import ognl.OgnlException;import org.junit.Test;/** * OgnlContext用法 * 1.使用Ognl表達式語言取值,如果取非根元素的值,必須用#號 * 2.使用Ognl表達式語言取值,如果取根元素的值,不用#號 * 3.Ognl可以調(diào)用靜態(tài)方法 */public class OgnlDemo {    //非根元素    @Test    public void testOgnl1() throws OgnlException {        //創(chuàng)建一個Ognl上下文對象        OgnlContext context = new OgnlContext();        /**         * 1.OgnlContext放入基本變量數(shù)據(jù)         */        //放入數(shù)據(jù)        context.put("cn","China");        //獲取數(shù)據(jù)(map)        String value = (String)context.get("cn");        System.out.println(value);        /**         * 2.OgnlContext放入對象數(shù)據(jù)         */        //創(chuàng)建對象,設(shè)置對象屬性        User user = new User();        user.setId(100);        user.setName("Jack");        //【往非根元素放入數(shù)據(jù),取值的時候表達式要用“#”】        context.put("user",user);        //獲取對象屬性        //使用這種方式也可以獲取        Object s = context.get("user");        System.out.println(s);        //使用Ognl表達式來獲取        //舉例:例如標簽<s:a value="#user.id">取值,實際上就是運行了下面的代碼獲取的        //先構(gòu)建一個Ognl表達式,再解析表達式        Object ognl = Ognl.parseExpression("#user.id");//構(gòu)建Ognl表達式        Object value1 = Ognl.getValue(ognl, context, context.getRoot());//解析表達式        System.out.println(value1);        User user1 = new User();        user1.setId(100);        user1.setName("Jack");        context.setRoot(user1);        Object ognl1 = Ognl.parseExpression("id");//構(gòu)建Ognl表達式        Object value2 = Ognl.getValue(ognl1, context, context.getRoot());//解析表達式        System.out.println(value2);    }    //根元素,    @Test    public void testOgnl2() throws OgnlException {        OgnlContext context = new OgnlContext();        User user1 = new User();        user1.setId(100);        user1.setName("Jack");        context.setRoot(user1);        //根元素直接使用id,不需要加#號        Object ognl1 = Ognl.parseExpression("id");//構(gòu)建Ognl表達式        Object value2 = Ognl.getValue(ognl1, context, context.getRoot());//解析表達式        System.out.println(value2);    }    //ognl對靜態(tài)方法調(diào)用的支持    @Test    public void testOgnl3() throws Exception{        //創(chuàng)建一個Ognl上下文對象        OgnlContext context = new OgnlContext();        //Ognl表達式語言,調(diào)用類的靜態(tài)方法//        Object ognl = Ognl.parseExpression("@Math@floor(10.9)");        //由于Math類在開發(fā)中比較常用,所有也可以這樣寫        Object ognl = Ognl.parseExpression("@@floor(10.9)");        Object value = Ognl.getValue(ognl, context, context.getRoot());        System.out.println(value);    }}

1.3.ValueStack對象

1.ValueStack即值棧對象
ValueStack實際是一個接口,在Struts2中利用Ognl時,實際上使用的是實現(xiàn)了該接口的OgnlValueStack類,這個類是Struts2利用Ognl的基礎(chǔ)

2.ValueStack特點
ValueStack貫穿整個Action的生命周期(每個Action類的對象實例都擁有一個ValueStack對象),即用戶每次訪問struts的action,都會創(chuàng)建一個Action對象、值棧對象、ActionContext對象,然后把Action對象放入值棧中;最后再把值棧對象放入request中,傳入jsp頁面。相當于一個數(shù)據(jù)的中轉(zhuǎn)站,在其中保存當前Action對象和其他相關(guān)對象。Struts2框架把ValueStack對象保存在名為“struts。valueStack”的request請求屬性中。

3.ValueStack存儲對象

代碼調(diào)試的時候,發(fā)現(xiàn)有一個root是compundRoot類,繼承ArrayList,保存的是action對象;還有一個OgnlContext是繼承Map,保存數(shù)據(jù)。
所以ValueStack存儲對象時是分兩個地方來存的,也即ValueStack對象的組成是由List棧和Map棧構(gòu)成的:
ObjectStack:Struts把根元素,即action對象及全局屬性存入ObjectStack中---List

list棧主要存儲:action對象,Map對象(通過vs.set()設(shè)置),通過push方法設(shè)置的對象,以及其他代理對象

根元素的存儲示例:

        //存儲值棧對象        ActionContext ac = ActionContext.getContext();                ValueStack vs = ac.getValueStack();        vs.set("user1",new User(100,"Jack1"));//Map        vs.push(new User(100,"Jack2"));//棧頂

ContextMap:Struts把各種各樣的映射關(guān)系(域數(shù)據(jù))存入ContextMap中
Struts會把下面這些映射存入ContextMap中:

  • parameter:該Map中包含當前請求的請求參數(shù)
  • request:該Map中包含當前request對象中的所有屬性
  • Session:該Map中包含當前Session對象中的所有屬性
  • application:該Map中包含當前application對象中的所有屬性
  • attr:該Map按如下順序來檢索某個屬性:request,Session,application
    非根元素Map中存放數(shù)據(jù)的方法示例:
        //存儲值棧對象        ActionContext ac = ActionContext.getContext();                //映射數(shù)據(jù)        ac.getContextMap().put("request_data", "request_data");        ac.getSession().put("session_data", "session_data");        ac.getApplication().put("application_data","application_data");

從棧中取值的兩種方式:

    //一、獲取值棧對象的兩種方式,是等價的    public void getVs() {        //獲取值棧對象,方式1:        HttpServletRequest request = ServletActionContext.getRequest();        ValueStack vs1 = (ValueStack) request.getAttribute("struts.valueStack");        /**************************************************/        //獲取值棧對象,方式2:        ActionContext ac = ActionContext.getContext();        ValueStack vs2 = ac.getValueStack();        System.out.println(vs1==vs2);//true    }

在jsp頁面中,對不同ValueStack中的不同類型取值方法不同,
如果是根元素取值,直接寫表達式;
非根元素(request,Session,application,att,parmeters)必須用#號,例#request.cn

1.4.JSP頁面中獲取ValueStack數(shù)據(jù)

<%@taglib prefix="s" uri="/struts-tags" %><%@ page contentType="text/html;charset=UTF-8" language="java" %><html>  <head>    <title>jsp頁面取值</title>  </head>  <body>index頁面<%--頁面,必須要拿到ValueStack--%><%--struts的調(diào)試標簽,可以觀測值棧數(shù)據(jù)--%><s:debug/><br/>1.取根元素的值<br/>  <s:property value="user.id"/>  <s:property value="user.name"/><br/>2.取非根元素<br/>  <s:property value="#request.cn"/>  <s:property value="#request.request_data"/>  <s:property value="#session.session_data"/>  <s:property value="#application.application_data"/><br/><%--attr按順序自動找request/session/application,找到后立刻返回--%>  <s:property value="#attr.application_data"/><%--獲取請求參數(shù)數(shù)據(jù)--%>  <s:property value="#parameters.userName"/>  </body></html>

2.Struts標簽

struts標簽取值,就使用到ognl表達式語言。

2.1.Ognl使用方式

1.4.中使用的就是Ognl表達式取值。使用方式是:
1.引入<%@taglib prefix="s" uri="/struts-tags" %>
2.使用 <s:property value="user.name"/>標簽獲取取值,取值的時候要注意根元素(全局變量)不用#號,其他的都用#號

還有一些標簽需要學(xué)習(xí):

2.2.迭代標簽

Iterator:標簽用于對集合進行迭代,這里的集合包含List,Set和數(shù)組

  • value:可選屬性,指定被迭代的集合,如果沒有設(shè)置該屬性,則使用ValueStack棧頂?shù)募稀?/li>
  • var:可選屬性,引用變量的名稱
  • status:可選屬性,該屬性指定迭代是的IteratorStatus實例,該實例包含一下一個方法;

    int getCount(),返回當前迭代了幾個元素
    int getIndex(),返回當前迭代元素的索引
    boolean isEven(),返回當前迭代元素的索引是否是偶數(shù)
    boolean isOdd(),返回當前迭代元素的索引是否是奇數(shù)
    boolean isFirst(),返回當前迭代元素是否是第一個元素
    boolean isLast(),返回當前迭代元素是否是最后一個元素

代碼示例:

  <br/>1.list迭代<br/><s:iterator var="user" value="#request.list" status="st">  <s:property value="#user.id"/>  <s:property value="#user.name"/>  <s:property value="#st.even"/><br/></s:iterator>  <br/>2.map迭代<br/>  <s:iterator var="en" value="#request.map" status="st">      <s:property value="#en.key"/>      <s:property value="#en.value.name"/>  </s:iterator>

2.3.Ognl動態(tài)建立集合

<%--Ognl表達式可以取值,也可以構(gòu)建動態(tài)集合--%>  <br/>1.構(gòu)建list集合<br/>  <s:iterator var="str" value="{'a','b','c'}">      <s:property value="#str"/>  </s:iterator>  <br/>2.構(gòu)建map集合<br/>  <s:iterator var="en" value="#{'cn':'China','usa':'America'}">      <s:property value="en.key"/>      <s:property value="en.value"/><br/>  </s:iterator>

2.4.簡單UI標簽

<%@taglib prefix="s" uri="/struts-tags" %><%--服務(wù)器標簽:最終被解析為html標簽--%><s:form action="/user_login" method="POST" name="frmLogin">    <s:textfield name="user.userName" label="用戶名"/>    <s:textfield name="user.pwd" label="密碼"/>    <s:submit value="登錄"/></s:form>

也可以給form指定主題,方法如下:

<!-- 服務(wù)器標簽 : 最終別解析為html標簽-->    <s:form action="/user_login" method="post" name="frmLogin" id="frmLogin" theme="simple">                用戶名:<s:textfield name="user.name"></s:textfield>        密碼:<s:textfield name="user.pwd"></s:textfield>        <s:submit value="登陸"></s:submit>    </s:form>

注意:
給form指定主題,form下所有的表單元素都應(yīng)用此主題

對Struts標簽?zāi)J的主題樣式:default.xml/struts.ui.theme=xhtml
可以通過常量修改,改為簡單主題:

<!-- 修改主題 (當前項目所有的標簽都用此主題)-->    <constant name="struts.ui.theme" value="simple"></constant>

2.5.Ognl表達式語言幾個符號

:獲取非根元素,動態(tài)創(chuàng)建map集合

$:配置文件取值
%:提供一個ognl表達式運行環(huán)境

<body>     <br/>獲取request域數(shù)據(jù)<br/>     <!-- property 標簽是對象類型的標簽,默認支持ognl表達式, 會從根元素去China名稱對應(yīng)的值 -->     <s:property value="China"/>        <br/>     <!-- 如果直接賦值,需要用單引號 -->     <s:property value="'China'"/>      <br/>     <s:property value="%{#request.cn}"/>       <br/>          <!-- 值類型的標簽,value值默認就是值類型,不支持ognl表達式 -->     國家:<s:textfield name="txtCountry" value="%{#request.cn}"></s:textfield>  </body>
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Struts2_ValueStack, OGNL詳解
Struts2值棧隨筆
struts2中ognl表達式 各種合集
Struts2 ONGL表達式
ognl
struts2 OGNL詳解
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服