Struts 2 - konwersja typu

Wszystko w żądaniu HTTP jest traktowane jako plik Stringprotokołem. Obejmuje to liczby, wartości logiczne, liczby całkowite, daty, ułamki dziesiętne i wszystko inne. Jednak w klasie Struts można mieć właściwości dowolnego typu danych.

W jaki sposób Struts automatycznie przewodzi nieruchomości?

Struts używa różnych typów konwerterów pod osłonami do wykonywania ciężkich prac.

Na przykład, jeśli w klasie Action masz atrybut liczby całkowitej, Struts automatycznie konwertuje parametr żądania na atrybut liczby całkowitej bez wykonywania jakichkolwiek czynności. Domyślnie Struts jest dostarczany z wieloma konwerterami typów

Jeśli korzystasz z któregokolwiek z wymienionych poniżej konwerterów, nie masz się czym martwić -

  • Liczba całkowita, zmiennoprzecinkowa, podwójna, dziesiętna
  • Data i data i godzina
  • Tablice i kolekcje
  • Enumerations
  • Boolean
  • BigDecimal

Czasami, gdy używasz własnego typu danych, konieczne jest dodanie własnych konwerterów, aby Struts wiedział, jak konwertować te wartości przed wyświetleniem. Rozważmy następującą klasę 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;
   }
}

To jest bardzo prosta klasa, która ma atrybut o nazwie name, więc nic specjalnego w tej klasie. Stwórzmy kolejną klasę zawierającą informacje o systemie -SystemDetails.java.

Na potrzeby tego ćwiczenia na stałe zakodowałem środowisko na „Rozwój”, a system operacyjny na „Windows XP SP3”.

W projekcie czasu rzeczywistego można uzyskać te informacje z konfiguracji systemu.

Miejmy następującą klasę działań -

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

Następnie stwórzmy prosty plik JSP System.jsp aby wyświetlić informacje o środowisku i systemie operacyjnym.

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

Połączmy system.jsp i SystemDetails.java klasa razem za pomocą struts.xml.

Klasa SystemDetails zawiera prostą metodę execute (), która zwraca ciąg znaków "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>
  • Kliknij prawym przyciskiem myszy nazwę projektu i kliknij Export > WAR File aby utworzyć plik wojny.

  • Następnie wdróż tę WAR w katalogu webapps serwera Tomcat.

  • Na koniec uruchom serwer Tomcat i spróbuj uzyskać dostęp do adresu URL http://localhost:8080/HelloWorldStruts2/system.action. Spowoduje to wyświetlenie następującego ekranu -

Co jest nie tak z powyższym wyjściem? Struts wie, jak wyświetlić i przekonwertować ciąg „Windows XP SP3” i inne wbudowane typy danych, ale nie wie, co zrobić z właściwościąEnvironmentrodzaj. To się po prostu nazywatoString() metoda na klasie

Aby rozwiązać ten problem, utwórzmy i zarejestrujmy plik simple TypeConverter dla klasy Environment.

Utwórz klasę o nazwie EnvironmentConverter.java z następującymi.

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

Plik EnvironmentConverter rozszerza StrutsTypeConverter i informuje Struts, jak przekonwertować Environment na String i odwrotnie, zastępując dwie metody, które są convertFromString() i convertToString().

Zarejestrujmy teraz ten konwerter, zanim użyjemy go w naszej aplikacji. Istnieją dwa sposoby zarejestrowania konwertera.

Jeśli konwerter będzie używany tylko w określonej akcji, wówczas należałoby utworzyć plik właściwości, który należy nazwać jako '[action-class]'converstion.properties.

W naszym przypadku tworzymy plik o nazwie SystemDetails-converstion.properties z następującym wpisem rejestracyjnym -

environment = com.tutorialspoint.struts2.EnvironmentConverter

W powyższym przykładzie „środowisko” to nazwa właściwości w SystemDetails.java i mówimy Struts, aby używał rozszerzenia EnvironmentConverter do konwersji do iz tej właściwości.

Jednak tego nie zrobimy, zamiast tego zarejestrujemy ten konwerter globalnie, aby można go było używać w całej aplikacji. Aby to zrobić, utwórz plik właściwości o nazwiexwork-conversion.properties w WEBINF/classes folder z następującym wierszem

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

To po prostu rejestruje konwerter globalnie, więc Strutsmoże automatycznie wykonać konwersję za każdym razem, gdy napotka obiekt typu Environment. Teraz, jeśli ponownie skompilujesz i ponownie uruchomisz program, uzyskasz lepszy wynik w następujący sposób -

Oczywiście teraz wynik będzie lepszy, co oznacza, że ​​nasz konwerter Struts działa dobrze.

W ten sposób możesz utworzyć wiele konwerterów i zarejestrować je do użytku zgodnie z własnymi wymaganiami.