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"%>
Operating System:<s:property value="operatingSystem"/>
讓我們編寫 system.jsp,SystemDetails.java類在struts.xml一起使用。 SystemDetails類有一個簡單的execute()方法返回字符串「SUCCESS」。
右鍵點擊項目名稱,並單擊 Export > WAR File 創建一個WAR文件。然後部署此WAR在Tomcat的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/system.action。這會給出以下畫面:
上面的輸出有什麼錯? 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可以自動做轉換每次遇到一個對象類型的環境。現在,如果重新編譯並重新運行該程序,會得到更好的輸出如下:
很顯然,現在的結果是更好的,這意味着我們的Struts的轉換工作正常。這是可以創建多個轉換器和按要求註冊後才能使用。