1. 程式人生 > >類型轉換和格式化

類型轉換和格式化

vat return tof https extend bmi urn cte end

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.23<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>

測試:

技術分享圖片

結果:

技術分享圖片

小結:

在實際的開發中一般都使用內置轉換器,很少使用自定義的。

類型轉換和格式化