Struts 2 - การแปลงประเภท

ทุกอย่างในคำขอ HTTP จะถือว่าเป็นไฟล์ Stringโดยโปรโตคอล ซึ่งรวมถึงตัวเลขบูลีนจำนวนเต็มวันที่ทศนิยมและอื่น ๆ อย่างไรก็ตามในคลาส Struts คุณสามารถมีคุณสมบัติของข้อมูลประเภทใดก็ได้

Struts กำหนดคุณสมบัติให้คุณโดยอัตโนมัติอย่างไร

Struts ใช้ตัวแปลงประเภทต่างๆใต้ฝาปิดเพื่อทำการยกของหนัก

ตัวอย่างเช่นหากคุณมีแอตทริบิวต์จำนวนเต็มในคลาส Action Struts จะแปลงพารามิเตอร์คำขอเป็นแอตทริบิวต์จำนวนเต็มโดยอัตโนมัติโดยที่คุณไม่ต้องทำอะไรเลย โดยค่าเริ่มต้น Struts มาพร้อมกับตัวแปลงประเภทต่างๆ

หากคุณกำลังใช้ตัวแปลงใด ๆ ในรายการด้านล่างคุณก็ไม่มีอะไรต้องกังวล -

  • จำนวนเต็มลอยคู่ทศนิยม
  • วันที่และวันที่และเวลา
  • อาร์เรย์และคอลเลกชัน
  • Enumerations
  • Boolean
  • BigDecimal

ในบางครั้งที่คุณใช้ชนิดข้อมูลของคุณเองจำเป็นต้องเพิ่มตัวแปลงของคุณเองเพื่อให้ Struts ทราบถึงวิธีการแปลงค่าเหล่านั้นก่อนที่จะแสดง พิจารณาคลาส POJO ต่อไปนี้Environment.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;
   }
}

นี่เป็นคลาสที่ง่ายมากที่มีแอตทริบิวต์ที่เรียกว่า nameไม่มีอะไรพิเศษเกี่ยวกับคลาสนี้ ให้เราสร้างคลาสอื่นที่มีข้อมูลเกี่ยวกับระบบ -SystemDetails.java.

สำหรับจุดประสงค์ของแบบฝึกหัดนี้ฉันได้ฮาร์ดโค้ดสภาพแวดล้อมเป็น "การพัฒนา" และระบบปฏิบัติการเป็น "Windows XP SP3" แล้ว

ในโครงการแบบเรียลไทม์คุณจะได้รับข้อมูลนี้จากการกำหนดค่าระบบ

ให้เรามีคลาสแอ็กชันต่อไปนี้ -

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

ต่อไปให้เราสร้างไฟล์ JSP ง่ายๆ System.jsp เพื่อแสดงข้อมูลสภาพแวดล้อมและระบบปฏิบัติการ

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

ให้เราเชื่อมต่อไฟล์ system.jsp และ SystemDetails.java เรียนด้วยกันโดยใช้ struts.xml.

คลาส SystemDetails มีเมธอด execute () อย่างง่ายที่ส่งคืนสตริง "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>
  • คลิกขวาที่ชื่อโครงการแล้วคลิก Export > WAR File เพื่อสร้างไฟล์ War

  • จากนั้นปรับใช้ WAR นี้ในไดเร็กทอรี webapps ของ Tomcat

  • สุดท้ายเริ่มเซิร์ฟเวอร์ Tomcat และพยายามเข้าถึง URL http://localhost:8080/HelloWorldStruts2/system.action. สิ่งนี้จะสร้างหน้าจอต่อไปนี้ -

มีอะไรผิดปกติกับผลลัพธ์ข้างต้น? Struts รู้วิธีแสดงและแปลงสตริง "Windows XP SP3" และชนิดข้อมูลในตัวอื่น ๆ แต่ไม่ทราบว่าจะทำอย่างไรกับคุณสมบัติของEnvironmentชนิด. เรียกง่ายๆว่าtoString() วิธีการในชั้นเรียน

ในการแก้ไขปัญหานี้ให้เราสร้างและลงทะเบียนแบบง่าย TypeConverter สำหรับคลาส Environment

สร้างคลาสชื่อ EnvironmentConverter.java ดังต่อไปนี้

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

EnvironmentConverter ขยายไฟล์ StrutsTypeConverter คลาสและบอก Struts ถึงวิธีการแปลง Environment เป็น String และในทางกลับกันโดยการแทนที่สองวิธีคือ convertFromString() และ convertToString().

ตอนนี้ให้เราลงทะเบียนตัวแปลงนี้ก่อนที่เราจะใช้ในแอปพลิเคชันของเรา มีสองวิธีในการลงทะเบียนตัวแปลง

หากตัวแปลงจะใช้เฉพาะในการกระทำบางอย่างคุณจะต้องสร้างไฟล์คุณสมบัติที่ต้องตั้งชื่อเป็นไฟล์ '[action-class]'converstion.properties.

ในกรณีของเราเราสร้างไฟล์ชื่อ SystemDetails-converstion.properties ด้วยรายการลงทะเบียนดังต่อไปนี้ -

environment = com.tutorialspoint.struts2.EnvironmentConverter

ในตัวอย่างข้างต้น "สภาพแวดล้อม" คือชื่อของคุณสมบัติในไฟล์ SystemDetails.java ชั้นเรียนและเรากำลังบอกให้ Struts ใช้ไฟล์ EnvironmentConverter สำหรับการแปลงไปและกลับจากคุณสมบัตินี้

อย่างไรก็ตามเราจะไม่ทำเช่นนี้ แต่เราจะลงทะเบียนตัวแปลงนี้ทั่วโลกเพื่อให้สามารถใช้งานได้ตลอดทั้งแอปพลิเคชัน ในการดำเนินการนี้ให้สร้างไฟล์คุณสมบัติที่เรียกว่าxwork-conversion.properties ใน WEBINF/classes โฟลเดอร์ที่มีบรรทัดต่อไปนี้

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

เพียงแค่ลงทะเบียนตัวแปลงทั่วโลกดังนั้น Strutsสามารถทำการแปลงโดยอัตโนมัติทุกครั้งเมื่อพบอ็อบเจ็กต์ประเภท Environment ตอนนี้ถ้าคุณคอมไพล์ใหม่และรันโปรแกรมใหม่คุณจะได้ผลลัพธ์ที่ดีขึ้นดังนี้ -

เห็นได้ชัดว่าตอนนี้ผลลัพธ์จะดีขึ้นซึ่งหมายความว่าตัวแปลง Struts ของเราทำงานได้ดี

นี่คือวิธีที่คุณสามารถสร้างตัวแปลงหลายตัวและลงทะเบียนเพื่อใช้ตามความต้องการของคุณ