Struts 2 - Conversão de Tipo

Tudo em uma solicitação HTTP é tratado como um Stringpelo protocolo. Isso inclui números, booleanos, inteiros, datas, decimais e tudo mais. No entanto, na classe Struts, você pode ter propriedades de qualquer tipo de dados.

Como o Struts faz o autowire das propriedades para você?

Struts usa uma variedade de conversores de tipo sob as tampas para fazer o trabalho pesado.

Por exemplo, se você tiver um atributo integer em sua classe Action, o Struts converte automaticamente o parâmetro de solicitação no atributo integer sem que você faça nada. Por padrão, o Struts vem com vários conversores de tipo

Se você estiver usando qualquer um dos conversores listados abaixo, não precisa se preocupar -

  • Inteiro, Flutuante, Duplo, Decimal
  • Data e data e hora
  • Matrizes e coleções
  • Enumerations
  • Boolean
  • BigDecimal

Às vezes, quando você está usando seu próprio tipo de dados, é necessário adicionar seus próprios conversores para tornar o Struts ciente de como converter esses valores antes de exibi-los. Considere a seguinte classe POJOEnvironment.java.

package com.tutorialspoint.struts2;

public class Environment {
   private String name;
   
   public  Environment(String name) {
      this.name = name;
   }
   
   public String getName() {
      return name;
   }
   
   public void setName(String name) {
      this.name = name;
   }
}

Esta é uma classe muito simples que tem um atributo chamado name, então nada de especial sobre esta classe. Vamos criar outra classe que contenha informações sobre o sistema -SystemDetails.java.

Para os fins deste exercício, codifiquei permanentemente o Ambiente para "Desenvolvimento" e o Sistema operacional para "Windows XP SP3".

Em um projeto em tempo real, você obteria essas informações da configuração do sistema.

Vamos ter a seguinte classe de ação -

package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;

public class SystemDetails extends ActionSupport {
   private Environment environment = new Environment("Development");
   private String operatingSystem = "Windows XP SP3";

   public String execute() {
      return SUCCESS;
   }
   
   public Environment getEnvironment() {
      return environment;
   }
   
   public void setEnvironment(Environment environment) {
      this.environment = environment;
   }
   
   public String getOperatingSystem() {
      return operatingSystem;
   }
   
   public void setOperatingSystem(String operatingSystem) {
      this.operatingSystem = operatingSystem;
   }
}

A seguir, vamos criar um arquivo JSP simples System.jsp para exibir as informações do ambiente e do sistema operacional.

<%@ 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>System Details</title>
   </head>
   
   <body>
      Environment: <s:property value = "environment"/><br/>
      Operating System:<s:property value = "operatingSystem"/>
   </body>
</html>

Vamos conectar o system.jsp e a SystemDetails.java aula juntos usando struts.xml.

A classe SystemDetails tem um método execute () simples que retorna a string "SUCCESS"

<?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 = "system" 
            class = "com.tutorialspoint.struts2.SystemDetails" 
            method = "execute">
         <result name = "success">/System.jsp</result>
      </action>
   </package>
</struts>
  • Clique com o botão direito no nome do projeto e clique Export > WAR File para 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/system.action. Isso produzirá a seguinte tela -

O que há de errado com a saída acima? Struts sabe como exibir e converter a string "Windows XP SP3" e outros tipos de dados internos, mas não sabe o que fazer com a propriedade deEnvironmenttipo. É simplesmente chamadotoString() método na aula

Para resolver este problema, vamos agora criar e registrar um simples TypeConverter para a classe Ambiente.

Crie uma classe chamada EnvironmentConverter.java com o seguinte.

package com.tutorialspoint.struts2;

import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;

public class EnvironmentConverter extends StrutsTypeConverter {
   @Override
   public Object convertFromString(Map context, String[] values, Class clazz) {
      Environment env = new Environment(values[0]);
      return env;
   }

   @Override
   public String convertToString(Map context, Object value) {
      Environment env  = (Environment) value;
      return env == null ? null : env.getName();
   }	
}

o EnvironmentConverter estende o StrutsTypeConverter classe e diz ao Struts como converter Environment em String e vice-versa substituindo dois métodos que são convertFromString() e convertToString().

Vamos agora registrar este conversor antes de usá-lo em nosso aplicativo. Existem duas maneiras de registrar um conversor.

Se o conversor for usado apenas em uma ação específica, você terá que criar um arquivo de propriedade que precisa ser nomeado como '[action-class]'converstion.properties.

No nosso caso, criamos um arquivo chamado SystemDetails-converstion.properties com a seguinte entrada de registro -

environment = com.tutorialspoint.struts2.EnvironmentConverter

No exemplo acima, "ambiente" é o nome da propriedade no SystemDetails.java classe e estamos dizendo ao Struts para usar o EnvironmentConverter para converter de e para esta propriedade.

Porém, não faremos isso. Em vez disso, registraremos esse conversor globalmente, para que possa ser usado em todo o aplicativo. Para fazer isso, crie um arquivo de propriedades chamadoxwork-conversion.properties no WEBINF/classes pasta com a seguinte linha

com.tutorialspoint.struts2.Environment = \
   com.tutorialspoint.struts2.EnvironmentConverter

Isso simplesmente registra o conversor globalmente, para que Strutspode fazer a conversão automaticamente sempre que encontrar um objeto do tipo Environment. Agora, se você recompilar e reexecutar o programa, obterá uma saída melhor da seguinte maneira -

Obviamente, agora o resultado será melhor, o que significa que nosso conversor Struts está funcionando bem.

É assim que você pode criar vários conversores e registrá-los para uso de acordo com seus requisitos.