Struts 2 - 型別轉換



HTTP請求中的所有內容都由協議視為字串。這包括數字、布林值、整數、日期、小數等等。但是,在Struts類中,您可以擁有任何資料型別的屬性。

Struts是如何自動為您連線屬性的?

Struts在後臺使用各種型別轉換器來完成繁重的工作。

例如,如果您的Action類中有一個整數屬性,Struts會自動將請求引數轉換為整數屬性,而無需您執行任何操作。預設情況下,Struts附帶許多型別轉換器。

如果您正在使用下面列出的任何轉換器,則無需擔心:

  • 整數、浮點數、雙精度數、十進位制數
  • 日期和日期時間
  • 陣列和集合
  • 列舉
  • 布林值
  • 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

為了本練習的目的,我將Environment硬編碼為“Development”,作業系統為“Windows XP SP3”。

在實際專案中,您將從系統配置中獲取此資訊。

讓我們使用以下action類:

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>

讓我們使用struts.xmlsystem.jspSystemDetails.java類連線起來。

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>
  • 右鍵單擊專案名稱,然後單擊匯出 > WAR檔案以建立WAR檔案。

  • 然後將此WAR部署到Tomcat的webapps目錄中。

  • 最後,啟動Tomcat伺服器並嘗試訪問URL https://:8080/HelloWorldStruts2/system.action。這將生成以下螢幕:

System Info

上述輸出有什麼問題?Struts知道如何顯示和轉換字串“Windows XP SP3”和其他內建資料型別,但它不知道如何處理Environment型別的屬性。它只是簡單地呼叫了類的toString()方法。

為了解決這個問題,讓我們現在為Environment類建立一個並註冊一個簡單的TypeConverter

建立一個名為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轉換為字串以及反過來轉換,這兩個方法是convertFromString()convertToString()

在我們應用程式中使用它之前,讓我們現在註冊此轉換器。註冊轉換器有兩種方法。

如果轉換器只在一個特定的action中使用,那麼您必須建立一個屬性檔案,該檔案的名稱必須為'[action-class]'converstion.properties

在我們的例子中,我們建立一個名為SystemDetails-converstion.properties的檔案,其中包含以下注冊項:

environment = com.tutorialspoint.struts2.EnvironmentConverter

在上面的例子中,“environment”是SystemDetails.java類中屬性的名稱,我們告訴Struts使用EnvironmentConverter來轉換此屬性。

但是,我們不會這樣做,我們將全域性註冊此轉換器,以便可以在整個應用程式中使用它。為此,在WEB-INF/classes資料夾中建立一個名為xwork-conversion.properties的屬性檔案,其中包含以下行:

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

這只是全域性註冊轉換器,以便Struts在每次遇到Environment型別物件時都可以自動進行轉換。現在,如果您重新編譯並重新執行程式,您將得到更好的輸出,如下所示:

System Info

顯然,現在的結果會更好,這意味著我們的Struts轉換器工作正常。

這就是您可以建立多個轉換器並根據您的需求註冊它們的方法。

廣告
© . All rights reserved.