本节以一个简单应用(JSP+Servlet)为示例来介绍类型转换的意义。如图 1 所示的添加商品页面用于收集用户输入的商品信息,商品信息包括商品名称(字符串类型 String)、商品价格(双精度浮点类型 double)、商品数量(整数类型 int)。

    10-Spring MVC类型转换的意义 - 图1
    图 1 添加商品信息的收集页面
    addGoods.jsp页面的代码如下:

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    4. <html>
    5. <head>
    6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    7. <title>添加商品信息</title>
    8. </head>
    9. <body>
    10. <form action="addGoods" method="post">
    11. <table border=1 bgcolor="lightblue" align="center">
    12. <tr>
    13. <td>商品名称:</td>
    14. <td><input class="textSize" type="text" name="goodsname" /></td>
    15. </tr>
    16. <tr>
    17. <td>商品价格:</td>
    18. <td><input class="textSize" type="text" name="goodsprice" /></td>
    19. </tr>
    20. <tr>
    21. <td>商品数量:</td>
    22. <td><input class="textSize" type="text" name="goodsnumber" /></td>
    23. </tr>
    24. <tr>
    25. <td colspan="2" align="center">
    26. <input type="submit" value="提交" />
    27. </td>
    28. </tr>
    29. </tab1e>
    30. </form>
    31. </body>
    32. </html>

    希望页面收集到的数据提交到 addGoods 的 Servlet(AddGoodsServlet 类),该 Servlet 将这些请求信息封装成一个 Goods 类的值对象。

    Goods 类的代码如下:

    1. package pojo;
    2. public class Goods {
    3. private String goodsname;
    4. private double goodsprice;
    5. private int goodsnumber;
    6. // 无参数的构造方法
    7. public Goods() {
    8. }
    9. // 有参数的构造方法
    10. public Goods(String goodsname, double goodsprice, int goodsnumber) {
    11. super();
    12. this.goodsname = goodsname;
    13. this.goodsprice = goodsprice;
    14. this.goodsnumber = goodsnumber;
    15. }
    16. // 此处省略了setter和getter方法
    17. }

    AddGoodsServlet 类的代码如下:

    1. package servlet;
    2. import java.io.IOException;
    3. import javax.servlet.ServletException;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import pojo.Goods;
    8. public class AddGoodsServlet extends HttpServlet {
    9. public void doGet(HttpServletRequest request, HttpServletResponse response)
    10. throws ServletException, IOException {
    11. doPost(request, response);
    12. }
    13. public void doPost(HttpServletRequest request, HttpServletResponse response)
    14. throws ServletException, IOException {
    15. response.setContentType("text/html;charset=utf-8");
    16. // 设置编码,防止乱码
    17. request.setCharacterEncoding("utf-8");
    18. // 获取参数值
    19. String goodsname = request.getParameter("goodsname");
    20. String goodsprice = request.getParameter("goodsprice");
    21. String goodsnumber = request.getParameter("goodsnumber");
    22. // 下面进行类型转换
    23. double newgoodsprice = Double.parseDouble(goodsprice);
    24. int newgoodsnumber = Integer.parseInt(goodsnumber);
    25. // 将转换后的数据封装成goods值对象
    26. Goods goods = new Goods(goodsname, newgoodsprice, newgoodsnumber);
    27. // 将goods值对象传递给数据访问层,进行添加操作,代码省略
    28. ...
    29. }
    30. }

    对于上面这个应用而言,开发者需要自己在 Servlet 中进行类型转换,并将其封装成值对象。这些类型转换操作全部手工完成,异常烦琐。

    对于 Spring MVC 框架而言,它必须将请求参数转换成值对象类中各属性对应的数据类型——这就是类型转换的意义。