Struts2-バリュースタック/ OGNL

バリュースタック

値スタックは、次のオブジェクトを指定された順序で保持するいくつかのオブジェクトのセットです-

シニア番号 オブジェクトと説明
1

Temporary Objects

ページの実行中に作成されるさまざまな一時オブジェクトがあります。たとえば、JSPタグでループオーバーされているコレクションの現在の反復値。

2

The Model Object

strutsアプリケーションでモデルオブジェクトを使用している場合、現在のモデルオブジェクトは値スタックのアクションの前に配置されます。

3

The Action Object

これは、実行されている現在のアクションオブジェクトになります。

4

Named Objects

これらのオブジェクトには、#application、#session、#request、#attr、および#parametersが含まれ、対応するサーブレットスコープを参照します。

値スタックには、JSP、Velocity、またはFreemarkerに提供されているタグを介してアクセスできます。別の章で学習するさまざまなタグがあり、Struts2.0の値スタックを取得および設定するために使用されます。次のように、アクション内でvalueStackオブジェクトを取得できます-

ActionContext.getContext().getValueStack()

ValueStackオブジェクトを取得したら、次のメソッドを使用してそのオブジェクトを操作できます-

シニア番号 ValueStackのメソッドと説明
1

Object findValue(String expr)

デフォルトの検索順序でスタックに対して指定された式を評価することにより、値を見つけます。

2

CompoundRoot getRoot()

スタックにプッシュされたオブジェクトを保持するCompoundRootを取得します。

3

Object peek()

スタックを変更せずに、スタックの一番上にあるオブジェクトを取得します。

4

Object pop()

スタックの一番上にあるオブジェクトを取得し、スタックから削除します。

5 void push(Object o)

このオブジェクトをスタックの一番上に置きます。

6

void set(String key, Object o)

指定されたキーを使用してスタック上のオブジェクトを設定し、findValue(key、...)で取得できるようにします。

7

void setDefaultType(Class defaultType)

値を取得するときにタイプが指定されていない場合に変換するデフォルトのタイプを設定します。

8

void setValue(String expr, Object value)

デフォルトの検索順序を使用して、指定された式を使用してスタック内のBeanにプロパティを設定しようとします。

9

int size()

スタック内のオブジェクトの数を取得します。

OGNL

ザ・ Object-Graph Navigation Language(OGNL)は、ValueStack上のデータを参照および操作するために使用される強力な表現言語です。OGNLは、データ転送と型変換にも役立ちます。

OGNLは、JSP式言語と非常によく似ています。OGNLは、コンテキスト内にルートオブジェクトまたはデフォルトオブジェクトを持つという考えに基づいています。デフォルトオブジェクトまたはルートオブジェクトのプロパティは、ポンド記号であるマークアップ表記を使用して参照できます。

前述のように、OGNLはコンテキストに基づいており、StrutsはOGNLで使用するためのActionContextマップを作成します。ActionContextマップは、次のもので構成されます。

  • Application −アプリケーションスコープ変数

  • Session −セッションスコープ変数

  • Root / value stack −すべてのアクション変数がここに保存されます

  • Request −スコープ変数を要求する

  • Parameters −リクエストパラメータ

  • Atributes −ページ、リクエスト、セッション、およびアプリケーションスコープに保存されている属性

Actionオブジェクトは常に値スタックで使用できることを理解することが重要です。したがって、Actionオブジェクトにプロパティがある場合“x” そして “y” すぐに使用できます。

ActionContext内のオブジェクトはポンド記号を使用して参照されますが、値スタック内のオブジェクトは直接参照できます。

たとえば、 employee はアクションクラスのプロパティである場合、次のように参照できます。

<s:property value = "name"/>

の代わりに

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

「ログイン」という属性がセッションにある場合は、次のように取得できます。

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

OGNLは、コレクション(Map、List、Set)の処理もサポートしています。たとえば、色のドロップダウンリストを表示するには、次のようにします。

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

OGNL式は、「赤」、「黄」、「緑」を色として解釈し、それに基づいてリストを作成するのに便利です。

OGNL式は、次の章でさまざまなタグを学習するときに広く使用されます。したがって、それらを個別に見るのではなく、フォームタグ/コントロールタグ/データタグとAjaxタグセクションのいくつかの例を使用して見てみましょう。

ValueStack / OGNLの例

アクションの作成

valueStackにアクセスし、ビューで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は、実行時にアクションをvalueStackの一番上に追加します。したがって、値スタックにデータを配置する通常の方法は、値のゲッター/セッターをActionクラスに追加してから、<s:property>タグを使用して値にアクセスすることです。しかし、私はActionContextとValueStackがStrutsでどのように正確に機能するかを示しています。

ビューを作成する

以下のjspファイルを作成しましょう HelloWorld.jspEclipseプロジェクトの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>

プロジェクト名を右クリックして、 Export > WAR FileWarファイルを作成します。次に、このWARをTomcatのwebappsディレクトリにデプロイします。

最後に、Tomcatサーバーを起動し、URLにアクセスしてみます http://localhost:8080/HelloWorldStruts2/index.jsp。これにより、次の画面が表示されます

次に、指定されたテキストボックスに任意の単語を入力し、[Say Hello]ボタンをクリックして、定義されたアクションを実行します。生成されたログを確認すると、下部に次のテキストが表示されます-

Size of the valueStack: 3

これにより、次の画面が表示されます。この画面には、入力する値と、ValueStackに設定したkey1およびkey2の値が表示されます。