自定義類型轉(zhuǎn)換器的作用就是將struts無法識別的類型轉(zhuǎn)換成自己所需要的.
比如輸入:廣東-東莞-虎門,對應(yīng)的輸出時能輸出:廣東省 東莞市 虎門(鎮(zhèn)/區(qū))
這里涉及到的知識點即是將String轉(zhuǎn)換為任意的JavaBean類型.
一.實現(xiàn)代碼
程序配置入口:struts.xml
復(fù)制代碼
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
復(fù)制代碼
注:struts.xml是在項目運行的過程中被加載進入內(nèi)存的,是項目配置的總?cè)肟?這里使用
type_struts.xml
復(fù)制代碼
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
/WEB-INF/type_self_success.jsp
/type_self.jsp
復(fù)制代碼
注:type_struts.xml是具體負(fù)責(zé)類型轉(zhuǎn)換時的配置,這里配置了對應(yīng)的type.TypeSelfAction,以及成功后的跳轉(zhuǎn)頁面type_self_success.jsp和程序出錯時
的跳轉(zhuǎn)頁面type_self.jsp,并將消息回顯.
type_self.jsp
復(fù)制代碼
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
復(fù)制代碼
注:type_self.jsp 是用戶訪問項目的入口,效果圖如下所示:
其中使用POST請求方式是為了避免中文亂碼等問題,使用struts自帶的標(biāo)簽,如s:password,s:textfield等是為了簡化開發(fā),并且使錯誤消息方便回顯.
TypeSelfAction.java
View Code
注:TypeSelfAction是一個與配置文件type_struts.xml相對應(yīng)的JavaBean文件.
Address.java
View Code
注:Address是關(guān)于地址的JavaBean,其分為省份,市,區(qū)域三級.
為了實現(xiàn)自定義類型轉(zhuǎn)換還必須實現(xiàn)StrutsTypeConverter的擴展,這里要手動寫兩個方法將JavaBean轉(zhuǎn)為String和將String轉(zhuǎn)為JavaBean.
TypeAddressConverter.java
復(fù)制代碼
package type;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
/**
* @ClassName: TypeAddressConverter
* @Description: 自定義類型轉(zhuǎn)換器,繼承自StrutsTypeConverter,可以將String轉(zhuǎn)換成任意javaBean對象
* @author: amosli
* @email:amosli@infomorrow.com
* @date Feb 13, 2014 11:42:42 PM
*/
public class TypeAddressConverter extends StrutsTypeConverter {
public TypeAddressConverter() {
System.out.println("constructor!");
}
//將String轉(zhuǎn)為對象返回
public Object convertFromString(Map context, String[] values, Class toClass) {
System.out.println("convertFromString");
// System.out.println("context:"+context);
// System.out.println("class:"+toClass);
// System.out.println("values:"+Arrays.toString(values));
if (Address.class == toClass) {// 判斷類型是否為將要轉(zhuǎn)成的JavaBean
String[] split = values[0].toString().split("-");//頁面中的字符串,下標(biāo)為0表示第一個字符串,這里如果有多個可以依此類推.
String province = split[0];// 省份
String city = split[1];// 市
String area = split[2];// 區(qū)
Address address = new Address(province, city, area);
return address;
}
return null;
}
//將對象轉(zhuǎn)為String返回
public String convertToString(Map context, Object o) {
System.out.println("convertToString");
if (o instanceof Address) {// 判斷對象類型是否為Adress
Address adr = (Address) o;
return adr.toString();
}
return null;
}
}
復(fù)制代碼
注:這里是自定義類型轉(zhuǎn)換的核心代碼,即如何將一個JavaBean轉(zhuǎn)為String和將String轉(zhuǎn)為JavaBean.
為了調(diào)用上面的方法還必須加一個配置.
xwork-conversion.properties
#JavaBean=self defined typeconverter
type.Address=type.TypeAddressConverter