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學習三(OGNL和ValueStack值棧)
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. 什麼是單執行緒
【Struts2(三)】OGNL表示式與值棧
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
跨域講解學習三(服務器Nginx和Apache配置)
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面試學習1(io和nio)
left bsp ont apt 字符流 屏幕 但是 buffer 讀取 一、io流(一次從open到底層的操作) 輸入和輸出流 IO流 字節流 Reader、Writer 字符流 InputStream、OutputStream 字節流:可以處理
C#(KeyChar和KeyCord值,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)+