Struts2 值棧/OGNL

2022-07-08 11:34 更新

值棧是一組對象,按照提供的順序存儲以下這些對象:

序號對象和說明
1Temporary對象

實際中存在各種在頁面執(zhí)行期間創(chuàng)建的temporary對象。例如,JSP標簽循環(huán)集合的當(dāng)前迭代值。

2Model對象

如果在struts應(yīng)用程序中使用Model對象,則當(dāng)前Model對象放在值堆棧上的action之前。

3Action對象

這是指正在執(zhí)行的當(dāng)前action對象。

4命名對象

這些對象包括#application,#session,#request,#attr和#parameters以及所引用的相應(yīng)的servlet作用域。

值棧可以通過為JSP,Velocity或Freemarker提供的標簽進行訪問。我們將在單獨的章節(jié)中學(xué)習(xí)到用于獲取和設(shè)置struts2 值棧的各種標簽。你可以在action中獲取值棧對象,如下所示:

ActionContext.getContext().getValueStack()

一旦你有一個值棧對象,你可以使用以下方法來操縱該對象:

序號值棧方法和說明
1Object findValue(String expr)

通過在默認搜索順序中對值棧評估所給定的表達式來查找值。

2CompoundRoot getRoot()

獲取將對象推入值棧的CompoundRoot。

3Object peek()

獲取值棧頂部的對象而不改變值棧。

4Object pop()

獲取值棧頂部的對象,并將其從值棧中刪除。

5void push(Object o)

將對象放在值棧的頂部。

6void set(String key,Object o)

使用給定的key在值棧上設(shè)置一個對象,使其可通過findValue(key,...)檢索。

7void setDefaultType(Class defaultType)

設(shè)置在獲取值時要轉(zhuǎn)換的默認類型。

8void setValue(String expr,Object value)

嘗試使用由默認搜索順序給定的表達式在值棧的bean上設(shè)置屬性。

9int size()

獲取值棧中的對象數(shù)。

OGNL

OGNL

(Object-Graph Navigation Language,對象圖導(dǎo)航語言)是一種強大的表達式語言,用于引用和操作值棧上的數(shù)據(jù),還可用于數(shù)據(jù)傳輸和類型轉(zhuǎn)換。


OGNL非常類似于JSP表達式語言。OGNL基于上下文中存有根對象或默認對象的理念,使用標記符號(即#號)來引用默認或根對象的屬性。


如前面所述,OGNL是基于上下文的,而Struts構(gòu)建了一個ActionContext映射以供OGNL使用。 ActionContext映射包含以下內(nèi)容:

  • 應(yīng)用程序 - 應(yīng)用程序作用域變量

  • 會話 - 會話作用域變量

  • 根/值棧 - 所有的action變量都存儲在這里

  • 請求 - 請求作用域變量

  • 參數(shù) - 請求參數(shù)

  • 屬性 - 存儲在頁面,請求,會話和應(yīng)用程序作用域中的屬性

有必要了解的是,Action對象在值棧中總是可用的,因此如果你的Action對象有x和y屬性,你可以隨時使用。


ActionContext中的對象使用#號引用,但是,值棧中的對象可以直接引用,例如,如果

employee

是action類的屬性,則可以按如下方式引用:

  <s:property value="name"/>

替代

  <s:property value="#name"/>

如果你在會話中有一個名為“l(fā)ogin”的屬性,你可以按如下方式檢索:

  <s:property value="#session.login"/>

OGNL還支持處理集合 - 即Map,List和Set。例如,要顯示顏色的下拉列表,你可以執(zhí)行以下操作:

  <s:select name="color" list="{'red','yellow','green'}" />

OGNL表達式很智能地將“紅色”,“黃色”,“綠色”解釋為顏色,并基于此構(gòu)建了列表。


在下一章我們學(xué)習(xí)各種的標簽時,OGNL表達式將會廣泛的用到。因此,不要用孤立的方式去了解OGNL,讓我們結(jié)合Form標簽/Control標簽/Data標簽和Ajax標簽部分中的一些示例來了解它。

值棧/ OGNL示例

創(chuàng)建Action:

讓我們參考下面用于訪問值棧的action類,然后在ie.JSP視圖頁面設(shè)置使用OGNL進行訪問的幾個key。

package cn.w3cschool.struts2;

import java.util.*; 

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

public class HelloWorldAction extends ActionSupport{
   private String name;

   public String execute() throws Exception {
      ValueStack stack = ActionContext.getContext().getValueStack();
      Map<String, Object> context = new HashMap<String, Object>();

      context.put("key1", new String("This is key1")); 
      context.put("key2", new String("This is key2"));
      stack.push(context);

      System.out.println("Size of the valueStack: " + stack.size());
      return "success";
   }  

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }
}

實際上,Struts 2在執(zhí)行時會將action添加到值棧的頂部。所以,通常放置東西在值棧的方法是添加getters/setters的值到Action類,然后使用<s:property>標簽訪問值。我們前面已展示了ActionContext和值棧在struts中的工作原理。

創(chuàng)建視圖

在你的eclipse項目的WebContent文件夾中創(chuàng)建下面的jsp文件HelloWorld.jsp,如果action返回為success將顯示視圖:

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Hello World</title>
</head>
<body>
   Entered value : <s:property value="name"/><br/>
   Value of key 1 : <s:property value="key1" /><br/>
   Value of key 2 : <s:property value="key2" /> <br/>
</body>
</html>

我們還需要在WebContent文件夾中創(chuàng)建index.jsp文件,其內(nèi)容如下:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
   pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
   <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Hello World</title>
</head>
<body>
   <h1>Hello World From Struts2</h1>
   <form action="hello">
      <label for="name">Please enter your name</label><br/>
      <input type="text" name="name"/>
      <input type="submit" value="Say Hello"/>
   </form>
</body>
</html>

配置文件

以下是struts.xml文件的內(nèi)容:

 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <constant name="struts.devMode" value="true" />
   <package name="helloworld" extends="struts-default">

      <action name="hello" 
         class="cn.w3cschool.struts2.HelloWorldAction" 
         method="execute">
         <result name="success">/HelloWorld.jsp</result>
      </action>

   </package>
</struts>

以下是web.xml文件的內(nèi)容:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns="http://java.sun.com/xml/ns/javaee" 
   xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id="WebApp_ID" version="3.0">
   
   <display-name>Struts 2</display-name>
   <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
   <filter>
      <filter-name>struts2</filter-name>
      <filter-class>
         org.apache.struts2.dispatcher.FilterDispatcher
      </filter-class>
   </filter>

   <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
</web-app>

右鍵單擊項目名稱,然后單擊“Export”>“WAR File”創(chuàng)建WAR文件。然后在Tomcat的webapps目錄中部署WAR文件。最后,啟動Tomcat服務(wù)器并嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。將顯示如下界面:

輸入

現(xiàn)在,在給定的文本框中輸入任意單詞,然后單擊“Say Hello”按鈕執(zhí)行定義的action。如果你查看生成的日志,可以在底部看到以下文本:

 
Size of the valueStack: 3

這意味著它將顯示你輸入的任何值和我們放在值棧上的key1和key2的值。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號