SpringMVC注解开发(基础)---SpringMVC学习笔记(七)

来源:互联网 发布:人工智能的负面影响 编辑:程序博客网 时间:2024/04/28 06:12

需求

商品修改功能开发。 
操作流程: 
1、进入商品查询列表页面 
2、点击修改,进入商品修改页面,页面中显示了要修改的商品(从数据库查询) 
要修改的商品从数据库查询,根据商品id(主键)查询商品信息 
3、在商品修改页面,修改商品信息,修改后,点击提交

第一步:开发Mapper(也就是Dao层)

mapper: 
根据id查询商品信息 
根据id更新Items表的数据 
不用开发了,使用逆向工程生成的代码。

第二步:开发Service

接口功能: 
根据id查询商品信息 
修改商品信息 
service接口:

public interface ItemsService {    //商品查询列表    public List<ItemsCustom> findItemsList(ItemsQueryVo itemsQueryVo) throws Exception;    //根据id查询商品信息    public ItemsCustom findItemsById(Integer id) throws Exception;    //修改商品信息    public void updateItems(Integer id,ItemsCustom itemsCustom) throws Exception;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

service接口的实现类:

public class ItemsServiceImpl implements ItemsService {    @Autowired    private ItemsMapperCustom itemsMapperCustom;    @Autowired    private ItemsMapper itemsMapper;    @Override    public List<ItemsCustom> findItemsList(ItemsQueryVo itemsQueryVo)            throws Exception {        //通过ItemsMapperCustom查询数据库        return itemsMapperCustom.findItemsList(itemsQueryVo);    }    @Override    public ItemsCustom findItemsById(Integer id)            throws Exception {        Items items = itemsMapper.selectByPrimaryKey(id);        //中间对商品信息进行一系列的处理,最终返回商品信息的扩展类的对象        ItemsCustom itemsCustom = new ItemsCustom();        //将items的属性值拷贝到itemsCustom        BeanUtils.copyProperties(items, itemsCustom);        return itemsCustom ;    }    @Override    public void updateItems(Integer id, ItemsCustom itemsCustom) throws Exception {        //添加业务的校验,通常在service接口对关键参数进行校验        //因为int这里无法判断是否为空,所以这里使用Integer        //校验id是否为空,如果为空抛出异常(这里先不写,后面讲异常处理的时候再添加)        //更新商品信息,使用updateByPrimaryKeyWithBLOBs()方法可以根据id更新items表中的所有字段(包括大文本类型的字段)        itemsCustom.setId(id);        itemsMapper.updateByPrimaryKeyWithBLOBs(itemsCustom);    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

第三步:开发controller(也就是SpringMVC层)

方法: 
商品信息修改页面显示 
商品信息修改提交

在ItemsController中添加如下代码:

// 商品信息页面的展示    @RequestMapping("/editItems")    public ModelAndView editItems() throws Exception {        // 调用service根据商品id查询商品信息        ItemsCustom itemsCustom = itemsService.findItemsById(1);        // 返回ModelAndView        ModelAndView modelAndView = new ModelAndView();        // 将商品信息放入到model中        modelAndView.addObject("itemsCustom", itemsCustom);        // 商品修改页面        modelAndView.setViewName("items/editItems");        return modelAndView;    }    // 商品信息修改提交    @RequestMapping("/editItemsSubmit")    public ModelAndView editItemsSubmit() throws Exception {        // 调用service更新商品信息        ItemsCustom itemsCustom = itemsService.findItemsById(1);        // 返回ModelAndView        ModelAndView modelAndView = new ModelAndView();        // 将商品信息放入到model中        modelAndView.addObject("itemsCustom", itemsCustom);        // 商品修改页面        modelAndView.setViewName("success");        return modelAndView;    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

页面代码: 
itemsList.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>查询商品列表</title></head><body>    <form action="${pageContext.request.contextPath }/item/queryItem.action" method="post">        查询条件:        <table width="100%" border=1>            <tr>                <td><input type="submit" value="查询" /></td>            </tr>        </table>        商品列表:        <table width="100%" border=1>            <tr>                <td>商品名称</td>                <td>商品价格</td>                <td>生产日期</td>                <td>商品描述</td>                <td>操作</td>            </tr>            <c:forEach items="${itemsList }" var="item">                <tr>                    <td>${item.name }</td>                    <td>${item.price }</td>                    <td><fmt:formatDate value="${item.createtime}"                            pattern="yyyy-MM-dd HH:mm:ss" /></td>                    <td>${item.detail }</td>                    <td><a                        href="${pageContext.request.contextPath }/editItems.action?id=${item.id}">修改</a></td>                </tr>            </c:forEach>        </table>    </form></body></html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

editItems.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>修改商品信息</title></head><body><%--    <!-- 显示错误信息 -->    <c:if test="${allErrors!=null }">        <c:forEach items="${allErrors }" var="error">    ${ error.defaultMessage}<br />        </c:forEach>    </c:if> --%>    <form id="itemForm"        action="${pageContext.request.contextPath }/editItemsSubmit.action"        method="post" enctype="multipart/form-data">        <input type="hidden" name="id" value="${itemsCustom.id }" /> 修改商品信息:        <table width="100%" border=1>            <tr>                <td>商品名称</td>                <td><input type="text" name="name" value="${itemsCustom.name }" /></td>            </tr>            <tr>                <td>商品价格</td>                <td><input type="text" name="price"                    value="${itemsCustom.price }" /></td>            </tr>            <%-- <tr>    <td>商品生产日期</td>    <td><input type="text" name="createtime" value="<fmt:formatDate value="${items.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/>"/></td></tr><tr>    <td>商品图片</td>    <td>        <c:if test="${items.pic !=null}">            <img src="/pic/${items.pic}" width=100 height=100/>            <br/>        </c:if>        <input type="file"  name="items_pic"/>     </td></tr> --%>            <tr>                <td>商品简介</td>                <td><textarea rows="3" cols="30" name="detail">${itemsCustom.detail }</textarea>                </td>            </tr>            <tr>                <td colspan="2" align="center"><input type="submit" value="提交" />                </td>            </tr>        </table>    </form></body></html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62

深入分析Controller层的内容

1.@RequestMappring注解的作用:

1.URL路径映射 
@RequestMapping(value=”/item”)或@RequestMapping(“/item) 
value的值是数组,可以将多个url映射到同一个方法 
2.窄化请求映射 
在class上添加@RequestMapping(url)指定通用请求前缀, 限制此类下的所有方法请求url必须以请求前缀开头,通过此方法对url进行分类管理。

这里写图片描述 
如下: 
@RequestMapping放在类名上边,设置请求前缀 
@Controller 
@RequestMapping(“/item”)

方法名上边设置请求映射url: 
@RequestMapping放在方法名上边,如下: 
@RequestMapping(“/queryItem “)

访问地址为:/item/queryItem

3.限定http请求的方式

  • 限定GET方法
@RequestMapping(method = RequestMethod.GET)
  • 1
  • 1

如果通过Post访问则报错: 
HTTP Status 405 - Request method ‘POST’ not supported 
例如:

@RequestMapping(value="/editItem",method=RequestMethod.GET)
  • 1
  • 1
  • 限定POST方法
@RequestMapping(method = RequestMethod.POST)
  • 1
  • 1

如果通过Post访问则报错: 
HTTP Status 405 - Request method ‘GET’ not supported

  • GET和POST都可以
@RequestMapping(method={RequestMethod.GET,RequestMethod.POST})
  • 1
  • 1

2.controller类中方法的返回值:

1.返回ModelAndView 
需要方法结束时,定义ModelAndView,将model和view分别进行设置。 
这里写图片描述

2.返回String 
如果controller方法返回string,

  1. 表示返回逻辑视图名。 
    真正视图(jsp路径)=前缀+逻辑视图名+后缀 
    这里写图片描述

  2. redirect重定向 
    需求:商品修改提交后,重定向到商品查询列表。 
    redirect重定向特点:浏览器地址栏中的url会变化。修改提交的request数据无法传到重定向的地址。因为重定向后重新进行request(request无法共享) 
    这里写图片描述

  3. forward页面转发 
    通过forward进行页面转发,浏览器地址栏url不变,request可以共享。 
    这里写图片描述

3.返回void 
在controller方法形参上可以定义request和response,使用request或response指定响应结果:

  1. 使用request转向页面,如下: 
    request.getRequestDispatcher(“页面路径”).forward(request, response);

  2. 也可以通过response页面重定向: 
    response.sendRedirect(“url”)

  3. 也可以通过response指定响应结果,例如响应json数据如下: 
    response.setCharacterEncoding(“utf-8”); 
    response.setContentType(“application/json;charset=utf-8”); 
    response.getWriter().write(“json串”);

3.参数绑定

参数绑定的过程:

从客户端请求key/value数据,经过参数绑定,将key/value数据绑定到controller方法的形参上。

springmvc中,接收页面提交的数据是通过方法形参来接收。而不是在controller类定义成员变量接收(这是struts2的接收方式)!

这里写图片描述

1.默认支持的参数类型

直接在controller方法形参上定义下边类型的对象,就可以使用这些对象。在参数绑定过程中,如果遇到下边类型直接进行绑定。

1.HttpServletRequest 
通过request对象获取请求信息

2.HttpServletResponse 
通过response处理响应信息

3.HttpSession 
通过session对象得到session中存放的对象

4.Model/ModelMap 
ModelMap是Model接口的实现类,通过Model或ModelMap向页面传递数据。 
作用:将model数据填充到request域。

如下: 
这里写图片描述

页面通过${itemsCustom.XXXX}获取itemsCustom对象的属性值。 
使用Model和ModelMap的效果一样,如果直接使用Model,springmvc会实例化ModelMap。

2.简单类型

包括整型、字符串、单精度和双精度、布尔型。 
eg: 
这里写图片描述 
请求该controller方法的url为:http://localhost:8080/Spring_mybatis/items/editItems.action?id=1

注意:url中的参数的名字必须与controller方法中的形参的参数名相同。如果不同就不会映射成功。

需求:解决url中的参数名如果和controller方法中的形参的参数名不同时,也可以映射成功的问题 
通过@RequestParam对简单类型的参数进行绑定。

如果不使用@RequestParam,要求request传入参数名称和controller方法的形参名称一致,方可绑定成功。

如果使用@RequestParam,不用限制request传入参数名称和controller方法的形参名称一致。 
这里写图片描述

通过required属性指定参数是否必须要传入,如果设置为true,没有传入参数,报下边错误: 
这里写图片描述 
错误信息:

TTP Status 400 - Required Integer parameter 'XXXX' is not present
  • 1
  • 1

@RequestParam小结: 
value:参数名字,即入参的请求参数名字,如value=“item_id”表示请求的参数区中的名字为item_id的参数的值将传入; 
required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报; 
defaultValue:默认值,表示如果请求中没有同名参数时的默认值 
定义如下:

public String editItem(@RequestParam(value="item_id",required=true) String id) {}
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

形参名称为id,但是这里使用value=” item_id”限定请求的参数名为item_id,所以页面传递参数的名必须为item_id。 
注意:如果请求参数中没有item_id将跑出异常:

HTTP Status 500 - Required Integer parameter 'item_id' is not present
  • 1
  • 1

这里通过required=true限定item_id参数为必需传递,如果不传递则报400错误,可以使用defaultvalue设置默认值,即使required=true也可以不传item_id参数值

3.pojo类型

1.简单pojo类型

如果页面中input的name和controller的pojo形参中的属性名称一致,springMVC会自动将页面中数据绑定到controller中的pojo对应的属性中。 
如下: 
editItems.jsp页面的属性name定义: 
这里写图片描述 
controller的pojo形参的定义: 
这里写图片描述

Contrller方法定义如下:

需要说明的是:简单类型的参数绑定和pojo参数绑定互不影响。

2.包装pojo类型 
如果页面中参数的名称和包装pojo类中的属性名一致,那么springMVC会自动将页面中数据绑定到controller中的pojo对应的属性中。 
包装对象定义如下: 
这里写图片描述

页面定义: 
这里写图片描述 
注意:页面中name的值(也就是itemsCustom)和包装pojo(也就是ItemsQueryVo)中的属性(也就是itemsCustom属性)一致,那么SpringMVC就自动将页面中传递过来的参数值映射到下面的Controller方法的形参中。

Controller方法定义如下: 
这里写图片描述

4.集合类型绑定

1.数组的绑定 
需求:商品批量删除,用户在页面选择多个商品,批量删除。

这里主要为了说明SpringMVC的集合类型绑定所以就只写表现层的实现了。 
页面的定义: 
这里写图片描述

controller类中方法的定义: 
这里写图片描述

2.list的绑定 
需求:通常在需要批量提交数据时,将提交的数据绑定到list中,比如:成绩录入(录入多门课成绩,批量提交), 
本例子需求:批量商品修改,在页面输入多个商品信息,将多个商品信息提交到controller方法中。 
表现层实现: 
页面的定义: 
editItemsQuery.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%><%    String path = request.getContextPath();    String basePath = request.getScheme() + "://"            + request.getServerName() + ":" + request.getServerPort()            + path + "/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><base href="<%=basePath%>"><title>批量修改商品信息</title></head><script type="text/javascript">    function editItemsAndSubmit() {        //提交form        document.itemsForm.action = "${pageContext.request.contextPath }/items/editItemsAllSubmit.action";        document.itemsForm.submit();    }    function queryItems() {        //提交form        document.itemsForm.action = "${pageContext.request.contextPath }/items/queryItems.action";        document.itemsForm.submit();    }</script><body>    <form name="itemsForm"        action="${pageContext.request.contextPath }/items/queryItems.action"        method="post">        查询条件:        <table width="100%" border=1>            <tr>                <td>商品名称:<input type="text" name="itemsCustom.name"></td>                <td><input type="button" value="查询" onclick="queryItems()" /></td>                <td><input type="button" value="批量商品修改提交"                    onclick="editItemsAndSubmit()" /></td>            </tr>        </table>        商品列表:        <table width="100%" border=1>            <tr>                <td>商品名称</td>                <td>商品价格</td>                <td>生产日期</td>                <td>商品描述</td>            </tr>            <c:forEach items="${itemsList }" var="item" varStatus="status">                <tr>                    <td><input name="itemsList[${status.index }].name"                        value="${item.name }"></td>                    <td><input name="itemsList[${status.index }].price"                        value="${item.price }"></td>                    <td><input name="itemsList[${status.index }].createtime"                        value="<fmt:formatDate value="${item.createtime }" pattern="yyyy-MM-dd HH:mm:ss"/>"></td>                    <td><input name="itemsList[${status.index }].detail"                        value="${item.detail }"></td>                </tr>            </c:forEach>        </table>    </form></body></html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70

特别说明: 
这里写图片描述

controller方法的定义: 
1、进入批量商品修改页面(页面样式参考商品列表实现) 
这里写图片描述 
2、批量修改商品提交 
使用List接收页面提交的批量数据,通过包装pojo接收,在包装pojo中定义list<pojo>属性 
这里写图片描述 
上面形参对象中需要添加的属性: 
这里写图片描述

3.map的绑定 
也通过在包装pojo中定义map类型属性。

在包装类中定义Map对象,并添加get/set方法,action使用包装对象接收。 
包装类中定义Map对象如下:

Public class QueryVo {private Map<String, Object> itemInfo = new HashMap<String, Object>();  //get/set方法..}
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

页面定义如下:

<tr><td>学生信息:</td><td>姓名:<inputtype="text"name="itemInfo['name']"/>年龄:<inputtype="text"name="itemInfo['price']"/>.. .. ..</td></tr>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Contrller方法定义如下:

public String useraddsubmit(Model model,QueryVo queryVo)throws Exception{System.out.println(queryVo.getStudentinfo());}
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

5.自定义类型绑定

举例:自定义日期类型绑定 
对于controller形参中pojo对象,如果属性中有日期类型,需要自定义参数绑定。 
将请求日期数据串传成 日期类型,要转换的日期类型和pojo中日期属性的类型保持一致。

这里写图片描述

所以自定义参数绑定将日期串转成Java.util.Date类型。

然后需要向处理器适配器中注入自定义的参数绑定组件。 
自定义日期类型绑定组件: 
这里写图片描述

配置方式1: 
这里写图片描述

配置方式2:

<!--注解适配器 -->    <bean        class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">         <property name="webBindingInitializer" ref="customBinder"></property>     </bean>    <!-- 自定义webBinder -->    <bean id="customBinder"        class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">        <property name="conversionService" ref="conversionService" />    </bean>    <!-- conversionService -->    <bean id="conversionService"        class="org.springframework.format.support.FormattingConversionServiceFactoryBean">        <!-- 转换器 -->        <property name="converters">            <list>                <bean class="cn.itcast.ssm.controller.converter.CustomDateConverter"/>            </list>        </property>    </bean>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

SpringMVC与Struts2的不同

  1. springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过滤器。
  2. springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
  3. Struts采用值栈存储请求和响应的数据,通过OGNL存取数据, springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过request域传输到页面。Jsp视图解析器默认使用jstl。

Post中文乱码问题

在@RequestMapping中设置http请求方式为post时的出现的中文乱码问题解决方式: 
在web.xml中加入:

    <filter>        <filter-name>CharacterEncodingFilter</filter-name>        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>        <init-param>            <param-name>encoding</param-name>            <param-value>utf-8</param-value>        </init-param>    </filter>    <filter-mapping>        <filter-name>CharacterEncodingFilter</filter-name>        <url-pattern>/*</url-pattern>    </filter-mapping>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

以上可以解决post请求乱码问题。

对于get请求中文参数出现乱码解决方法有两个:

修改tomcat配置文件添加编码与工程编码一致,如下:

<Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
  • 1
  • 1

另外一种方法对参数进行重新编码:

String userName new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码

阅读全文
0 0
原创粉丝点击