Struts 2 - Pilha de valores / OGNL

The Value Stack

A pilha de valores é um conjunto de vários objetos que mantém os seguintes objetos na ordem fornecida -

Sr. Não Objetos e descrição
1

Temporary Objects

Existem vários objetos temporários que são criados durante a execução de uma página. Por exemplo, o valor de iteração atual para uma coleção que está sendo repetida em uma tag JSP.

2

The Model Object

Se você estiver usando objetos de modelo em seu aplicativo struts, o objeto de modelo atual é colocado antes da ação na pilha de valores.

3

The Action Object

Este será o objeto de ação atual que está sendo executado.

4

Named Objects

Esses objetos incluem #application, #session, #request, #attr e #parameters e se referem aos escopos de servlet correspondentes.

A pilha de valores pode ser acessada por meio das tags fornecidas para JSP, Velocity ou Freemarker. Existem várias tags que estudaremos em capítulos separados, são usadas para obter e definir a pilha de valores do struts 2.0. Você pode obter o objeto valueStack dentro de sua ação da seguinte maneira -

ActionContext.getContext().getValueStack()

Depois de ter um objeto ValueStack, você pode usar os seguintes métodos para manipular esse objeto -

Sr. Não Métodos e descrição de ValueStack
1

Object findValue(String expr)

Encontre um valor avaliando a expressão fornecida em relação à pilha na ordem de pesquisa padrão.

2

CompoundRoot getRoot()

Obtenha o CompoundRoot que mantém os objetos colocados na pilha.

3

Object peek()

Coloque o objeto no topo da pilha sem alterar a pilha.

4

Object pop()

Pegue o objeto no topo da pilha e remova-o da pilha.

5 void push(Object o)

Coloque este objeto no topo da pilha.

6

void set(String key, Object o)

Define um objeto na pilha com a chave fornecida para que seja recuperável por findValue (chave, ...)

7

void setDefaultType(Class defaultType)

Define o tipo padrão para o qual converter, se nenhum tipo for fornecido ao obter um valor.

8

void setValue(String expr, Object value)

Tenta definir uma propriedade em um bean na pilha com a expressão fornecida usando a ordem de pesquisa padrão.

9

int size()

Obtenha o número de objetos na pilha.

The OGNL

o Object-Graph Navigation Language(OGNL) é uma linguagem de expressão poderosa usada para fazer referência e manipular dados no ValueStack. OGNL também ajuda na transferência de dados e conversão de tipo.

O OGNL é muito semelhante ao JSP Expression Language. OGNL é baseado na ideia de ter uma raiz ou objeto padrão dentro do contexto. As propriedades do objeto padrão ou raiz podem ser referenciadas usando a notação de marcação, que é o símbolo de libra.

Conforme mencionado anteriormente, OGNL é baseado em um contexto e Struts constrói um mapa ActionContext para uso com OGNL. O mapa ActionContext consiste no seguinte -

  • Application - Variáveis ​​com escopo de aplicativo

  • Session - Variáveis ​​com escopo de sessão

  • Root / value stack - Todas as suas variáveis ​​de ação são armazenadas aqui

  • Request - Solicitar variáveis ​​de escopo

  • Parameters - Parâmetros de solicitação

  • Atributes - Os atributos armazenados na página, solicitação, sessão e escopo do aplicativo

É importante entender que o objeto Action está sempre disponível na pilha de valores. Portanto, se o seu objeto Action tem propriedades“x” e “y” lá estão disponíveis para você usar.

Os objetos no ActionContext são referenciados usando o símbolo de libra, no entanto, os objetos na pilha de valores podem ser referenciados diretamente.

Por exemplo, se employee é uma propriedade de uma classe de ação, então ela pode ser referenciada da seguinte forma -

<s:property value = "name"/>

ao invés de

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

Se você tiver um atributo na sessão chamado "login", você pode recuperá-lo da seguinte maneira -

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

OGNL também suporta o tratamento de coleções - a saber, Mapa, Lista e Conjunto. Por exemplo, para exibir uma lista suspensa de cores, você pode fazer -

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

A expressão OGNL é inteligente para interpretar o "vermelho", "amarelo", "verde" como cores e construir uma lista com base nisso.

As expressões OGNL serão usadas extensivamente nos próximos capítulos, quando estudaremos diferentes tags. Portanto, em vez de olhar para eles isoladamente, vamos examiná-los usando alguns exemplos na seção Tags de formulário / tags de controle / tags de dados e tags Ajax.

Exemplo ValueStack / OGNL

Criar ação

Vamos considerar a seguinte classe de ação onde estamos acessando valueStack e então definindo algumas chaves que acessaremos usando OGNL em nossa visão, isto é, página 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;
   }
}

Na verdade, o Struts 2 adiciona sua ação ao topo do valueStack quando executado. Portanto, a maneira usual de colocar coisas na pilha de valores é adicionar getters / setters para os valores à sua classe Action e, em seguida, usar a tag <s: property> para acessar os valores. Mas estou mostrando como exatamente ActionContext e ValueStack funcionam em struts.

Criar Vistas

Vamos criar o arquivo jsp abaixo HelloWorld.jspna pasta WebContent em seu projeto eclipse. Esta visualização será exibida caso a ação retorne com sucesso -

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

Também precisamos criar index.jsp na pasta WebContent cujo conteúdo é o seguinte -

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

Arquivos de configuração

A seguir está o conteúdo de struts.xml arquivo -

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

A seguir está o conteúdo de web.xml arquivo -

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

Clique com o botão direito no nome do projeto e clique Export > WAR Filepara criar um arquivo de guerra. Em seguida, implante esse WAR no diretório webapps do Tomcat.

Finalmente, inicie o servidor Tomcat e tente acessar o URL http://localhost:8080/HelloWorldStruts2/index.jsp. Isso produzirá a seguinte tela

Agora insira qualquer palavra na caixa de texto fornecida e clique no botão "Diga Olá" para executar a ação definida. Agora, se você verificar o log gerado, encontrará o seguinte texto na parte inferior -

Size of the valueStack: 3

Isso exibirá a tela a seguir, que exibirá qualquer valor que você inserir e o valor de key1 e key2 que colocamos no ValueStack.