類型轉換和格式化
spring MVC框架中需要手機用戶請求參數,並將請求參數傳遞給應用的控制器組件。
此時存在一個問題,所有的請求參數只能是字符串數據類型,但Java時強類型語言
所以spring MVC框架必須將這些字符串請求轉換為相應的數據類型。
1、類型轉換的意義
jsp + Servlet為例子來介紹,雷西那個轉換的意義
具體看下方的代碼:
addGoods.jsp
<form action="<%=request.getContextPath()%>/addGood" method="post"> 商品名稱:<input type="text" name="goodname"><br> 商品價格:<input type="text" name="goodprice"><br> 商品數量:<input type="text" name="goodnumber"><br> <input type="submit" value="submit"> </form>
封裝之後的pojo對象屬性:
Goods.java
public class Goods { private String goodname;private Double goodprice; private int goodnumber; //..... }
AddServlet.java
public class AddServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException { resp.setContentType("text/html;charset=utf-8"); //設置編碼 req.setCharacterEncoding("utf-8"); //獲取參數值 String goodname = req.getParameter("goodname"); String goodprice = req.getParameter("goodprice"); String goodnumber = req.getParameter("goodnumber"); //類型轉換 Double price = Double.parseDouble(goodprice); int number = Integer.parseInt(goodnumber); //封裝成Goods對象 Goods goods = new Goods(goodname,price,number); //。。。 } }
可以看出開發者需要自己在Servlet中進行類型轉換,並且將值封裝成對象。
手動實現這些操作,異常繁瑣。
對於Spring MVC框架來說,他必須將請求參數轉換成對象類中的各屬性對應的數據類型。
2、Converter
spring MVC框架的Converter<S,T>是一個將數據類型轉換為另一種數據類型的接口。
S表示源類型,T表示目標類型。
1、內置的類型轉換器
類型轉換時在視圖與控制器相互傳遞數據時發生的
Spring MVC框架對於的基本類型(int,long,float,double,bollean,char)等已經做好了基本類型轉換。
此時可以對上述的案例進行簡單的測試:
@Controller public class GoodsController { //同添加商品的頁面 @RequestMapping("/toGood") public String toGoods(){ return "addGoods"; } //添加頁面的按鈕 @RequestMapping("/addGood") public String Goods(String goodname,Double goodprice,int goodnumber){ double a = goodnumber * goodprice; System.out.println(a ); return "main"; } }
測試數據:
後臺大數據打印:
2、自定義類型轉換器
當上述的內置類型轉換器不能滿足需求時,可以自定義類型轉換器
案例:
用戶前端頁面輸入:apple,1.4,5 自動將其床架一個Goods對象
pojo類在上面已經創建好了Goods.java
前端頁面:
input.jsp
<form action="<%=request.getContextPath()%>/my/converter" method="post"> 輸入格式為:apple,1.2,3<br> <input type="]‘text" name="goods"><br> <input type="submit" value="submit"> </form>
showGoods.jsp
<body> 你的商品是: name:${goods.goodname}<br> price:${goods.goodprice}<br> number:${goods.goodnumber}<br> </body>
controller類:
MyConverter .java
@Controller @RequestMapping("/my") public class MyConverter { //去添加的頁面 @RequestMapping("/toinput") public String toInput(){ return "input"; } @RequestMapping("/converter") public String myConverter(@RequestParam("goods")Goods goods, Model model){ System.out.println(goods); model.addAttribute("goods",goods); return "showGoods"; } }
創建自定義類型的轉換器類
GoodsConverter .java
public class GoodsConverter implements Converter<String, Goods> { @Override public Goods convert(String s) {//創建一個Goods實例 Goods goods = new Goods(); //以 “,”分割 String stringValue[] = s.split(","); if (stringValue !=null && stringValue.length ==3){ goods.setGoodname(stringValue[0]); goods.setGoodprice(Double.parseDouble(stringValue[1])); goods.setGoodnumber(Integer.parseInt(stringValue[2])); return goods; }else { throw new IllegalArgumentException(String.format("類型轉換失敗!!",s)); } } }
在配置文件中:
<!--註冊類類型轉換器 --> <bean id="serviceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean" > <property name="converters"> <list> <bean class="controller.GoodsConverter"></bean> </list> </property> </bean>
<mvc:annotation-driven conversion-service="serviceFactoryBean"></mvc:annotation-driven>
有很多的配置在之前的文章中已經寫過了,此時不在追加 之前的代碼!!!
測試:
測試結果:
3、Formatter
Formatter<T>與Converter<S,T>一樣,也是一個可以將數據類型轉換為為另一種數據類型的接口。
不同的是Formatter的源數據類型必須是String類型,Converter可以是任意的類型。
1、內置的格式化轉換器
2、自定義的格式化轉換器
自定義格式化轉換器就是編寫一個實現Formatter接口的java類:
public interface Formatter<T>
這裏的T表示由字符串轉為的目標數據類型
該接口有兩個方法parse和print兩個接口方法
自定義格式化轉換器類必須覆蓋他們。
public T parse (String s,Java.util.Local local) publiv String ptint(T object,java.util.Local local)
parse方法的功能是利用指定的Locale將一個String類型轉換成目標類型
print方法相反,用於返回目標對象的字符串表示
實例演示如下:
pojo類:
public class Good { private String goodname; private Double goodprice; private int goodnumber; private Date date;
//....
}
前臺的頁面:
addGood.jsp
<form action="<%=request.getContextPath()%>/my/formatter" method="post"> name:<input type="text" name="goodname"> <br> price:<input type="text" name="goodprice"> <br> num:<input type="text" name="goodnumber"> <br> date:<input type="text" name="date"> <br> <input type="submit" value="submit"> </form>
showGood.jsp
<body> 已創建的商品是:<br> name:${good.goodname}<br> price:${good.goodprice}<br> number:${good.goodnumber}<br> date:${good.date}<br> </body>
控制器類:
@Controller @RequestMapping("/my") public class FormatterController { @RequestMapping("/toformatter") public String toF(){ return "addGood"; } //處理請求 @RequestMapping("/formatter") public String myFormatter(Good good, Model model){ model.addAttribute("good",good); return "showGood"; } }
格式轉化類:
public class myFormatter implements Formatter<Date> { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); @Override public Date parse(String s, Locale locale) throws ParseException { return simpleDateFormat.parse(s); } @Override public String print(Date date, Locale locale) { return simpleDateFormat.format(date); } }
配置文件中進行註冊:
<!--註冊Formatter --> <bean id="formattingConversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="formatters"> <set> <bean class="controller1.myFormatter"></bean> </set> </property> </bean> <mvc:annotation-driven conversion-service="formattingConversionService"></mvc:annotation-driven>
測試:
結果:
小結:
在實際的開發中一般都使用內置轉換器,很少使用自定義的。
類型轉換和格式化