博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
类型转换和格式化
阅读量:5806 次
发布时间:2019-06-18

本文共 5096 字,大约阅读时间需要 16 分钟。

 

spring MVC框架中需要手机用户请求参数,并将请求参数传递给应用的控制器组件。

此时存在一个问题,所有的请求参数只能是字符串数据类型,但Java时强类型语言

所以spring MVC框架必须将这些字符串请求转换为相应的数据类型。

 

1、类型转换的意义

jsp + Servlet为例子来介绍,雷西那个转换的意义

具体看下方的代码:

 

addGoods.jsp

商品名称:
商品价格:
商品数量:

封装之后的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)等已经做好了基本类型转换。

此时可以对上述的案例进行简单的测试:

@Controllerpublic 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

输入格式为:apple,1.2,3

 showGoods.jsp

你的商品是:name:${goods.goodname}
price:${goods.goodprice}
number:${goods.goodnumber}

 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
{ @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)); } }}

 在配置文件中:

 有很多的配置在之前的文章中已经写过了,此时不在追加 之前的代码!!!

 测试:

测试结果:

3、Formatter

 Formatter<T>与Converter<S,T>一样,也是一个可以将数据类型转换为为另一种数据类型的接口。

不同的是Formatter的源数据类型必须是String类型,Converter可以是任意的类型

 1、内置的格式化转换器

2、自定义的格式化转换器

 自定义格式化转换器就是编写一个实现Formatter接口的java类:

public interface Formatter

这里的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

name:
price:
num:
date:

showGood.jsp

已创建的商品是:
name:${good.goodname}
price:${good.goodprice}
number:${good.goodnumber}
date:${good.date}

控制器类:

@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
{ 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); }}

配置文件中进行注册:

测试:

结果:

 

 

 小结:

在实际的开发中一般都使用内置转换器,很少使用自定义的。

转载于:https://www.cnblogs.com/Mrchengs/p/10245908.html

你可能感兴趣的文章
云原生的浪潮下,为什么运维人员适合学习Go语言?
查看>>
Webpack入门教程三十
查看>>
EAServer 6.1 .NET Client Support
查看>>
锐捷交换机密码恢复(1)
查看>>
Kali linux virtualbox rc=1908 错误解决办法
查看>>
Erlang学习总结之Erlang语法中的逗号(,)、分号(;),句号(.)的正确用法...
查看>>
linux软件包管理之三(源代码安装)
查看>>
数据库三范式是什么?
查看>>
[转载]设置Ubuntu自动连接无线,无须再输入密钥环和无线密码
查看>>
九叔Xen App测试报告
查看>>
Apache配置
查看>>
Ext gridPanel 单元格数据的渲染
查看>>
Android SDK 的下载代理
查看>>
Method Swizzling对Method的要求
查看>>
佛祖保佑,永不宕机
查看>>
四、配置开机自动启动Nginx + PHP【LNMP安装 】
查看>>
LNMP一键安装
查看>>
SQL Server数据库概述
查看>>
Linux 目录结构及内容详解
查看>>
startx命令--Linux命令应用大词典729个命令解读
查看>>