maven與springMVC之類型轉換器

在通過處理器方法參數接收request請求參數綁定數據的時候,對於一些簡單的數據類型Spring會幫我們自動進行類型轉換,而對於一些複雜的類型由於Spring沒法識別,所以也就不能幫助我們進行自動轉換了,這個時候如果我們需要Spring來幫我們自動轉換的話就需要我們給Spring註冊一個對特定類型的識別轉換器。Spring 允許我們提供兩種類型的識別轉換器,一種是註冊在Controller中的,一種是註冊在 SpringMVC 的配置文件中。聰明的讀者看到這裏應該可以想到它們的區別了,定義在Controller中的是局部的,只在當前Controller中有效,而放在SpringMVC配置文件中的是全局的,所有 Controller 都可以拿來使用。

1、在@InitBinder標記的方法中定義局部的類型轉換器

我們可以使用@InitBinder註解標註在Controller方法上,然後在方法體裏面註冊數據綁定的轉換器,這主要是通過 WebDataBinder 進行的。我們可以給需要註冊數據綁定的轉換器的方法一個 WebDataBinder 參數,然後給該方法加上 @InitBinder 註解,這樣當該Controller中在處理請求方法時如果發現有不能解析的對象的時候,就會看該類中是否有使用@InitBinder標記的方法,如果有就會執行該方法,然後看裏面定義的類型轉換器是否與當前需要的類型匹配。看代碼:

@Controller
@RequestMapping("/testInit")
public class InitialController {

	@InitBinder
	public void dataBinder(WebDataBinder binder) {
		System.out.println("dataBinder--->");
		DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
		PropertyEditor propertyEditor = new CustomDateEditor(dateFormat, true); // 第二個參數表示是否允許爲空
		binder.registerCustomEditor(Date.class, propertyEditor);
	}

	@RequestMapping("/testDate/{date}")
	public void testDate(@PathVariable("date") Date date, Writer writer) {
		DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
		try {
			writer.write("testDate:" + date);
			writer.write("\ngetTime:" + date.getTime());
			writer.write("\nfromatTime:" + dateFormat.format(date));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

測試結果如下:


並且在後臺dataBinder有打印,說明先通過了類型轉換器的轉換方法。

2、實現WebBindingInitializer接口定義全局的類型轉換器

如果需要定義全局的類型轉換器就需要實現自己的WebBindingInitializer對象,然後把該對象注入到RequestMappingHandlerAdapter中,這樣Spring在遇到自己不能解析的對象的時候就會到全局的WebBindingInitializer的initBinder方法中去找,每次遇到不認識的對象時,initBinder方法都會被執行一遍。先看WebBindingInitializer的實現類:

public class MyWebBindingInitializer implements WebBindingInitializer {

	public void initBinder(WebDataBinder binder, WebRequest request) {
		PropertyEditor userEditor = new PropertyEditorSupport() {

			@Override
			public String getAsText() {
				System.out.println("getAsText--->");
				User user = (User) getValue();
				return user.getName();
			}

			@Override
			public void setAsText(String userStr)
					throws IllegalArgumentException {
				System.out.println("setAsText--->" + userStr);
				User user = new User();
				user.setName(userStr);
				setValue(user);
			}
		};
		binder.registerCustomEditor(User.class, userEditor);

		DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
		PropertyEditor propertyEditor = new CustomDateEditor(dateFormat, true);
		binder.registerCustomEditor(Date.class, propertyEditor);
	}

}
此類有兩個特點:

1、此類的轉換器方法註冊了兩個PropertyEditor,分別是用來轉換User.class、Date.class。

2、轉換User.class的PropertyEditor是自定義的,轉換Date.class的是自帶的。

但是如果要是想用這個轉換器還需要在配置文件中配置如下代碼,需要注意的是,下面配置適合spring3.0以上的版本:

	<bean
		class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
		<property name="cacheSeconds" value="0" />
		<property name="webBindingInitializer">
			<bean class="com.wangpeng.testmodule.initialezers.MyWebBindingInitializer" />
		</property>
	</bean>
下面看一下測試類:

@Controller
@RequestMapping("testBinder")
public class BinderController {

	@RequestMapping("testUserDate")
	public void testUserDate(@RequestParam(value = "user") User user,
			@RequestParam(value = "date") Date date,
			HttpServletRequest request, HttpServletResponse response) {
		try {
			request.setCharacterEncoding("utf-8");
			response.setCharacterEncoding("UTF-8");
			response.setHeader("content-type", "text/html;charset=UTF-8");

			Writer writer = response.getWriter();
			DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

			writer.write("user:" + user.getName());
			writer.write("<br>getTime:" + date.getTime());
			writer.write("<br>fromatTime:" + dateFormat.format(date));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
測試結果如下:













發佈了94 篇原創文章 · 獲贊 46 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章