所有 HTTP 請(qǐng)求都被視為一個(gè) String 的協(xié)議。它包括數(shù)字,布爾值,整數(shù),日期,小數(shù)和其他的一切。根據(jù) HTTP,將所有類型都看成一個(gè)字符串。然而,在 Struts 類中,你會(huì)有任何數(shù)據(jù)類型的屬性。Struts 是如何自動(dòng)裝配的屬性?
Struts 在幕后使用了多種類型轉(zhuǎn)換器用來做繁重的工作。例如,如果在動(dòng)作類中你有一個(gè)整數(shù)的屬性,那么你不用做任何事情,Struts 就會(huì)自動(dòng)轉(zhuǎn)換請(qǐng)求參數(shù)到整數(shù)屬性。默認(rèn)情況下,Struts 附帶了一些類型轉(zhuǎn)換器。下面列出了它們中的一些,如果你正在使用它們中的一個(gè),那么你就沒有什么可擔(dān)心的:
Integer,F(xiàn)loat,Double,Decimal
Date 和 Datetime
Arrays 和 Collections
Enumerations
Boolean
有時(shí)候,當(dāng)你使用自己的數(shù)據(jù)類型時(shí),它需要添加自己的轉(zhuǎn)換來使 Struts 知道如何在顯示之前轉(zhuǎn)換這些值??紤]下面的 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;
}
}
這是一個(gè)非常簡單的類,它有一個(gè)名為 name 的屬性,所以這個(gè)類并沒有什么特別之處。讓我們創(chuàng)建另一個(gè)類,它包含關(guān)于系統(tǒng) - SystemDetails.java 的信息。為了這個(gè)練習(xí),我有硬編碼環(huán)境 “Development” 和操作系統(tǒng) “Windows XP SP3”。在實(shí)際項(xiàng)目中,你會(huì)從系統(tǒng)配置中得到這個(gè)信息。所以,讓我們有下面的動(dòng)作類:
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;
}
}
接下來讓我們創(chuàng)建一個(gè)簡單的 JSP 文件 System.jsp 來顯示環(huán)境和操作系統(tǒng)信息。
<%@ 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.xml 來同時(shí)編寫 system.jsp 和 SystemDetails.java 類。SystemDetails 類有一個(gè)簡單的 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>
在項(xiàng)目名稱上點(diǎn)擊右鍵,并且單擊 Export > WAR File 來創(chuàng)建一個(gè) War 文件。然后在 Tomcat 的 webapps 目錄下部署這個(gè) WAR。最后,啟動(dòng) Tomcat 服務(wù)器和嘗試訪問 URL http://localhost:8080/HelloWorldStruts2/system.action
。將會(huì)給出下面的畫面:
http://wiki.jikexueyuan.com/project/struts-2/images/helloworldstruts17.gif" alt="" />
上面的輸出有什么錯(cuò)?Struts 知道如何顯示和轉(zhuǎn)換字符串 “Windows XP SP3” 和其他內(nèi)置數(shù)據(jù)類型,但是它不知道如何處理環(huán)境類型的屬性。所以,它僅僅被稱為類中的 toString() 方法。為了解決這個(gè)問題,現(xiàn)在,讓我們?yōu)榄h(huán)境類創(chuàng)建并注冊一個(gè)簡單的 TypeConverter。創(chuàng)建一個(gè)類,名為 EnvironmentConverter.java,內(nèi)容如下所示。
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 擴(kuò)展了 StrutsTypeConverter 類,告訴 Struts 如何通過重寫兩個(gè)方法 convertFromString() 和 convertToString() 把環(huán)境轉(zhuǎn)換為一個(gè)字符串,反之亦然。現(xiàn)在,讓我們在應(yīng)用程序中使用這個(gè)轉(zhuǎn)換器之前注冊它。有兩種注冊轉(zhuǎn)換器的方法。如果轉(zhuǎn)換器將只用于一個(gè)特定的動(dòng)作中,那么你將需要?jiǎng)?chuàng)建一個(gè)屬性文件,它需要被命名為 '[action-class]'-converstion.properties,所以,在我們的例子中,我們創(chuàng)建一個(gè)帶有下面的注冊入口的文件,名為 SystemDetails-converstion.properties:
environment=com.tutorialspoint.struts2.EnvironmentConverter
在上面的例子中,“environment” 是 SystemDetails.java 類中一個(gè)屬性的名字,我們告訴 Struts 為了來回轉(zhuǎn)換這個(gè)屬性要使用 EnvironmentConverter。然而,我們不會(huì)這樣做,相反,我們會(huì)在全局范圍內(nèi)注冊這個(gè)轉(zhuǎn)換器,以便它可以在整個(gè)應(yīng)用程序中使用。為了做到這個(gè),在 WEB-INF/classes 文件夾下創(chuàng)建一個(gè)帶有下面句子的屬性文件,名為 xwork-conversion.properties:
com.tutorialspoint.struts2.Environment = \ com.tutorialspoint.struts2.EnvironmentConverter
它簡單地在全局范圍內(nèi)注冊轉(zhuǎn)換器,為此每次 Struts 遇到一個(gè)環(huán)境類型的對(duì)象,就可以自動(dòng)做轉(zhuǎn)換。現(xiàn)在,如果你重新編譯并重新運(yùn)行該程序,你將會(huì)得到更好的輸出,如下所示:
http://wiki.jikexueyuan.com/project/struts-2/images/helloworldstruts18.gif" alt="" />
顯然,現(xiàn)在的結(jié)果更好,這意味著我們的 Struts 轉(zhuǎn)換器工作正常。這就是你可以按你的需求創(chuàng)建多個(gè)轉(zhuǎn)換器,并且注冊它們后使用。