Struts2 型別轉換


在HTTP請求中的一切都被視為一個String由協定。這包括數位,布林值,整數,日期,小數和一切。每一件事情是一個字串,將根據HTTP。然而,Struts類可以有任何資料型別的屬性。Struts的自動裝配屬性?

Struts使用了多種型別轉換器在幕後做繁重。例如,如果Action類的屬性有一個整數,Struts的自動轉換請求引數的整數屬性沒有做任何事情。預設情況下,Struts的一些型別轉換器。下面列出了他們中的一些,如果您正在使用其中任何一個,那麼你有什麼可擔心的:

  • Integer, Float, Double, Decimal

  • Date and Datetime

  • Arrays and Collections

  • Enumerations

  • Boolean

  • BigDecimal

有些時候,當使用自己的資料型別,它是需要新增自己的轉換,使Struts知道如何將這些值,然後顯示。考慮以下POJO類Environment.java。

package com.yiibai.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.yiibai.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.yiibai.struts2.SystemDetails" 
            method="execute">
         <result name="success">/System.jsp</result>
      </action>
   </package>
</struts>

右鍵點選專案名稱,並單擊 Export > WAR File 建立一個WAR檔案。然後部署此WAR在Tomcat的webapps目錄下。最後,啟動Tomcat伺服器和嘗試存取URL http://localhost:8080/HelloWorldStruts2/system.action。這會給出以下畫面:

System Info

上面的輸出有什麼錯? Struts 知道如何顯示字串“Windows XP SP3”等內建資料型別轉換,但它不知道用Environmenttype屬性做什麼。所以,它只是被稱為類的toString()方法。為了解決這個問題,現在讓我們建立並註冊一個簡單的TypeConverter環境類。建立一個類名為EnvironmentConverter.java以下。

package com.yiibai.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 類,如何將環境為一個 String,反之亦然通過重寫兩個的方法 convertFromString()和 convertToString()並通知了Struts。現在,讓我們註冊這個轉換器之前,我們我們在我們的應用程式。有兩種方法來註冊一個轉換器。如果轉換器將只用於在一個特定的動作,那麼將需要建立一個屬性檔案需要被命名為 '[action-class]'-converstion.properties,所以,在我們的例子中,我們建立一個名為SystemDetails下面的註冊 converstion.properties 輸入: 

environment=com.yiibai.struts2.EnvironmentConverter

在上面的例子中,“environment”的名字是在SystemDetails.java 類的一個屬性,告訴要使用Struts EnvironmentConverter從這個屬性的轉換。但是,我們不打算這樣做,相反,我們要在全域性範圍內註冊這個轉換器,因此,它可以在整個應用程式。要做到這一點,建立一個屬性檔案名為 xwork-conversion.properties 在 WEB-INF/classes檔案夾下面一行:

com.yiibai.struts2.Environment = 
            com.yiibai.struts2.EnvironmentConverter

這簡單的註冊全域性轉換器,這樣的Struts可以自動做轉換每次遇到一個物件型別的環境。現在,如果重新編譯並重新執行該程式,會得到更好的輸出如下:

System Info

很顯然,現在的結果是更好的,這意味著我們的Struts的轉換工作正常。這是可以建立多個轉換器和按要求註冊後才能使用。