struts轉換器:在B/S應用中,將字符串請求參數轉換為相應的數據類型,是MVC框架提供的功能,而Struts2是很好的MVC框架實現者,理所當然,提供了類型轉換機制。
一、類型轉換的意義
對於一個智能的MVC框架而言,不可避免的需要實現類型轉換.因為B/S(瀏覽器/服務器)結構應用的請求參數是通過瀏覽器發送到服務器的,這些參數不可能有豐富的數據類型,因此必須在服務器端完成數據類型的轉換
MVC框架是一個表現層解決方案,理應提供類型轉換的支持,Struts2提供了功能非常強大的類型轉換支持.
二、表現層數據的處理
1、對於web應用而言,表現層主要用於與用戶交互,包括收集用戶輸入數據,向用戶呈現服務器的狀態。因此表現層的數據的流向主要有兩個方向:輸入數據和輸出數據。
2、對於輸入數據:則需要完成由字符串數據向多種類型數據的轉化。程序通常無法自動完成,需要在代碼中手動轉化
3、對於輸出數據:不管是java或是jsp都支持多種數據類型的直接輸出。
4、表現層另外一個數據處理是:數據校驗,分為客戶校驗和服務器端校驗.后邊會重點講解
三、類型轉換
1、HTTP參數都是字符串類型。 保存的數據可能是字符串、數字、布爾、日期時間等或者JavaBean類型。 手工的類型轉換,比如將字符串轉換為日期,通過: 通過request.getParameter方法獲取字符串; 檢查是否為空; 通過DateFormat.parse方法將字符串轉換為Date對象
2、Struts2類型轉換
Struts2內置的類型轉換
String和boolean 完成字符串與布爾值之間的轉換
String和char 往常字符串與字符之間的轉換
String和int、Integer 完成字符串與整型之間的轉換
String和Long 完成字符串與長整型值之間的轉換
String和double、Double 完成字符串與雙精度浮點值的轉換
String和Float 完成字符串和單精度浮點之間的轉換
String和Date 完成字符串和日期類型之間的轉換,日期格式使用格式用戶請求所在Locale的SHORT格式
String和數組 在默認的情況,數組元素是字符串,如果用戶定義類型轉換器,也可以是其它復合數據類型
String和Map、List
那么何時使用轉換器?
當輸入界面/輸出界面 與 對象/數據庫不是一一對應的關系,或者格式不一樣時。例如輸入身份證號,自動解析出生日或其它信息。
首先做一個Student.java類:
package com.dao; public class Student { private String name; private String idcard; private String birthday; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getIdcard() { return idcard; } public void setIdcard(String idcard) { this.idcard = idcard; } public String getBirthday() { return birthday; } public void setBirthday(String birthday) { this.birthday = birthday; } }
再做一個StudentAction.java類:
package com.controller; import com.dao.Student; import com.opensymphony.xwork2.ActionSupport; public class StudentAction extends ActionSupport { private Student stu; public Student getStu() { return stu; } public void setStu(Student stu) { this.stu = stu; } public String input(){ return SUCCESS; } public String show(){ return SUCCESS; } }
配置struts.xml文件:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.devMode" value="false" /> <package name="default" namespace="/" extends="struts-default"> <action name="*_*" class="com.controller.{1}Action" method="{2}"> <result> {1}/{2}.jsp </result> </action> </package> </struts>
創建文件夾Student,再創建input.jsp:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Insert title here</title> </head> <body> <h1>輸入學生信息</h1> <form action="Student_show" method="post"> 姓名:<input type="text" name="stu.name" ><br> //這里的name=“stu.name” 就不用走轉換器轉換,因為通過后面頁面接受的數據可以看出,直接就接收的事stu.name類型。 身份證號:<input type="text" name="stu" ><br> //這里的name=“stu”就是走的轉換器轉換,因為他定義的事stu這個實體類,必須通過轉換器轉換成他的成員類 <input type="submit" value="go" > </form> </body> </html>
創建show.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> ${stu.name }---${stu.idcard }---${stu.birthday } </body> </html>
下面就是創建一個攔截器名為StudentConverter.java:
package com.util; import java.util.Map; import org.apache.struts2.util.StrutsTypeConverter; import com.dao.Student; public class StudentConverter extends StrutsTypeConverter { @Override public Object convertFromString(Map arg0, String[] arg1, Class arg2) {//字符串-->對象 String str= arg1[0]; String year = str.substring(6, 10); String month = str.substring(10,12); String day = str.substring(12,14); Student stu = new Student(); stu.setBirthday(year+"-"+month+"-"+day); stu.setIdcard(str); return stu; } @Override public String convertToString(Map arg0, Object arg1) {//對象-->字符串 // TODO 自動生成的方法存根 return null; } }
再就是在src根目錄下創建一個文件,名為xwork-conversion.properties:
com.dao.Student=com.util.StudentConverter;
上面這句話的意思為實體類與轉換類的二者完全限定名對應關系。
其實這里有兩種配制方法:
第一種:全局配置。在src根下,建立xwork-conversion.properties文件。配置好實體類與轉換類的二者完全限定名對應關系。
第二種:局部配置。在action的包里面,建立Action類名-conversion.properties文件(StudentAction-conversion.properties)。
配置好成員變量與轉換類的對應關系。stu=com.itnba.maya.util.StudentConverter
實現效果如下: