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.