當前位置:首頁 » struts2教學 » Struts2值棧/OGNL

Struts2值棧/OGNL

Struts2值棧/OGNL-值棧是一組的幾個對象保持中的下列對象提供的順序

Struts2值棧:

值棧是一組的幾個對象保持中的下列對象提供的順序:

SN Objects & Description
1 Temporary Objects
There are various temporary objects which are created during execution of a page. For example the current iteration value for a collection being looped over in a JSP tag.
2 The Model Object
If you are using model objects in your struts application, the current model object is placed before the action on the value stack
3 The Action Object
This will be the current action object which is being executed.
4 Named Objects
These objects include #application, #session, #request, #attr and #parameters and refer to the corresponding servlet scopes

值棧可以通過標簽提供JSPVelocity或者Freemarker。在單獨的章節中,我們將研究有不同的標簽,被用來獲取和設置Struts2.0的值棧。您可以在動作值棧對象如下:

ActionContext.getContext().getValueStack()

一旦你擁有了值對象,您可以使用以下方法來操作該對象:

SN ValueStack Methods & Description
1 Object findValue(String expr)
Find a value by evaluating the given expression against the stack in the default search order.
2 CompoundRoot getRoot()
Get the CompoundRoot which holds the objects pushed onto the stack.
3 Object peek()
Get the object on the top of the stack without changing the stack.
4 Object pop()
Get the object on the top of the stack and remove it from the stack.
5 void push(Object o)
Put this object onto the top of the stack.
6 void set(String key, Object o)
Sets an object on the stack with the given key so it is retrievable by findValue(key,...)
7 void setDefaultType(Class defaultType)
Sets the default type to convert to if no type is provided when getting a value.
8 void setValue(String expr, Object value)
Attempts to set a property on a bean in the stack with the given expression using the default search order.
9 int size()
Get the number of objects in the stack.

OGNL:

對象圖導航語言(OGNL)是一個功能強大的表達式語言,用於引用和操作數據的值棧。 OGNL還可以在數據傳輸和類型轉換。
OGNL是非常相似的JSP表達式語言。 OGNL是基於的思想具有根或缺省對象的範圍內的。默認的根對象的屬性可以參考使用的標記符號,這是英鎊的象征。


正如前麵提到的,OGNL根據上下文和Struts建立一個ActionContext中使用OGNL地圖。 ActionContext中的地圖由下列組成:

  1. application - 應用程序範圍內的變量

  2. session - 會話範圍的變量

  3. root / value stack - 所有操作變量都存儲在這裡

  4. request - 請求範圍的變量

  5. parameters - 請求參數

  6. atributes - 存儲的屬性頁麵,請求,會話和應用範圍

重要的是要明白,值棧中的操作對象是始終可用。所以,因此,如果你的行動對象的屬性x和y有隨時供您使用。
在ActionContext中的對象被稱為使用英鎊的象征,但是,值棧中的對象可以直接引用,例如,如果employee 是一個動作類的屬性的話,就可以得到參考如下:

  <s:property value="name"/>

instead of

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

如果你有所謂的“login”會話中的屬性,可以找回如下:

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

OGNL還支持處理的集合 - 即Map,List和Set。例如,以顯示顏色的下拉列表中,你可以這樣做:

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

OGNL表達式是巧妙地解釋了“red”,“yellow”,“green”顏色和此基礎上建立一個列表。
OGNL表達式將被廣泛使用在接下來的章節中,我們將研究不同的標簽。因此,而不是孤立地看著他們,讓我們來看看的表格標簽/控製標簽/數據標簽和Ajax標簽部分在使用中的一些例子。


值棧/OGNL 例子:

創建動作:

讓我們考慮下麵的操作類,我們訪問值棧,然後設置幾個鍵,我們將在我們的觀點,即訪問使用OGNL  JSP頁麵。

package com.tutorialspoint.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的增加值棧的頂部時,您的動作執行。因此,通常的方法把東西值棧是增加值getter/setter方法Action類和然後使用<s:property>的標簽,訪問值。但展示究竟是如何的ActionContext中和值棧在struts工作。

創建視圖

讓我們創建下麵的JSP文件的helloWorld.jsp,在eclipse項目的WebContent文件夾。這種觀點的情況下動作的成功返回,將顯示:

<%@ 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>

我們還需要創建的index.jsp在WebContent文件夾,其內容如下:

<%@ 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文件的內容:

<?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="com.tutorialspoint.struts2.HelloWorldAction" 
         method="execute">
         <result name="success">/HelloWorld.jsp</result>
      </action>

   </package>
</struts>

以下是web.xml文件中的內容:

<?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>

右鍵點擊項目名稱,並單擊“導出”> WAR文件創建一個WAR文件。然後,這WAR部署在Tomcat的webapps目錄下。最後,啟動Tomcat服務器,並嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給你以下畫麵:

現在,在給定的文本框中輸入任何單詞,然後點擊“Say Hello”按鈕執行已定義的動作。現在,如果查看生成的日誌,你會發現下麵的文字在底部:

 
Size of the valueStack: 3

這將顯示下麵的屏幕,它會顯示任何的值,你將進入和值key1和key2,我們給定了值棧。


end over.