一、@RequestMapping注解说明

  通过@RequestMapping注解可以定义不同的处理器映射规则。

URL路径映射

@RequestMapping(value="/item")或@RequestMapping("/item")

value的值是数组,可以将多个url映射到同一个方法

  窄化请求映射

在class上添加@RequestMapping(url)指定通用请求前缀, 限制此类下的所有方法请求url必须以请求前缀开头,通过此方法对url进行分类管理。

如下:

@RequestMapping放在类名上边,设置请求前缀

@Controller

@RequestMapping("/item")

方法名上边设置请求映射url:

@RequestMapping放在方法名上边,如下:

@RequestMapping("/queryItem ")

访问地址为:/item/queryItem

  请求方法限定

限定GET方法

@RequestMapping(method = RequestMethod.GET)

如果通过Post访问则报错:

HTTP Status 405 - Request method 'POST' not supported

例如:

@RequestMapping(value="/editItem",method=RequestMethod.GET)

限定POST方法

@RequestMapping(method = RequestMethod.POST)

如果通过Post访问则报错:

HTTP Status 405 - Request method 'GET' not supported

GET和POST都可以

@RequestMapping(method={RequestMethod.GET,RequestMethod.POST})

二、Controller的返回值类型

1.返回ModelAndView

  controller方法中定义ModelAndView对象并返回,对象中可添加model数据、指定view。

2.返回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.返回字符串(逻辑视图名)

  controller方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。

//指定逻辑视图名,经过视图解析器解析为jsp物理路径:/WEB-INF/jsp/item/editItem.jsp

return "item/editItem";

  Redirect重定向。

Contrller方法返回结果重定向到一个url地址,如下商品修改提交后重定向到商品查询方法,参数无法带到商品查询方法中。

//重定向到queryItem.action地址,request无法带过去
return "redirect:queryItem.action";

  redirect方式相当于“response.sendRedirect()”,转发后浏览器的地址栏变为转发后的地址,因为转发即执行了一个新的request和response。

由于新发起一个request原来的参数在转发时就不能传递到下一个url,如果要传参数可以/item/queryItem.action后边加参数,如下:

/item/queryItem?...&…..

  forward转发

controller方法执行后继续执行另一个controller方法,如下商品修改提交后转向到商品修改页面,修改商品的id参数可以带到商品修改方法中。

//结果转发到editItem.action,request可以带过去
return "forward:editItem.action";

  forward方式相当于“request.getRequestDispatcher().forward(request,response)”,转发后浏览器地址栏还是原来的地址。转发并没有执行新的request和response,而是和转发前的请求共用一个request和response。所以转发前请求的参数在转发后仍然可以读取到。

三、参数绑定

1、参数的绑定过程

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

2、默认支持的类型

  (1)HttpServletRequest。

  在controller中可以通过HttpServletRequest对象来获取请求信息。

  (2)HttpServletResponse。

  ;在controller中可以通过HttpServletResponse对象来处理响应信息。

  (3)HttpSession。

  ;在controller中可以通过HttpSession对象来得到session对象中存放的对象。

  (4)Model/ModelMap。

  ;Model是一个接口,ModelMap是一个接口实现,在controller中可以通过Model/ModelMap对象来将数据填充到request域当中。

3.简单类型的参数绑定

  此处只介绍Integet类型,其他简单类型相同

  第一种情况:request传入的参数名和Controller中的形参的名称一致,这样便可以直接绑定成功。

示例:

jsp页面的请求

 <td><a href="${pageContext.request.contextPath}/queryItemById.action?id=${items.id}">修改</a> </td>

controller中接受改参数:

 @RequestMapping("/queryItemById")
public ModelAndView queryItemById(Integer id) throws Exception{ ItemsExtend itemsExtend = itemsService.queryItesmById(id);
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("itemsExtend",itemsExtend);
modelAndView.setViewName("updateitem");
return modelAndView;
}

  第二种情况:request传入的参数名和Controller中的形参名称不一致。这种情况下要绑定成功,则必须要使用@RequestParam注解。示例:

jsp请求页面:

 <td><a href="${pageContext.request.contextPath}/queryItemById.action?id=${items.id}">修改</a> </td>

Controller中接受参数:

   @RequestMapping("/queryItemById")
/**
* 1、通过@RequestParam注解进行参数绑定,在要绑定的参数前面加@RequestParam即可。
* 2、value的值是请求中传过来的参数的名称。
* 3、通过required可以指定改参数是否必传,设置为true必传,不传会报错
*/
public ModelAndView queryItemById(@RequestParam(value = "id",required = true) Integer item_id) throws Exception{ ItemsExtend itemsExtend = itemsService.queryItesmById(item_id);
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("itemsExtend",itemsExtend);
modelAndView.setViewName("updateitem");
return modelAndView;
}

4.pojo类型的参数绑定

  只要页面中input的name属性值和controller中的pojo形参中的属性名称一致,就可以将页面中的数据绑定到pojo当中。下面以商品修改为例进行说明:

  pojo类:pojo类中的属性名称和数据库中表的列名保持一致。

public class Items {
private Integer id; private String name; private Float price; private String pic; private Date createtime; private String detail;
// getter and setter
}

  controller方法中使用Items类的扩展类来作为形参,该类继承了Items类。

   @RequestMapping("/updateitems")
public String updateitems(Integer id,ItemsExtend itemsExtend) throws Exception{
itemsService.updateitems(id,itemsExtend);
return "redirect:queryItems.action";
}

  jsp页面中input框的name属性值必须要和Items中的属性值名称保持一致,这样才能成功进行绑定。

<%@ 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>
<title>修改商品信息</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/updateitems.action" method="post">
<input type="hidden" name="id" value="${itemsExtend.id}">
<table width="100%" border= 1> <tr>
<td> 商品名称:</td>
<td><input type="text" name="name" value="${itemsExtend.name}"></td>
</tr>
<tr>
<td> 商品价格:</td>
<td><input type="text" name="price" value="${itemsExtend.price}"></td>
</tr>
<%-- <tr>
<td>商品图片:</td>
<td>
<img src="${itemsExtend.pic}" alt="图片">
<br/>
<input type="file" name="pic">
</td>
</tr>--%>
<tr>
<td> 商品日期:</td>
<td><input type="text" name="createtime" value="<fmt:formatDate value="${itemsExtend.createtime}" pattern="yyyy-MM-dd HH:mm:s"/>"></td>
</tr>
<tr>
<td>商品描述:</td>
<td><textarea rows="6" name="detail">${itemsExtend.detail}</textarea></td>
</tr>
</table>
<input type="submit" value="提交">
</form>
</body>
</html>

5.POST请求中的中文乱码问题

  在POST请求中如果有中文会出现乱码,解决方法为在 web.xml文件中加入一个过滤器即可。

   <!--解决POST提交中文乱码问题-->
<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>

6、自定义类型转换器

  在前面的案例中,更新商品信息时使用到了日期时间,但是我们在pojo中定义的日期类型为java.util.Date类型,这样会造成时间的丢失。示例:

更新Items信息数据:



跟新后的商品信息:



解决办法:

  自定义日期类型的绑定组件,然后将其注入到处理器适配器中即可。

自定义的日期类型绑定。要自定义一个类型绑定必须要实现Converter<T,S>接口,然后实现convert()方法即可。

自定义的日期类型绑定:

/**
* 自定义日期参数绑定
* 1、必须要实现Converter<T,S>接口。
* 2、Converter接口中的第一个参数为源类型,第二个参数为目标类型
* 3、在convert方法里面处理类型转换。
*/
public class ItemDateConvert implements Converter<String,Date> {
@Override
public Date convert(String s) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
return simpleDateFormat.parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}

在springmvc的配置文件中,在处理器适配器中注入该自定义的额参数绑定器。

 第一种注入方式:

<!--注解适配器 -->
<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="com.jack.Convert.ItemDateConvert"/>
</list>
</property>
</bean>

 第二种注入方式:

  <!--自定义参数绑定-->
<bean id="conersionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<!--转换器-->
<property name="converters">
<list>
<!--日期转换器-->
<bean class="com.jack.Convert.ItemDateConvert"/>
</list>
</property>
</bean>
<!--注入自定义参数绑定器-->
<mvc:annotation-driven conversion-service="conersionService"></mvc:annotation-driven>

7.pringmvc和struts2的区别

(1)springmvc基于方法开发的,struts2基于类开发的。

(2)springmvc将url和controller方法映射。映射成功后springmvc生成一个Handler对象,对象中只包括了一个method。

方法执行结束,形参数据销毁。

springmvc的controller开发类似service开发。

(3)springmvc可以进行单例开发,并且建议使用单例开发,struts2通过类的成员变量接收参数,无法使用单例,只能使用多例。

(4)经过实际测试,struts2速度慢,在于使用struts标签,如果使用struts建议使用jstl。

8、数组的绑定

 对商品进行批量删除,在list页面中每一条记录添加多选框,进行多选后将所选商品的id以数组的方式传到controller方法中,在controller方法中使用数组形式的形参来进行接受。示例:

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>
<title>商品展示</title>
<script type="application/javascript"> function deletes() {
document.itemform.action = "${pageContext.request.contextPath}/deleteItems.action"
document.itemform.submit();
}
function query() {
document.itemform.action = "${pageContext.request.contextPath}/queryItems.action"
document.itemform.submit();
}
</script>
</head>
<body>
<form id="itemform" name="itemform" action="" >
<table width="100%" border= 1>
<tr>
<td><input type="submit" value="查询" onclick="query()"></td>
<td><input type="button" id="delete" value="批量删除" onclick="deletes()"></td>
</tr>
<tr>
<td>选择</td>
<td>商品id</td>
<td>商品名称</td>
<td>商品价格</td>
<%-- <td>商品图片</td>--%>
<td>商品日期</td>
<td>商品描述</td>
<td>操作</td>
</tr>
<c:forEach items="${itemsExtendList}" var="items">
<tr>
<td><input type="checkbox" name="ids" id="ids" value="${items.id}"></td>
<td>${items.id}</td>
<td>${items.name}</td>
<td>${items.price}</td>
<%-- <td><img src="${items.pic}" alt="图片"></td>--%>
<td><fmt:formatDate value="${items.createtime}" pattern="yyyy-MM-dd HH:mm:ss"></fmt:formatDate></td>
<td>${items.detail}</td>
<td><a href="${pageContext.request.contextPath}/queryItemById.action?id=${items.id}">修改</a> </td>
</tr>
</c:forEach>
</table>
</form>
</body>
</html>

controller方法:

@RequestMapping("/deleteItems")
public String deleteItems(String[] ids,ItemsCustom itemsExtend) throws Exception{ for (int i =0 ;i<ids.length ;i++){
System.out.println(ids[i]);
}
// itemsService.deleteItems(ids,itemsExtend);
return "redirect:queryItems.action";
}

9、list的参数绑定

 批量商品修改,在页面输入多个商品信息,将多个商品信息提交到controller方法中。

jsp页面:

   <c:forEach items="${itemsExtendList}" var="items" varStatus="statu">
<tr>
<td><input type="text" name="itemsCustomList[${statu.index}].id" value="${items.id}"></td>
<td><input type="text" name="itemsCustomList[${statu.index}].name" value="${items.name}"></td>
<td><input type="text" name="itemsCustomList[${statu.index}].price" value="${items.price}"></td>
<td><input type="text" name="itemsCustomList[${statu.index}].createtime" value="<fmt:formatDate value="${items.createtime}" pattern="yyyy-MM-dd HH:mm:ss"></fmt:formatDate>"></td>
<td><input type="text" name="itemsCustomList[${statu.index}].detail" value="${items.detail}"></td>
</tr>
</c:forEach>

controller方法 :

@RequestMapping("/updateAllSelectItems")
public String updateAllSelectItems(ItemsVo itemsVo) throws Exception{
/* List<ItemsCustom> itemsExtendList =itemsService.queryItesm();*/
List<ItemsCustom> list = itemsVo.getItemsCustomList();
for (ItemsCustom item: list) {
System.out.println(item);
}
/* ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("itemsExtendList",itemsExtendList);
modelAndView.setViewName("itemlist");*/
return "redirect:queryItems.action";
}

pojo:

public class ItemsVo {
List<ItemsCustom> itemsCustomList ; public List<ItemsCustom> getItemsCustomList() {
return itemsCustomList;
} public void setItemsCustomList(List<ItemsCustom> itemsCustomList) {
this.itemsCustomList = itemsCustomList;
}
}

10.map数据的绑定

controll方法 :

@RequestMapping("/updateAllSelectItemsMap")
public String updateAllSelectItemsMap(ItemsVo itemsVo) throws Exception{ System.out.println(itemsVo.getItemsMap()); return "redirect:queryItems.action";
}

jsp页面:

  <c:forEach items="${itemsExtendList}" var="items" varStatus="statu">
<tr>
<td><input type="text" name="itemsMap['id']" value="${items.id}"></td>
<td><input type="text" name="itemsMap['name']" value="${items.name}"></td>
<td><input type="text" name="itemsMap['price']" value="${items.price}"></td>
<td><input type="text" name="itemsMap['createtime']" value="<fmt:formatDate value="${items.createtime}" pattern="yyyy-MM-dd HH:mm:ss"></fmt:formatDate>"></td>
<td><input type="text" name="itemsMap['detail']" value="${items.detail}"></td>
</tr>
</c:forEach>

pojo类:

public class ItemsVo {

    Map<String,Object> itemsMap = new HashMap<>();

    public Map<String, Object> getItemsMap() {
return itemsMap;
} public void setItemsMap(Map<String, Object> itemsMap) {
this.itemsMap = itemsMap;
}
}

SpringMVC的参数绑定的更多相关文章

  1. springmvc(2)--参数绑定

    一.以实例来看springmvc各种参数绑定方式   先定义个dto类: public class RestInDto implements Serializable { private static ...

  2. (转)SpringMVC学习(六)——SpringMVC高级参数绑定与@RequestMapping注解

    http://blog.csdn.net/yerenyuan_pku/article/details/72511749 高级参数绑定 现在进入SpringMVC高级参数绑定的学习,本文所有案例代码的编 ...

  3. SpringMVC学习--参数绑定

    spring参数绑定过程 从客户端请求key/value数据,经过参数绑定,将key/value数据绑定到controller方法的形参上.springmvc中,接收页面提交的数据是通过方法形参来接收 ...

  4. SpringMVC(三) —— 参数绑定和数据回显

    参数绑定的过程:就是页面向后台传递参数,后台接受的一个过程. 默认支持的参数类型:(就是你在方法上以形参的形式去定义一下的类型,就可以直接使用它) HttpServletRequest HttpSer ...

  5. springmvc(三) 参数绑定、

    前面两章就介绍了什么是springmvc,springmvc的框架原理,并且会简单的使用springmvc以及ssm的整合,从这一章节来看,就开始讲解springmvc的各种功能实现,慢慢消化 --W ...

  6. SpringMVC【参数绑定、数据回显、文件上传】

    前言 本文主要讲解的知识点如下: 参数绑定 数据回显 文件上传 参数绑定 我们在Controller使用方法参数接收值,就是把web端的值给接收到Controller中处理,这个过程就叫做参数绑定.. ...

  7. SpringMVC中参数绑定

    SpringMVC中请求参数的接收主要有两种方式, 一种是基于HttpServletRequest对象获取, 另外一种是通过Controller中的形参获取 一  通过HttpServletReque ...

  8. SpringMVC学习笔记之二(SpringMVC高级参数绑定)

    一.高级参数绑定 1.1 绑定数组 需求:在商品列表页面选中多个商品,然后删除. 需求分析:功能要求商品列表页面中的每个商品前有一个checkbok,选中多个商品后点击删除按钮把商品id传递给Cont ...

  9. SpringMVC高级参数绑定(数组和List)

    本节内容: 参数绑定之数组 将表单的数据绑定到List 复制下上篇博客中的工程,作为今天开发的工程. 一.参数绑定之数组 1. 需求 在商品列表页面选中多个商品,然后删除. 2. 需求分析 功能要求商 ...

  10. 什么是springMvc的参数绑定?

    参数绑定通俗来讲就是从页面传过来的数据通过SpringMvc进行接收.接收的数据类型可以有: (1)SpringMvc默认支持的类型:request.session.application等. (2) ...

随机推荐

  1. ArcGis Android 10.2.6更新文档翻译

    ArcGis Android 10.2.6更新文档翻译 @[ArcGis Android|10.2.6|更新文档] 本文描述了ArcGIS Runtime SDK for Android 10.2.6 ...

  2. BlangenOA项目展示(附源码)

    1. 登录界面 1.1表单校验 1.2信息有误 1.3正在登录   2.桌面 3.用户管理 3.1添加 3.2删除 3.3编辑 3.4设置用户角色 3.5设置用户权限 4.角色管理 5.权限管理(菜单 ...

  3. 利用Senparc.Weixin SDK 实现微信用户的授权,并获取信息

    前一段时间在学校做过一个项目,就是利用的Senparc.Weixin SDK 做的,于是翻看以前代码,虽然有注释,但是还是看的迷迷糊糊的,干脆就单步执行一遍看看是怎么实现的,然后就重新写了个简易的授权 ...

  4. 转载-----Java Longest Palindromic Substring(最长回文字符串)

    转载地址:https://www.cnblogs.com/clnchanpin/p/6880322.html 假设一个字符串从左向右写和从右向左写是一样的,这种字符串就叫做palindromic st ...

  5. 为什么程序员都不喜欢使用switch而使用if来做条件跳转

    请用5秒钟的时间查看下面的代码是否存在bug.   OK,熟练的程序猿应该已经发现Bug所在了,在第8行和第10行下面我没有添加关键字break; 这就导致这段代码的行为逻辑与我的设计初衷不符了. 缺 ...

  6. “全栈2019”Java第三十章:数组详解(下篇)

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  7. jquery源码解析:each,makeArray,merge,grep,map详解

    jQuery的工具方法,其实就是静态方法,源码里面就是通过extend方法,把这些工具方法添加给jQuery构造函数的. jQuery.extend({ ...... each: function( ...

  8. 量化分析获取数据的3种姿势(压箱底的神器Tushare)

    自打入门量化分析起,就有相当部分的时间在与数据打交道,从数据的获取.清洗到使用,对分析而言既是繁琐的,也是必须的.有大牛曾经说,量化分析有8成的开发时间都在处理数据. 为了节省时间,将更多精力投入到策 ...

  9. leetcode-771-Jewels and Stones(建立哈希表,降低时间复杂度)

    题目描述: You're given strings J representing the types of stones that are jewels, and S representing th ...

  10. ubuntu 使用ifupdown 进行高级网络设置

    ifupdown ubuntu 本身支持linux的网络底层设置命令:ifconfig,route,ip 等命令,但为了让网络设置更加简单,Debian 提供了一个标准的高级网络设置工具,包含 ifu ...