在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.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 類及 usingstruts.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>
右鍵點擊項目名稱,並單擊“導出”> WAR文件創建一個WAR文件。然後,這WAR部署在Tomcat的webapps目錄下。最後,啟動Tomcat服務器,並嘗試訪問URL http://localhost:8080/HelloWorldStruts2/system.action。這會給你以下畫麵:
用上麵的輸出,什麼是錯呢? Struts的知道如何顯示和轉換字符串的“Windows XP SP3”等內置數據類型,但不知道做什麼用的環境類型的屬性。因此,它簡單地稱為toString()方法的類。
要解決這個問題,現在讓我們創建並注冊一個簡單的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環境如何轉換到通過重寫兩個的方法convertFromString()和convertToString(),一個字符串,反之亦然。現在讓我們來注冊該轉換器之前,我們我們在我們的應用程序。有兩種方式來注冊一個轉換器。如果轉換器將隻被用於在一個特定的動作,那麼將創建一個屬性文件需要被命名為“[action-class]' - converstion.properties,因此,在我們的例子中,我們創建一個名為SystemDetails converstion.properties:
environment=com.tutorialspoint.struts2.EnvironmentConverter
在上麵的例子中,“環境”這個名字的財產在SystemDetails.java類,我們告訴Struts的轉換和從該屬性的使用EnvironmentConverterfor。但是,我們不打算這樣做,相反,我們要在全球範圍內注冊該轉換器,因此,它可以在整個應用程序。要做到這一點,創建一個屬性文件稱為XWork的conversion.properties在WEB-INF/classes文件夾下麵的行:
com.tutorialspoint.struts2.Environment = \ com.tutorialspoint.struts2.EnvironmentConverter
這隻是全局注冊的轉換器,使的Struts可以自動轉換每次遇到的對象類型的環境。現在,如果重新編譯並重新運行該程序會得到更好的輸出如下:
顯然,現在的結果是更好的,這意味著我們的Struts轉換器工作正常。這是你如何可以創建多個轉換器和注冊後才能使用按您的要求。