詳解Java的Struts框架中棧值和OGNL的使用
值棧:
值棧是一個(gè)集合中的幾個(gè)對(duì)象保持下列對(duì)象提供的順序:

值??梢酝ㄟ^(guò)JSP,Velocity或者Freemarker的標(biāo)簽。有各種不同的標(biāo)簽在單獨(dú)的章節(jié)中,我們將學(xué)習(xí),用于獲取和設(shè)置Struts 2.0 的值棧。 ValueStack的對(duì)象里面可以得到動(dòng)作如下:
ActionContext.getContext().getValueStack()
一旦擁有了值對(duì)象,就可以用下面的方法來(lái)操縱該對(duì)象:

OGNL:
對(duì)象圖形導(dǎo)航語(yǔ)言(OGNL)是一個(gè)功能強(qiáng)大的表達(dá)式語(yǔ)言是用來(lái)參考值棧上的數(shù)據(jù)和操縱。 OGNL也有助于在數(shù)據(jù)傳輸和類型轉(zhuǎn)換。
OGNL和JSP表達(dá)式語(yǔ)言很相似。 OGNL 基礎(chǔ)的理念是在 root或默認(rèn)的對(duì)象范圍內(nèi)。默認(rèn)或根對(duì)象的屬性,可以參考使用的標(biāo)記符號(hào)(井號(hào))。
如前所述,OGNL是基于上下文和Struts的構(gòu)建ActionContext 使用OGNL映射。ActionContext中映射包括以下:
application - 應(yīng)用范圍的變量
session - 會(huì)話范圍的變量
root / value stack - 所有操作變量都保存在這里
request - 請(qǐng)求范圍的變量
parameters - 請(qǐng)求參數(shù)
atributes - 存儲(chǔ)的屬性頁(yè)面,請(qǐng)求,會(huì)話和應(yīng)用范圍
重要的是要明白,操作對(duì)象是始終可用值棧中的。所以,因此,如果動(dòng)作對(duì)象的屬性x和y有隨時(shí)供使用。
在ActionContext中的對(duì)象被稱為使用井號(hào)的符號(hào),但是,值棧中的對(duì)象可以被直接引用,例如,如果員工是一個(gè)動(dòng)作類的屬性,那么就可以得到如下參考:
<s:property value="name"/>
來(lái)代替
<s:property value="#name"/>
如果會(huì)話中有一個(gè)屬性叫做“l(fā)ogin”,可以找回如下:
<s:property value="#session.login"/>
OGNL還支持處理的集合 - 即映射,List和Set。例如,以顯示顏色的下拉列表,可以這樣做:
<s:select name="color" list="{'red','yellow','green'}" />
本OGNL表達(dá)式是巧妙地的解釋 "red","yellow","green"為顏色,并此基礎(chǔ)上建立一個(gè)列表。
OGNL表達(dá)式將被廣泛使用時(shí),在接下來(lái)的章節(jié)中,我們將研究不同的標(biāo)簽。因此,讓我們來(lái)看看它使用的一些例子在Form標(biāo)簽/標(biāo)簽/數(shù)據(jù)標(biāo)簽控制和Ajax標(biāo)簽。
ValueStack/OGNL 例子: 創(chuàng)建動(dòng)作:
讓我們考慮以下動(dòng)作類,當(dāng)我們?cè)L問(wèn)值棧,然后設(shè)置幾個(gè)鍵,我們將在視圖,即訪問(wèn)使用OGNL,JSP頁(yè)面。
package com.yiibai.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;
}
}
其實(shí),Struts 2的值棧的頂部增加了動(dòng)作時(shí)執(zhí)行。所以,通常的方法是把東西值棧添加 getter/setter方法以使這些值在Action類,然后使用<s:property>標(biāo)簽來(lái)訪問(wèn)值。以下是展示如何在struts ActionContext 中 ValueStack 工作。
創(chuàng)建視圖
讓我們創(chuàng)建以下JSP文件 helloWorld.jsp 的要 WebContent 文件夾。這個(gè)視圖將被顯示動(dòng)作返回“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>
我們還需要?jiǎng)?chuàng)建的index.jsp在WebContent文件夾,其內(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="com.yiibai.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>
右鍵點(diǎn)擊項(xiàng)目名稱,并單擊Export > WAR File創(chuàng)建一個(gè)WAR文件。然后將此WAR 部署在Tomcat 的 webapps目錄下。最后,啟動(dòng)Tomcat服務(wù)器和嘗試訪問(wèn)URL http://localhost:8080/HelloWorldStruts2/index.jsp。如以下畫面:

現(xiàn)在在給定的文本框中輸入任何單詞,然后點(diǎn)擊"Say Hello"按鈕執(zhí)行已定義的動(dòng)作?,F(xiàn)在,如果檢查生成的日志,會(huì)發(fā)現(xiàn)下面的文本底部:
Size of the valueStack: 3
這將顯示以下畫面,這將顯示任何的值,將進(jìn)入值為key1和key2,我們已經(jīng)把它們放入 ValueStack。
相關(guān)文章
Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(28)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-07-07
Java中的阻塞隊(duì)列BlockingQueue使用詳解
這篇文章主要介紹了Java中的阻塞隊(duì)列BlockingQueue使用詳解,阻塞隊(duì)列是一種線程安全的數(shù)據(jù)結(jié)構(gòu),用于在多線程環(huán)境下進(jìn)行數(shù)據(jù)交換,它提供了一種阻塞的機(jī)制,當(dāng)隊(duì)列為空時(shí),消費(fèi)者線程將被阻塞,直到隊(duì)列中有數(shù)據(jù)可供消費(fèi),需要的朋友可以參考下2023-10-10
基于Java SSM的健康管理小程序的實(shí)現(xiàn)
本篇文章主要為大家分享了基于SSM健康管理小程序的設(shè)計(jì)與實(shí)現(xiàn)。感興趣的小伙伴可以了解一下2021-11-11
Java Socket設(shè)置timeout的幾種常用方式說(shuō)明
這篇文章主要介紹了Java Socket設(shè)置timeout的幾種常用方式說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
RocketMQ生產(chǎn)者一個(gè)應(yīng)用不能發(fā)送多個(gè)NameServer消息解決
這篇文章主要為大家介紹了RocketMQ生產(chǎn)者一個(gè)應(yīng)用不能發(fā)送多個(gè)NameServer消息原因及解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Spring Boot中捕獲異常錯(cuò)誤信息并將其保存到數(shù)據(jù)庫(kù)中的操作方法
這篇文章主要介紹了Spring Boot中捕獲異常錯(cuò)誤信息并將其保存到數(shù)據(jù)庫(kù)中的操作方法,通過(guò)實(shí)例代碼介紹了使用Spring Data JPA創(chuàng)建一個(gè)異常信息的存儲(chǔ)庫(kù)接口,以便將異常信息保存到數(shù)據(jù)庫(kù),需要的朋友可以參考下2023-10-10
又又叕出BUG啦!理智分析Java NIO的ByteBuffer到底有多難用
網(wǎng)絡(luò)數(shù)據(jù)的基本單位永遠(yuǎn)是byte,Java NIO提供ByteBuffer作為字節(jié)的容器,但該類過(guò)于復(fù)雜,有點(diǎn)難用.本篇文章就帶大家簡(jiǎn)單了解一下 ,需要的朋友可以參考下2021-06-06

