1. 程式人生 > >struts2學習三(OGNL和ValueStack值棧)

struts2學習三(OGNL和ValueStack值棧)

1、OGNL

OGNL(Object-Graph Navigation Language),它是一種功能強大的表示式語言,比EL更強大的表示式語言(開源)。struts整合OGNL表示式。使用OGNL作為預設的表示式語言。

主要功能:
1、存取物件的屬性,呼叫物件的方法
2、操作集合
3、直接new物件
4、訪問OGNL上下文(OGNL context和ActionContext);

1、在root中的示例

public class TestOGNL {

    @Test
    public void test1() throws OgnlException {
        // 1、執行物件的方法
Object o = Ognl.getValue("'abc'.toUpperCase()", null); System.out.println(o); // 輸出結果:ABC } @Test public void test2() throws OgnlException { // 2、靜態資源的訪問 Ognl.getValue("@[email protected](@[email protected])", new HashMap(), new
Object()); System.out.println(Math.PI); // 輸出結果:3.141592653589793 } @Test public void test3() throws OgnlException{ //1、獲取root屬性值,直接使用物件的名稱獲取 User user =new User("abc","123"); Object o=Ognl.getValue("username", new HashMap(),user); System.out.println(o); //輸出結果:abc
} @Test public void test4() throws OgnlException{ //2、獲取root屬性值,如果存放的是map,直接通過key獲取 Map<String,String> map =new HashMap<String,String>(); map.put("a", "aaaaa"); map.put("b", "bbbbb"); map.put("c", "ccccc"); Object o=Ognl.getValue("a",new HashMap(),map); System.out.println(o); //執行結果:aaaaa }

2、在context中的操作

    @Test
    public void test1() throws OgnlException {
        //1、獲取contxt中的值
       Map<String,String> map=new HashMap<String,String>();
       map.put("a", "aaa");
       Object o=Ognl.getValue("#a", map,new Object());
       System.out.println(o);
       //執行結果:aaa    
    }

3、賦值

    @Test
    public void test2() throws OgnlException {
        // 賦值
        User user = new User();
        Ognl.getValue("username='tom'", new HashMap(), user);
        System.out.println(user);
        //執行結果:User [username=tom, password=null]
    }

4、投影(過濾)

OGNL中的投影說的通俗一點就是過濾,目的就是在結果中選擇滿族條件的結果顯示出來

@Test
    public void demo4() throws OgnlException{
        // #12過濾:對集合,進一步的操作,可以給遍歷的集合新增過濾條件
        // 語法:集合.{符號 過濾表示式}
        // 符號:? 所有, ^ 第一個 , $ 最後一個
        List<User> list = new ArrayList<User>();
        list.add(new User("jack","1"));
        list.add(new User("rose","2"));
        list.add(new User("tom","3"));
        list.add(new User("cat","4"));

        // 當前物件
        Object val = Ognl.getValue("#this", new HashMap(), list);
        System.out.println(val);
        // 當前物件 -- 第一個
        Object val2 = Ognl.getValue("#this.{^#this}", new HashMap(), list);
        System.out.println(val2);

        // 當前物件 -- 所有內容,新增條件
        Object val3 = Ognl.getValue("#this.{?#this.userPwd > 2}", new HashMap(), list);
        System.out.println(val3);
    }

2、ValueStack值棧

這裡寫圖片描述
1、struts在action中存放資料,在jsp中顯示資料。struts有兩個地方儲存資料:root和context;

root:底層是ArrayList,用於存放沒有名稱的資料。也稱為值棧
context:底層是Map,給存放在map中每一個物件進行命名。

2、ValueStack(值棧): 貫穿整個 Action 的生命週期(每個 Action 類的物件例項都擁有一個ValueStack 物件,每次請求都會建立一個Action類)。請求完成後ValueStack與request將一起消失。
ValueStack相當於一個數據的中轉站. 在其中儲存當前Action 物件和其他相關物件.

3、ValueStack實際是一個介面,在Struts2中利用OGNL時,實際上使用的是實現了該介面的OgnlValueStack類,這個類是Struts2利用OGNL的基礎

Struts 框架把 ValueStack 物件儲存在名為 “struts.valueStack” 的請求屬性中,request中
ServletActionContext類中提供了一個常量
public static final String STRUTS_VALUESTACK_KEY = “struts.valueStack”;

4、在 ValueStack 物件的內部有兩個邏輯部分:
ObjectStack: Struts 把動作和相關物件壓入 ObjectStack中,底層實現物件為CompoundRoot, CompoundRoot是一個ArrayList
ContextMap: Struts 把各種各樣的對映關係(一些 Map 型別的物件) 壓入 ContextMap 中。底層為Map
對值棧的操作,預設都是Root物件的操作,訪問資料時不需要使用#號

原始碼如下:

public class CompoundRoot extends ArrayList {

    public CompoundRoot() {
    }

    public CompoundRoot(List list) {
        super(list);
    }


    public CompoundRoot cutStack(int index) {
        return new CompoundRoot(subList(index, size()));
    }

    public Object peek() {
        return get(0);
    }

    public Object pop() {
        return remove(0);
    }

    public void push(Object o) {
        add(0, o);
    }
}

5、Struts 會把下面這些對映壓入 ContextMap 中,獲取時間是需要使用#號
parameters: 該 Map 中包含當前請求的請求引數
request: 該 Map 中包含當前 request 物件中的所有屬性
session: 該 Map 中包含當前 session 物件中的所有屬性
application:該 Map 中包含當前 application 物件中的所有屬性
attr: 該 Map 按如下順序來檢索某個屬性: request, session, application

demo1
1、bean類和action類

package com.example.stack;

public class User {
    private String username;
    private String password;

    public User(String username, String password) {
        super();
        this.username = username;
        this.password = password;
    }

    public User() {
        // TODO Auto-generated constructor stub
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User [username=" + username + ", password=" + password + "]";
    }

}

action類

package com.example.stack;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;

public class ActionValueStack1 extends ActionSupport {

    @Override
    public String execute() throws Exception {

        // 1 獲得值棧(root)
        // 方式1: 從request作用域獲得
        ValueStack valueStack = (ValueStack) ServletActionContext.getRequest()
                .getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
        // 方式2:通過context獲得
        ValueStack valueStack2 = ActionContext.getContext().getValueStack();
        valueStack2.getContext();

        // 2 獲得context
        ActionContext actionContext = ActionContext.getContext();
        // 3 root操作
        // 3將指定的資料壓入到棧頂,注意:一般情壓入的javabean物件。jsp頁面通過“屬性”獲得
        valueStack2.push(new User("tom", "1234"));

        return SUCCESS;
    }
}

2、struts.xml檔案配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <!-- 開發模式 -->
    <constant name="struts.devMode" value="true" />
    <!-- 包 -->
    <package name="day03" namespace="/" extends="struts-default">   
        <action name="actionValueStack1" class="com.example.stack.ActionValueStack1">
            <result name="success">/a/success.jsp</result>
        </action>

    </package>

</struts>

3、訪問form.jsp和success.jsp

 <body>
  <a href="${pageContext.request.contextPath}/actionValueStack1">使用值棧</a><br/>
</body>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <s:property value="username"/>
</body>
</html>

4、struts中的#,$,%

“#”:表示從context中獲取靈氣
%{}:表示使用ONGL解析
%{”}不使用ONGL解析,只是普通字串

相關推薦

struts2學習OGNLValueStack

1、OGNL OGNL(Object-Graph Navigation Language),它是一種功能強大的表示式語言,比EL更強大的表示式語言(開源)。struts整合OGNL表示式。使用OGNL作為預設的表示式語言。 主要功能: 1、存取物件的屬性,

ssh框架Struts2 OGNL框架

主要內容 1. OGNL表示式(瞭解) 2. Struts2框架的值棧(值棧、存入值、取值) 3. OGNL的特殊符號 OGNL表示式概述 1. OGNL是Object Graphic Navigation Language(物件圖導航語言)的縮寫

spring學習總結——高階裝配學習執行時:注入

  前言:   當討論依賴注入的時候,我們通常所討論的是將一個bean引用注入到另一個bean的屬性或構造器引數中。bean裝配的另外一個方面指的是將一個值注入到bean的屬性或者構造器引數中。在沒有學習使用怎麼注入外部值時,我們正常是直接將值寫死在程式碼中。如將專輯的名字裝配到BlankDis

MongoDB 學習資料庫的增刪改查

接昨天的內容學習,首先做一個回顧: 開始今天的內容: 1、刪除文件資料 昨天說過刪除文件的方法,今天補充幾點: db.persons.remove({name:"fanhu"})  //刪除當前資料文件中包含這條內容的資料,_id 一塊被刪除。 db.persons.re

JS三座大山再學習(、非同步單執行緒

本文已釋出在西瓜君的個人部落格,原文傳送門 前言 寫這一篇的時候,西瓜君查閱了很多資料和文章,但是相當多的文章寫的都很簡單,甚至互相之間有矛盾,這讓我很困擾;同時也讓我堅定了要寫出一篇好的關於JS非同步、單執行緒、事件迴圈的文章,下面,讓我們一起來學習本文吧,衝鴨~~ 單執行緒 ### 1. 什麼是單執行緒

Struts2OGNL表示式與

1.2 相關知識點 1.2.1 什麼是OGNL OGNL:物件圖導航語言,比EL表示式強大很多倍的語言。       EL:從域物件中獲取資料,從EL的11個物件中獲取。${name}${pageContextPath}   &nbs

Struts2學習———— ognl表示式、、actionContext之間的關係

一、什麼是Ognl?       通過百度百科查詢到的解釋,其中詳細的說明了OGNL的作用。                  下面我們就對OGNL這5個作用進行講解       1、存取物件的任意屬性,簡單說就是對javabean進行操作(重要)       2、呼叫物件方法。       3、

mysql學習天練習日期時間函數

日期和時間 標準 學習第三天 入職 extract 時間 日期 如果 sys -- 日期和時間函數 -- 獲取當前日期 select curdate(),current_date() from dual -- 返回服務器當前的日期和時間 select NOW(),SYSD

跨域講解學習服務器NginxApache配置

ati 服務器 json servle imp return 進行 xtra alt 問題一、什麽是虛擬主機?   多個域名指向同一個服務器,服務器根據不同的域名把請求轉到不同的應用服務器。 問題二、什麽是反向代理?   反向代理方式是指以代理服務器來接受internet上

struts2學習筆記—— struts2的常見配置

一、配置檔案的載入順序   每次從客戶端傳送請求到伺服器都要先經過Struts2的核心過濾器StrutsPrepareAndExecuteFilter,這個過濾器有兩個功能:預處理和執行。在預處理中主要就是來載入配置檔案的。對應的是過濾器中的init方法,而執行是用來執行一組攔截器完成部分功能的,對應的是過

struts2學習筆記—— 在使用者註冊程式中使用驗證框架

package register.dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java

Struts2學習----------Action搜索順序

round col uil 1-1 earch sch 預覽 image pin ? 版權聲明:本文為博主原創文章,轉載請註明出處 Struts2的Action的搜索順序   http://localhost:8080/path1/path2/student.action

struts2學習筆記8-------struts2的ajax支持

net fcm utf-8 asc uri () nal extends keyword struts2支持一種stream類型的Result,這樣的類型的Result能夠直接向client瀏覽器響應二進制,文本等。 我們能夠再

JSP的學習中文亂碼

使用 cal cto con ebo char tom har 信息 1). 在 JSP 頁面上輸入中文, 請求頁面後不出現亂碼:   保證 contentType="text/html; charset=UTF-8",   pageEncoding="UTF-8" c

Struts2學習筆記1---相關配置

XML def rec 模塊 定向 -1 開發 oba 合並 Struts 2是Struts的下一代產品,是在 struts 1和WebWork的技術基礎上進行了合並的全新的Struts 2框架。 1創建action對象(三種) 1 創建普通的類,不繼承任何類,也不

solr學習測試類,含普通與ExtractingRequestHandler測試

list clas map ber -h div comment test bst solr客戶端基本是配置出來的,服務端可以對其進行測試,我使用的是solrj服務端。 如果初學solr,先使用普通的測試類: Java代碼 import java.io.IO

jquery學習之初始化獲取

pan AS jquery UNC function jquery對象 加載 就會 獲取值 jquery在運行的時候 在界面加載完之後再加載jquery對象,jquery加載的元素就會被加載出來 $(document).ready(function(){  //這裏填寫需

vivo面試學習1ionio

left bsp ont apt 字符流 屏幕 但是 buffer 讀取 一、io流(一次從open到底層的操作) 輸入和輸出流 IO流 字節流 Reader、Writer 字符流 InputStream、OutputStream 字節流:可以處理

C#KeyCharKeyCord,KeyDown/KeyPress事件區別

reg form asp sage nump preview vision blog prior 1. 首先將窗口屬性KeyPreview設為true,如果屬性對話框中找不到,就直接在代碼裏添加;2. 添加KeyPress / KeyDown事件:KeyPress 和Key

struts2學習筆記:ognl

1、OGNL 什麼是ognl? 1.1OGNL的全稱是Object Graph Navigation Language(物件圖導航語言),它是一種強大的表示式語言 1.2 OgnlContext(ongl上下文)其實就是Map (教室、老師、學生) OgnlContext=根物件(1)+