Учебники

Struts 2 – стек значений / OGNL

Стек значений – это набор из нескольких объектов, который хранит следующие объекты в указанном порядке:

Sr.No Объекты и описание
1

Временные объекты

Существуют различные временные объекты, которые создаются во время исполнения страницы. Например, текущее значение итерации для коллекции, зацикленной в теге JSP.

2

Модельный объект

Если вы используете объекты модели в приложении Struts, объект текущей модели помещается перед действием в стеке значений.

3

Объект действия

Это будет текущий объект действия, который выполняется.

4

Именованные объекты

Эти объекты включают в себя #application, #session, #request, #attr и #parameters и ссылаются на соответствующие области сервлетов.

Временные объекты

Существуют различные временные объекты, которые создаются во время исполнения страницы. Например, текущее значение итерации для коллекции, зацикленной в теге JSP.

Модельный объект

Если вы используете объекты модели в приложении Struts, объект текущей модели помещается перед действием в стеке значений.

Объект действия

Это будет текущий объект действия, который выполняется.

Именованные объекты

Эти объекты включают в себя #application, #session, #request, #attr и #parameters и ссылаются на соответствующие области сервлетов.

Доступ к стеку значений можно получить через теги, предоставленные для JSP, Velocity или Freemarker. Существуют различные теги, которые мы будем изучать в отдельных главах, которые используются для получения и установки стека значений 2.0. Вы можете получить объект valueStack внутри вашего действия следующим образом:

ActionContext.getContext().getValueStack()

Получив объект ValueStack, вы можете использовать следующие методы для управления этим объектом:

Sr.No ValueStack Методы и описание
1

Object findValue (String expr)

Найдите значение, оценивая данное выражение по стеку в порядке поиска по умолчанию.

2

CompoundRoot getRoot ()

Получите CompoundRoot, который содержит объекты, помещенные в стек.

3

Просмотр объекта ()

Получить объект на вершине стека без изменения стека.

4

Объект pop ()

Получить объект на вершине стека и удалить его из стека.

5 Пустой толчок (Объект o)

Поместите этот объект на вершину стека.

6

void set (Строковый ключ, Объект o)

Устанавливает объект в стеке с заданным ключом, чтобы его можно было найти с помощью findValue (key, …)

7

void setDefaultType (класс defaultType)

Устанавливает тип по умолчанию для преобразования, если при получении значения тип не указан.

8

void setValue (String expr, Object value)

Пытается установить свойство для bean-компонента в стеке с заданным выражением, используя порядок поиска по умолчанию.

9

int size ()

Получить количество объектов в стеке.

Object findValue (String expr)

Найдите значение, оценивая данное выражение по стеку в порядке поиска по умолчанию.

CompoundRoot getRoot ()

Получите CompoundRoot, который содержит объекты, помещенные в стек.

Просмотр объекта ()

Получить объект на вершине стека без изменения стека.

Объект pop ()

Получить объект на вершине стека и удалить его из стека.

Поместите этот объект на вершину стека.

void set (Строковый ключ, Объект o)

Устанавливает объект в стеке с заданным ключом, чтобы его можно было найти с помощью findValue (key, …)

void setDefaultType (класс defaultType)

Устанавливает тип по умолчанию для преобразования, если при получении значения тип не указан.

void setValue (String expr, Object value)

Пытается установить свойство для bean-компонента в стеке с заданным выражением, используя порядок поиска по умолчанию.

int size ()

Получить количество объектов в стеке.

ОГНЛ

Язык навигации объектов-графиков (OGNL) – это мощный язык выражений, который используется для ссылки и манипулирования данными в ValueStack. OGNL также помогает в передаче данных и преобразовании типов.

OGNL очень похож на язык выражений JSP. OGNL основан на идее наличия корневого объекта или объекта по умолчанию в контексте. На свойства объекта по умолчанию или корневого объекта можно ссылаться, используя обозначение разметки, которое является символом фунта.

Как упоминалось ранее, OGNL основан на контексте, и Struts создает карту ActionContext для использования с OGNL. Карта ActionContext состоит из следующих элементов:

  • Приложение – переменные области применения

  • Session – переменные области видимости

  • Стек корня / значения – все ваши переменные действия хранятся здесь

  • Запрос – Запрос переменных области

  • Параметры – параметры запроса

  • Атрибуты – Атрибуты, хранящиеся в области страницы, запроса, сеанса и приложения.

Приложение – переменные области применения

Session – переменные области видимости

Стек корня / значения – все ваши переменные действия хранятся здесь

Запрос – Запрос переменных области

Параметры – параметры запроса

Атрибуты – Атрибуты, хранящиеся в области страницы, запроса, сеанса и приложения.

Важно понимать, что объект Action всегда доступен в стеке значений. Поэтому, если ваш объект Action имеет свойства «x» и «y», вы легко можете его использовать.

На объекты в ActionContext ссылаются с помощью символа фунта, однако на объекты в стеке значений можно ссылаться напрямую.

Например, если employee является свойством класса действия, на него можно ссылаться следующим образом:

<s:property value = "name"/>

вместо

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

Если у вас есть атрибут в сеансе, называемый «логин», вы можете получить его следующим образом:

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

OGNL также поддерживает работу с коллекциями, а именно с картой, списком и набором. Например, чтобы отобразить раскрывающийся список цветов, вы можете сделать:

<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 работают в стойках.

Создать представления

Давайте создадим нижеприведенный jsp-файл HelloWorld.jsp в папке WebContent в вашем проекте eclipse. Это представление будет отображаться в случае, если действие вернет успех –

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

Наконец, запустите сервер Tomcat и попробуйте получить доступ к URL-адресу http: // localhost: 8080 / HelloWorldStruts2 / index.jsp . Это создаст следующий экран

Hello World Struts 4

Теперь введите любое слово в данное текстовое поле и нажмите кнопку «Скажи привет», чтобы выполнить определенное действие. Теперь, если вы проверите сгенерированный журнал, вы найдете следующий текст внизу –

Size of the valueStack: 3

Это отобразит следующий экран, который будет отображать любое значение, которое вы введете, и значение ключей 1 и 2, которые мы поместили в ValueStack.