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.