Struts 2 - Conversione del tipo

Tutto su una richiesta HTTP viene trattato come un file Stringdal protocollo. Ciò include numeri, valori booleani, numeri interi, date, decimali e tutto il resto. Tuttavia, nella classe Struts, potresti avere proprietà di qualsiasi tipo di dati.

In che modo Struts autowire le proprietà per te?

Struts utilizza una varietà di convertitori di tipo sotto le coperte per fare il sollevamento pesante.

Ad esempio, se hai un attributo intero nella tua classe Action, Struts converte automaticamente il parametro della richiesta nell'attributo intero senza che tu debba fare nulla. Per impostazione predefinita, Struts viene fornito con una serie di convertitori di tipi

Se stai utilizzando uno dei convertitori elencati di seguito, non devi preoccuparti di nulla:

  • Intero, Float, Double, Decimal
  • Data e data e ora
  • Array e collezioni
  • Enumerations
  • Boolean
  • BigDecimal

A volte, quando si utilizza il proprio tipo di dati, è necessario aggiungere i propri convertitori per fare in modo che Struts sappia come convertire quei valori prima di visualizzarli. Considera la seguente 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;
   }
}

Questa è una classe molto semplice che ha un attributo chiamato name, quindi niente di speciale in questa classe. Creiamo un'altra classe che contenga informazioni sul sistema -SystemDetails.java.

Ai fini di questo esercizio, ho codificato l'ambiente in "Sviluppo" e il sistema operativo in "Windows XP SP3".

In un progetto in tempo reale, otterresti queste informazioni dalla configurazione del sistema.

Facciamo la seguente classe d'azione:

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;
   }
}

Successivamente, creiamo un semplice file JSP System.jsp per visualizzare le informazioni sull'ambiente e sul sistema operativo.

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

Cerchiamo di collegare il system.jsp e il SystemDetails.java classe insieme usando struts.xml.

La classe SystemDetails ha un semplice metodo execute () che restituisce la stringa "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>
  • Fare clic con il tasto destro sul nome del progetto e fare clic Export > WAR File per creare un file War.

  • Quindi distribuire questo WAR nella directory webapps di Tomcat.

  • Infine, avvia il server Tomcat e prova ad accedere all'URL http://localhost:8080/HelloWorldStruts2/system.action. Questo produrrà la seguente schermata:

Cosa c'è di sbagliato nell'output di cui sopra? Struts sa come visualizzare e convertire la stringa "Windows XP SP3" e altri tipi di dati incorporati, ma non sa cosa fare con la proprietà diEnvironmentgenere. Si chiama semplicementetoString() metodo sulla classe

Per risolvere questo problema, ora creiamo e registriamo un semplice file TypeConverter per la classe Ambiente.

Crea una classe chiamata EnvironmentConverter.java con quanto segue.

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();
   }	
}

Il EnvironmentConverter estende il StrutsTypeConverter class e dice a Struts come convertire l'ambiente in una stringa e viceversa sovrascrivendo due metodi che sono convertFromString() e convertToString().

Registriamo ora questo convertitore prima di usarlo nella nostra applicazione. Esistono due modi per registrare un convertitore.

Se il convertitore verrà utilizzato solo in una determinata azione, sarà necessario creare un file di proprietà che deve essere denominato come '[action-class]'converstion.properties.

Nel nostro caso creiamo un file chiamato SystemDetails-converstion.properties con la seguente voce di registrazione -

environment = com.tutorialspoint.struts2.EnvironmentConverter

Nell'esempio precedente, "ambiente" è il nome della proprietà nel file SystemDetails.java class e stiamo dicendo a Struts di usare il EnvironmentConverter per la conversione da e verso questa proprietà.

Tuttavia, non lo faremo, ma registreremo questo convertitore a livello globale, in modo che possa essere utilizzato in tutta l'applicazione. A tale scopo, creare un file delle proprietà denominatoxwork-conversion.properties nel WEBINF/classes cartella con la riga seguente

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

Questo registra semplicemente il convertitore a livello globale, quindi Strutspuò eseguire automaticamente la conversione ogni volta che incontra un oggetto del tipo Environment. Ora, se ricompili e riesegui il programma, otterrai un output migliore come segue:

Ovviamente, ora il risultato sarà migliore, il che significa che il nostro convertitore Struts funziona bene.

In questo modo puoi creare più convertitori e registrarli per utilizzarli secondo le tue esigenze.