- Struts 2 教程
- Struts2 - 首頁
- Struts2 - 基本MVC架構
- Struts2 - 概述
- Struts2 - 環境搭建
- Struts2 - 架構
- Struts2 - 示例
- Struts2 - 配置
- Struts2 - Action
- Struts2 - 攔截器
- Struts2 - 結果型別
- Struts2 - 值棧/OGNL
- Struts2 - 檔案上傳
- Struts2 - 資料庫訪問
- Struts2 - 傳送郵件
- Struts2 - 驗證
- Struts2 - 國際化
- Struts2 - 型別轉換
- Struts2 - 主題/模板
- Struts2 - 異常處理
- Struts2 - 註解
- Struts 2 標籤
- Struts2 - 控制標籤
- Struts2 - 資料標籤
- Struts2 - 表單標籤
- Struts2 - Ajax標籤
- Struts 2 整合
- Struts2 - Spring
- Struts2 - Tiles
- Struts2 - Hibernate
- Struts 2 有用資源
- Struts2 - 問答
- Struts2 - 快速指南
- Struts2 - 有用資源
- Struts2 - 討論
Struts 2 - 型別轉換
HTTP請求中的所有內容都由協議視為字串。這包括數字、布林值、整數、日期、小數等等。但是,在Struts類中,您可以擁有任何資料型別的屬性。
Struts是如何自動為您連線屬性的?
Struts在後臺使用各種型別轉換器來完成繁重的工作。
例如,如果您的Action類中有一個整數屬性,Struts會自動將請求引數轉換為整數屬性,而無需您執行任何操作。預設情況下,Struts附帶許多型別轉換器。
如果您正在使用下面列出的任何轉換器,則無需擔心:
- 整數、浮點數、雙精度數、十進位制數
- 日期和日期時間
- 陣列和集合
- 列舉
- 布林值
- 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。
為了本練習的目的,我將Environment硬編碼為“Development”,作業系統為“Windows XP SP3”。
在實際專案中,您將從系統配置中獲取此資訊。
讓我們使用以下action類:
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>
讓我們使用struts.xml將system.jsp和SystemDetails.java類連線起來。
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 https://:8080/HelloWorldStruts2/system.action。這將生成以下螢幕:
上述輸出有什麼問題?Struts知道如何顯示和轉換字串“Windows XP SP3”和其他內建資料型別,但它不知道如何處理Environment型別的屬性。它只是簡單地呼叫了類的toString()方法。
為了解決這個問題,讓我們現在為Environment類建立一個並註冊一個簡單的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如何將Environment轉換為字串以及反過來轉換,這兩個方法是convertFromString()和convertToString()。
在我們應用程式中使用它之前,讓我們現在註冊此轉換器。註冊轉換器有兩種方法。
如果轉換器只在一個特定的action中使用,那麼您必須建立一個屬性檔案,該檔案的名稱必須為'[action-class]'converstion.properties。
在我們的例子中,我們建立一個名為SystemDetails-converstion.properties的檔案,其中包含以下注冊項:
environment = com.tutorialspoint.struts2.EnvironmentConverter
在上面的例子中,“environment”是SystemDetails.java類中屬性的名稱,我們告訴Struts使用EnvironmentConverter來轉換此屬性。
但是,我們不會這樣做,我們將全域性註冊此轉換器,以便可以在整個應用程式中使用它。為此,在WEB-INF/classes資料夾中建立一個名為xwork-conversion.properties的屬性檔案,其中包含以下行:
com.tutorialspoint.struts2.Environment = \ com.tutorialspoint.struts2.EnvironmentConverter
這只是全域性註冊轉換器,以便Struts在每次遇到Environment型別物件時都可以自動進行轉換。現在,如果您重新編譯並重新執行程式,您將得到更好的輸出,如下所示:
顯然,現在的結果會更好,這意味著我們的Struts轉換器工作正常。
這就是您可以建立多個轉換器並根據您的需求註冊它們的方法。