Struts-2-struts-value-stack-ognl

提供:Dev Guides
移動先:案内検索

Struts 2-バリュースタック/OGNL

価値スタック

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

Sr.No Objects & Description
1

Temporary Objects

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

2

The Model Object

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

3

The Action Object

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

4

Named Objects

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

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

ActionContext.getContext().getValueStack()

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

Sr.No ValueStack Methods & Description
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 Expression Languageに非常に似ています。 OGNLは、コンテキスト内にルートオブジェクトまたはデフォルトオブジェクトを持つという考えに基づいています。 デフォルトオブジェクトまたはルートオブジェクトのプロパティは、マークアップ表記法(ポンド記号)を使用して参照できます。

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

  • アプリケーション-アプリケーションスコープ変数
  • セッション-セッションスコープ変数
  • ルート/値スタック-すべてのアクション変数はここに保存されます
  • リクエスト-スコープ変数のリクエスト
  • パラメータ-リクエストパラメータ
  • 属性-ページ、リクエスト、セッション、アプリケーションのスコープに保存されている属性

Actionオブジェクトは値スタックで常に利用可能であることを理解することが重要です。 そのため、アクションオブジェクトにプロパティ*“ x” および“ y” *がある場合、すぐに使用できます。

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

たとえば、*従業員*がアクションクラスのプロパティである場合、次のように参照できます-

<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にアクセスし、ビュー、つまりJSPページでOGNLを使用してアクセスするいくつかのキーを設定する次のアクションクラスを考えてみましょう。

package com.finddevguides.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>タグを使用して値にアクセスすることです。 しかし、StrutsでActionContextとValueStackが正確に機能する方法を示しています。

ビューを作成する

eclipseプロジェクトのWebContentフォルダーに以下のjspファイル HelloWorld.jsp を作成しましょう。 このビューは、アクションが成功を返す場合に表示されます-

<%@ 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フォルダーに index.jsp を作成する必要があります-

<%@ 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.finddevguides.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 にアクセスしてみます。 これにより、次の画面が生成されます

Hello World Struts 4

指定されたテキストボックスに任意の単語を入力し、「Say Hello」ボタンをクリックして、定義されたアクションを実行します。 今、あなたが生成されたログを確認する場合は、下部に次のテキストがあります-

Size of the valueStack: 3

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