在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。這會給出以下畫面:
上面的輸出有什麼錯? 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的轉換工作正常。這是可以建立多個轉換器和按要求註冊後才能使用。