鍍金池/ 教程/ Java/ 類型轉(zhuǎn)換
注釋
主題/模板
驗(yàn)證
有用的資源
Struts 2 注解類型
實(shí)例
攔截器
異常處理
表單標(biāo)簽
結(jié)果類型
值棧/OGNL
Spring 集成
數(shù)據(jù)標(biāo)簽
環(huán)境配置
配置
類型轉(zhuǎn)換
動(dòng)作
Hibernate 集成
本地化
發(fā)送郵件
Ajax 標(biāo)簽
數(shù)據(jù)庫(kù)訪問(wèn)
體系結(jié)構(gòu)
文件上傳
Tiles 集成
概述
基本的 MVC 架構(gòu)
控制標(biāo)簽

類型轉(zhuǎn)換

所有 HTTP 請(qǐng)求都被視為一個(gè) String 的協(xié)議。它包括數(shù)字,布爾值,整數(shù),日期,小數(shù)和其他的一切。根據(jù) HTTP,將所有類型都看成一個(gè)字符串。然而,在 Struts 類中,你會(huì)有任何數(shù)據(jù)類型的屬性。Struts 是如何自動(dòng)裝配的屬性?

Struts 在幕后使用了多種類型轉(zhuǎn)換器用來(lái)做繁重的工作。例如,如果在動(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

  • BigDecimal

有時(shí)候,當(dāng)你使用自己的數(shù)據(jù)類型時(shí),它需要添加自己的轉(zhuǎn)換來(lái)使 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è)非常簡(jiǎn)單的類,它有一個(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;
   }
}

接下來(lái)讓我們創(chuàng)建一個(gè)簡(jiǎn)單的 JSP 文件 System.jsp 來(lái)顯示環(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 來(lái)同時(shí)編寫 system.jspSystemDetails.java 類。SystemDetails 類有一個(gè)簡(jiǎn)單的 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 來(lái)創(chuàng)建一個(gè) War 文件。然后在 Tomcat 的 webapps 目錄下部署這個(gè) WAR。最后,啟動(dòng) Tomcat 服務(wù)器和嘗試訪問(wèn) 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è)問(wèn)題,現(xiàn)在,讓我們?yōu)榄h(huán)境類創(chuàng)建并注冊(cè)一個(gè)簡(jiǎn)單的 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 如何通過(guò)重寫兩個(gè)方法 convertFromString()convertToString() 把環(huán)境轉(zhuǎn)換為一個(gè)字符串,反之亦然?,F(xiàn)在,讓我們?cè)趹?yīng)用程序中使用這個(gè)轉(zhuǎn)換器之前注冊(cè)它。有兩種注冊(cè)轉(zhuǎn)換器的方法。如果轉(zhuǎn)換器將只用于一個(gè)特定的動(dòng)作中,那么你將需要?jiǎng)?chuàng)建一個(gè)屬性文件,它需要被命名為 '[action-class]'-converstion.properties,所以,在我們的例子中,我們創(chuàng)建一個(gè)帶有下面的注冊(cè)入口的文件,名為 SystemDetails-converstion.properties

environment=com.tutorialspoint.struts2.EnvironmentConverter

在上面的例子中,“environment” 是 SystemDetails.java 類中一個(gè)屬性的名字,我們告訴 Struts 為了來(lái)回轉(zhuǎn)換這個(gè)屬性要使用 EnvironmentConverter。然而,我們不會(huì)這樣做,相反,我們會(huì)在全局范圍內(nèi)注冊(cè)這個(gè)轉(zhuǎn)換器,以便它可以在整個(gè)應(yīng)用程序中使用。為了做到這個(gè),在 WEB-INF/classes 文件夾下創(chuàng)建一個(gè)帶有下面句子的屬性文件,名為 xwork-conversion.properties

com.tutorialspoint.struts2.Environment = \ com.tutorialspoint.struts2.EnvironmentConverter

它簡(jiǎn)單地在全局范圍內(nèi)注冊(cè)轉(zhuǎn)換器,為此每次 Struts 遇到一個(gè)環(huán)境類型的對(duì)象,就可以自動(dòng)做轉(zhuǎn)換?,F(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)換器,并且注冊(cè)它們后使用。

上一篇:發(fā)送郵件下一篇:實(shí)例