Struts2類型轉換 struts2中內置了大量的類型轉換器用來完成數據類型轉換的問題,這篇隨筆主要通過兩個方面來寫Struts類型轉換 1:Struts2內置的類型轉換器 2:如何自定義類型轉換器 那麼首先我們來學習有關Struts2內置的類型 1:Struts2內置的類型轉換器 Struts2 ...
Struts2類型轉換
struts2中內置了大量的類型轉換器用來完成數據類型轉換的問題,這篇隨筆主要通過兩個方面來寫Struts類型轉換
1:Struts2內置的類型轉換器
2:如何自定義類型轉換器
那麼首先我們來學習有關Struts2內置的類型
1:Struts2內置的類型轉換器
Struts2的內置類型轉換器,可以為你處理大多數的類型轉換,這包括了以下類型和String類型之間的轉換!
1.String
將int,double,boolean,String類型的數組或java.util.Date類型轉換成字元串。
2:boolean和Boolean
在字元串與boolean之間轉換
3:char/Character
在字元串和字元之間轉換
4:int/Integer,float/Float,long/Long,double/Double
在字元串與數值類型之間進行轉換
5:date
在字元串和日期類型之間進行轉換,預設格式是:YYYY-MM-DD
6:數組
由於數組本身就有類型,可以將多個同名參數,轉換到數組中(在之前總結的興趣愛好多選擇,如果你選擇多個,同時他們name屬性相同就自動變為數組)
7:集合
支持將數據保存到 List 或者 Map 集合
關於內置類型轉換器舉例:
Action類
1 import java.util.Date; 2 import com.opensymphony.xwork2.ActionSupport; 3 4 public class CustomerAction extends ActionSupport { 5 6 private String username; 7 8 private int age; 9 10 private Date birthday; 11 12 @Override 13 public String execute() throws Exception { 14 System.out.println("客戶姓名是:" + username + ",年齡是:" + age + ",生日:" + birthday); 15 16 return NONE; 17 } 18 public void setUsername(String username) { 19 this.username = username; 20 } 21 public void setAge(int age) { 22 this.age = age; 23 } 24 public void setBirthday(Date birthday) { 25 this.birthday = birthday; 26 } 27 } 28 /*控制台輸出結果:客戶姓名是:zhangsan,年齡是:12,生日:Tue Jul 09 00:00:00 CST 1996 29 */
jsp界面
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <html> 3 <head> 4 </head> 5 <body> 6 <form action="${pageContext.request.contextPath }/customer.action"> 7 客戶姓名:<input type="text" name="username"><br/> 8 年齡:<input type="text" name="age"><br/> 9 生日:<input type="text" name="birthday"><br/> 10 <input type="submit" value="提交"> 11 </form> 12 </body> 13 </html>
界面輸入:這裡年齡只能輸入合法年齡,日期的預設格式:yyyy-MM-dd,如果你輸入不合規則網頁會報錯,比如你輸入1996/7/9頁面就會報錯
2:如何自定義類型轉換器
為什麼需要自定義類型轉換器,這個問題相信大家都知道,就像我上面所說的,日期的預設格式是yyyy-MM-dd,那如果你想輸入yyyy/mm/dd或者其它的
這個時候就需要你修改你自己的類型轉換器,否則會報錯。下麵我寫一個有關自定義類型轉換器的方法: 繼承StrutsTypeConverter
DateConverter
1 import java.text.DateFormat; 2 import java.text.ParseException; 3 import java.text.SimpleDateFormat; 4 import java.util.Date; 5 import java.util.Map; 6 7 import javax.xml.bind.TypeConstraintException; 8 import org.apache.struts2.util.StrutsTypeConverter; 9 10 public class DateConverter extends StrutsTypeConverter { 11 //為方便支持多種日期格式的轉換,可增加時間格式 12 private final DateFormat [] dateformats={ 13 new SimpleDateFormat("yyyy-MM-dd"), 14 new SimpleDateFormat("yyyy年MM月dd日"), 15 new SimpleDateFormat("yyyy.MM.dd"), 16 new SimpleDateFormat("yyyy/MM/dd") 17 }; 18 /* 將一個或多個字元串值轉換為指定的類型 19 * 20 */ 21 @Override 22 public Object convertFromString(Map arg0, String[] values, Class toType) { 23 //從表單獲取的日期字元串 24 String dateStr = values[0];//思考:這裡為什麼是數組而不是字元串?我自己也沒有搞明白,希望大神看到後宰評論區給予解答,謝謝 25 for(int i = 0;i<dateformats.length;i++){//遍歷日期類型進行轉換 26 27 try { //SimpleDateFormat類中parse()方法用於將輸入的特定字元串轉換成Date類的對象 28 return dateformats[i].parse(dateStr); 29 } catch (Exception e) { 30 continue; //很關鍵 31 } 32 } 33 throw new TypeConstraintException("遍歷結束仍沒有指定的類型轉換"); 34 } 35 36 /* 將指定對象轉化為字元串 37 * method:這個方法是用來回顯用的,就是你需要回顯成什麼樣的格式就可以設置什麼樣的格式 38 */ 39 @Override 40 public String convertToString(Map context, Object object) { 41 Date date = (Date) object; 42 //指定輸出的格式 43 return new SimpleDateFormat("yyyy年MM月dd日").format(date); 44 } 45 } 46 /*主要講這裡的continue,就是如果你是輸入的是1992-2-2,那麼dateformats[0]和你直接匹配 47 * 那麼直接返回,當如果你開始輸入的是1992/2/2那麼就和dateformats[0]不匹配,那麼出現異常執行 48 * catch中的內容,而catch中是continue代表終止本次迴圈進入下一次迴圈,那麼有和dateformats[1] 49 * 進行匹配,如果都不匹配才會異常,所以這裡用的太關鍵了 50 *
Aation(類)
1 import java.util.Date; 2 import com.opensymphony.xwork2.ActionSupport; 3 4 public class RegisterAction1 extends ActionSupport { 5 private Date brithday1; 6 private Date brithday2; 7 private Date brithday3; 8 private Date brithday4; 9 /* 10 * 為上面四個提供set和get方法 11 */ 12 13 @Override 14 public String execute() throws Exception { 15 //獲取表單的數據 16 System.out.println("生日1"+brithday1); 17 System.out.println("生日2"+brithday2); 18 System.out.println("生日3"+brithday3); 19 System.out.println("生日4"+brithday4); 20 return SUCCESS; 21 } 22 } 23 /*後臺輸出結果: 24 * 生日1Sun Feb 02 00:00:00 CST 1992 25 * 生日2Sun Feb 02 00:00:00 CST 1992 26 * 生日3Sun Feb 02 00:00:00 CST 1992 27 * 生日4Sun Feb 02 00:00:00 CST 1992 28 */
register.jsp(登錄界面)
1 <html> 2 <head> 3 <title>註冊</title> 4 </head> 5 <body> 6 <!-- 這裡有四個生日 --> 7 <form action="${pageContext.request.contextPath }/register1.action" method="post"> 8 生日1:<input type="text" name="brithday1"><br/><br/> 9 生日2:<input type="text" name="brithday2"><br/><br/> 10 生日3:<input type="text" name="brithday3"><br/><br/> 11 生日4:<input type="text" name="brithday4"><br/><br/> 12 <input type="submit" value="註冊"> 13 </form> 14 </body> 15 </html>
struts.xml
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 4 "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 <struts> 6 <!-- 開發者模式 --> 7 <constant name="struts.devMode" value="true"></constant> 8 9 <package name="default" extends="struts-default"> 10 <action name="register1" class="com.guigu.struts2.action.RegisterAction1"> 11 <result>/result.jsp</result> 12 </action> 13 </package> 14 </struts>
result.jsp
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@ taglib uri="/struts-tags" prefix="s"%> 3 <html> 4 <head> 5 </head> 6 <body> 7 <!-- 回顯的時候發現儘管前面輸入格式不一樣,但輸出格式是一樣的 --> 8 生日1:<s:property value="brithday1"/><br/> 9 生日2:<s:property value="brithday2"/><br/> 10 生日3:<s:property value="brithday3"/><br/> 11 生日4:<s:property value="brithday4"/><br/> 12 </body> 13 </html>
界面:
![](http://images2015.cnblogs.com/blog/1090617/201702/1090617-20170220145552366-1417760123.png)
最終返回界面:
註意:這中間還有很重要的東西需要配置:配置轉換器
4、配置轉換器 Struts2提供了兩種方式配置轉換器 方式一:應用於全局範圍的類型轉換器,在src目錄下創建xwork-conversion.properties 轉換類全名=類型轉換器類全名 java.util.Date=com.sytudy.struts2.action.DateConverter (前面是你需要轉換的類型,後面是類型轉換器類 方式二:應用於特定類的類型轉換器,在特定類的相同目錄下創建一個名為ClassName-conversion.properties的屬性文件 特定Action類的屬性名=類型轉換器類全名這篇文字就講到這裡,如果哪裡有不足,歡迎大家指點,謝謝