发表于: 2019-12-01 22:35:48
1 1158
了解Spring MVC 参数绑定:
1. 从 客户端 请求 Key/value 数据,经过 参数绑定 ,将 Key/value 数据绑定到 controller 方法的 形参上
2. spring MVC中,接受页面提交的数据是通过方法的形参来接收的,而不是在 controller 类定义的成员变量接收
* 处理器适配器调用 springMVC 提供的 参数绑定组件 将 key/value 数据转换成 controller 方法的 形参.
* 参数绑定组件: 在 springMVC 早期版本使用ProperEditor(只能对字符串传成java对象)
* 后期使用 converter (进行任意类型的传换)
* springmvc 提供了很多converter(转换器)
* 在特殊情况下需要自定义converter
* 比如:对日期的数据绑定需要自定义converter
参数绑定默认支持的类型:
1. 直接在 controller 方法形参上定义下边类型的对象,就可以使用这些对象. 在参数绑定的过程中,如果遇到下边类型直接进行绑定.
* a. HttpServletRequest 通过request对象获取请求信息
* b. HttpServletResponse 通过response处理响应信息
* c. HttpSession 通过session对象,得到session存放的对象
* d. Model/ModelMap
* - Model 是一个接口
* - ModelMap 是一个接口的实现
* 作用: 将model数据填充到request域.
/* 商品信息编辑 */
@RequestMapping(value = "/editItems", method = {RequestMethod.GET,RequestMethod.POST})
public String editItems(Model model, Integer id) throws Exception{
//调用service根据商品id查询商品信息
ItemsCustom itemsCustom = itemsService.findItemsById(id);
//通过形参中的model将model数据传到页面
//相当于modelAndView.addObject方法
model.addAttribute("itemsCustom", itemsCustom);
return "items/editItems";
}
参数绑定 简单类型:
1. 通过 @RequestParam 对 简单类型 的参数进行绑定
* - 如果不使用 @RequestParam, 要求 request传入参数名称 和 controller方法 的 形参 必须一致,才能绑定成功
* - 如果使用 @RequestParam, 不用限制 request 传入参数的名称和 controller方法的形参一致.
* - 通过 required属性 指定参数是否必须传入,如果设置为true,又没有传入参数,会报错: Required Integer parameter 'id' is not present
示例:
@RequestMapping(value = "/editItems2", method={RequestMethod.POST,RequestMethod.GET})
//@RequestParam 里指定request 传入的参数名称和形参绑定,将id与items_id绑定
/* 正确的访问url http://localhost:8089/items/editItems2.action?id=1 会传入id值 */
/* 通过 requited属性来指定参数是否必须传入, true, defaultValue为指定默认值,不设置defaultValue又不传入id会报错 */
public String editItems2(Model model, @RequestParam(value="id",required=true,defaultValue = "1") Integer items_id) throws Exception{
//调用service根据商品id查询商品信息
ItemsCustom itemsCustom = itemsService.findItemsById(items_id);
//通过形参中的model将model数据传到页面
//相当于modelAndView.addObject方法
model.addAttribute("itemsCustom", itemsCustom);
return "items/editItems";
}
编辑页面jsp WEB-INF/jsp/items/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>
<%-- 添加一个自定义tags, 将long类型的时间转为固定格式输出 --%>
<%@ taglib uri="/tags" prefix="date"%>
<form id="itemForm" action="${pageContext.request.contextPath }/items/editItemsSubmit.action" method="post" >
<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>
<td>商品生产日期</td>
<%-- 使用自定义taglib标签显示 --%>
<td><input type="text" name="createtime" value="<date:date value ="${itemsCustom.createtime} "/>"/></td>
<%--<tr>
<td>商品图片</td>
<td>
<c:if test="${item.pic !=null}">
<img src="/pic/${item.pic}" width=100 height=100/>
<br/>
</c:if>
<input type="file" name="pictureFile"/>
</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>
为了防止乱码的发生,我们现在web.xml配置文件里面设置一个乱码过滤器:
<!-- 为了能够处理中文的post请求,再配置一个encodingFilter,以避免post请求中文出现乱码情况: -->
<!-- 需要再pom.xml中添加: <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> -->
<filter>
<filter-name>encodingFilter</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
问题:和前端的交互还不是很明白 JSP有点懵
明天的计划:搭建完BUG没跑通 spring自动将前端数据绑定到handler方法的形参上???没搞懂
评论