在springMVC中,提交请求的数据是通过方法形参来接收的,从客户端请求的key/value数据,经过参数绑定,将key/value数据绑定到controller形参上,然后再controller就可以直接使用该形参。

默认支持的类型

  springMVC有支持的默认参数类型,我们直接在形参上给出这些默认类型的生命,就可以直接使用了。其中httpservletRequest对象需要导入tomcat-servlet包。

    1.HttpServletRequest对象

    2.HttpSerletResponse对象

    3.HttpSession对象

    4.Model/ModelMap对象

    @RequestMapping("/edit")
public ModelAndView edit(HttpServletRequest request, HttpServletResponse response, HttpSession session, Model model, ModelMap modelMap) throws IOException {
String id = request.getParameter("id");
request.setAttribute("request",id); response.getWriter().write("response"); session.setAttribute("session",id); model.addAttribute("model",id); modelMap.addAttribute("modelMap",id); ModelAndView mav = new ModelAndView();
mav.setViewName("edit");
return mav;
}

jsp页面

<html>
<head>
<title>edit</title>
</head>
<body>
${request} ${session} ${model} ${modelMap}
</body>
</html>

测试地址:/product/eidt?id=112

Model/ModelMap,ModelMap是Model借口的一个实现类,作用是将Model数据填充到request域,即使使用Model接口,其内部还是由ModelMap来实现。

基本数据类型的绑定

  byte、short、int、long、float、double、char、boolean

    @RequestMapping("/query")
public ModelAndView Query(Integer id){
System.out.print(id);
return new ModelAndView("edit");
}

输入路径测试http://localhost:9999/product/query?id=123

这里输入的参数值和controller的参数变量名保持一致,就能完成数据绑定,如果不一致可以使用@RequestParam注解来完成

    @RequestMapping("/query")
public ModelAndView Query(@RequestParam("username")int id){
System.out.print(id);
return new ModelAndView("edit");
}

因为是基本数据类型,所以如果前台传递的值是?id=null的话就会数据转换异常,所以这里最好将参数类型定义成包装类。

包装类数据类型的绑定

  Integer、Long、Byte、Double、Float、Short、String

public ModelAndView Query(@RequestParam("username")Integer id){

虽然可以?id=null  但是不写?id=又会报错 ,可以设定默认值以及是否必传

@RequestMapping(value="/say",method=RequestMethod.GET)
public String say(@RequestParam(value="id",required=false,defaultValue="0") Integer myId)

POJO(实体类)类型的绑定

Product.java

package com.david.pojo;

import java.util.Date;

public class Product {
private Integer id;
private String name;
private String price;private Integer categoryId; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getPrice() {
return price;
} public void setPrice(String price) {
this.price = price;
}public Integer getCategoryId() {
return categoryId;
} public void setCategoryId(Integer categoryId) {
this.categoryId = categoryId;
}
}

参数要与pojo实体类的属性保持一致即可映射成功

    @RequestMapping(value = "/add",method = RequestMethod.POST)
public ModelAndView add(Product product){
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
ProductMapper mapper = ac.getBean(ProductMapper.class);
mapper.addProduct(product);
return new ModelAndView("edit");
}

jsp

<form action="/product/add" method="post">
<input name="id">
name:<input name="name">
price:<input name="price">
<button type="submit">提交</button>
</form>

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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

绑定包装pojo类

新建一个包装类 QueryVo 包含Product属性

public class QueryVo {
private Product product;
private String name;
private String img;
}

编辑controller

<form action="/product/query" method="post">
img:<input name="img">
name:<input name="name">
proname:<input name="product.name">
proprice:<input name="product.price">
<button type="submit">提交</button>
</form>

在表单中使用该对象属性名.属性来命名如 product.name

自定义参数类型绑定

  由于日期有很多种,springmvc没办法把字符串转换为日期类型,所以需要自定义参数绑定。

1.定义String类型到Date类型的转换器

package com.david.utils;

import org.springframework.core.convert.converter.Converter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; public class DateConverter implements Converter<String, Date> {
@Override
public Date convert(String s) {
//实现将字符串转成日期类型(格式是yyyy-MM-dd HH:mm:ss)
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
return dateFormat.parse(s);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//如果参数绑定失败返回null
return null;
}
}

2.在springmvc.xml文件中配置转换器

<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<!-- 自定义转换器的类名 -->
<bean class="com.david.utils.DateConverter"></bean>
</property>
</bean>

3.修改queryVo

public class QueryVo {
private Product product;
private String name;
private String img;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date createTime;
。。。

4.jsp

<form action="/product/query" method="post">
createTime:<input name="createTime">
<button type="submit">提交</button>
</form>

数组类型的绑定

    @RequestMapping("/query")
public ModelAndView Query(Integer[] nums){
for(int i : nums){
System.out.println(i);
}
return new ModelAndView("edit");
}
<form action="/product/query" method="post">
createTime:<input name="nums"><input name="nums"><input name="nums"><input name="nums">
<button type="submit">提交</button>
</form>

List类型的绑定

需要定义包装类 实现List绑定-不能直接形参List

package com.david.pojo;

import java.util.List;

public class QueryVo {
private List<Product> products; public List<Product> getProducts() {
return products;
} public void setProducts(List<Product> products) {
this.products = products;
}
}
    @RequestMapping("/query")
public ModelAndView Query(QueryVo vo){
for(Product p : vo.getProducts()){
System.out.println(p);
}
return new ModelAndView("edit");
}
<form action="/product/query" method="post">
createTime:<input name="products[0].name"><input name="products[0].price"> <input name="products[1].name">
<button type="submit">提交</button>
</form>

springMVC和struts2的区别

1.springmvc的入口是一个servlet前端控制器,而struts2入口是一个filter过滤器

2.springmvc是基于方法开发,请求参数传递到方法的形参,可以设计为单例或多例,struts2是基于类开发啊传递参数是通过类的属性,只能设计为多例。

3.struts2采用值栈请求和相应数据,通过ognl存取数据,springmvc通过参数解析器将request请求内容解析,并给方法形参赋值,将数据和视图凤凰族昂成ModelAndView对象,最后又将ModelAndView中的模型数据通过request域传输到页面。

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

  1. SpringMvc参数绑定出现乱码解决方法

    在SpringMvc参数绑定过程中出现乱码的解决方法 1.post参数乱码的解决方法 在web.xml中添加过滤器 <!-- 过滤器 处理post乱码 --> <filter> ...

  2. 一篇文章搞定SpringMVC参数绑定

    SpringMVC参数绑定,简单来说就是将客户端请求的key/value数据绑定到controller方法的形参上,然后就可以在controller中使用该参数了 下面通过5个常用的注解演示下如何进行 ...

  3. [转载]SpringBoot系列: SpringMVC 参数绑定注解解析

    本文转载自 https://www.cnblogs.com/morethink/p/8028664.html, 作者写得非常好, 致谢! SpringMVC 参数绑定注解解析   本文介绍了用于参数绑 ...

  4. SpringMVC参数绑定,这篇就够了!

    SpringMVC参数绑定,简单来说就是将客户端请求的key/value数据绑定到controller方法的形参上,然后就可以在controller中使用该参数了 下面通过5个常用的注解演示下如何进行 ...

  5. SpringMVC参数绑定(未完待续)

    1. Strut2与SpringMVC接收请求参数的区别 Struts2通过action类的成员变量接收SpringMVC通过controller方法的形参接收 2. SpringMVC参数绑定流程 ...

  6. 【工作篇】再次熟悉 SpringMVC 参数绑定

    前言 主要现在项目中使用的参数绑定五花八门的,搞得很头大,例如有些用字符串接收日期,用字符串接受数组等等,完全没有利用好 SpringMVC 的优势,这里自己也总结一下,免得到时又要百度谷歌查找. 以 ...

  7. SpringMVC参数绑定(从请求中接受参数)

    参数绑定(从请求中接收参数) 1)默认类型: 在controller方法中可以有也可以没有,看自己需求随意添加. httpservletRqeust,httpServletResponse,httpS ...

  8. SpringMVC 参数绑定注解解析

    本文介绍了用于参数绑定的相关注解. 绑定:将请求中的字段按照名字匹配的原则填入模型对象. SpringMVC就跟Struts2一样,通过拦截器进行参数匹配. 代码在 https://github.co ...

  9. SpringMVC参数绑定总结

    springMvc作用:    a) 接收请求中的参数    b) 将处理好的数据返回给页面参数绑定(就是从请求中接收参数):    a) 默认支持的类型: request, response, se ...

随机推荐

  1. CVPR2016 Paper list

    CVPR2016 Paper list ORAL SESSIONImage Captioning and Question Answering Monday, June 27th, 9:00AM - ...

  2. vue移动端地址三级联动组件(二)

    继续上一篇: 子组件css: <style scoped lang="less"> #city { width: 100%; height: 100%; positio ...

  3. Cat VS Dog HDU_3829(最大独立集最大匹配)

    Cat VS Dog 题意:一群小朋友去动物园,如果每个小朋友喜欢的动物是猫,那么不喜欢的动物一定是狗,反之也是.现在动物园的管理者要拿走一些动物,如果拿走的是某个小朋友不喜欢的动物,那这个小朋友就非 ...

  4. Ubuntu网卡设置:配置/etc/netplan

    对于Ubuntu1804版本,经过测试如下配置可以设置静态IP地址: Google@ubuntu:~$ cat /etc/netplan/01-netcfg.yaml network: etherne ...

  5. Linux之网络ping(unknown host)故障及yum no more mirrors to try

    1.ping外网出现ping:unknown host   字样故障 鉴于网上大多都是提供临时生效的解决办法,这里不再赘述,并提供下永久生效的方案: 永久生效: 1)添加DNS地址和下一跳网关地址至网 ...

  6. TCP/IP UDP 协议首部及数据进入协议栈封装的过程

    数据的封装 UDP 封装 TCP 封装 IP 封装 检验和算法 当应用程序用TCP传送数据时,数据被传送入协议栈中,然后逐一通过每一层直到被当作一串比特流送入网络 注: UDP数据TCP数据基本一致. ...

  7. 2.5.3 简单的 echo 输出

        echo的任务就是产生输出,可用来提示用户,或是用来产生数据供进一步处理.       原始的echo命令只会将参数打印到标准输出,参数之间以一个空格隔开,并以换行符号(newline)结尾. ...

  8. 3 numpy模块

    Numpy     什么是Numpy:Numeric Python         Numpy模块是Python的一种开源的数值计算扩展.             1 一个强大的N维数组对象Array ...

  9. Accessoft-日期区间段查询示例,开始日期至截止日期区段查询

    Accessoft-日期区间段查询示例,开始日期至截止日期区段查询 实现功能效果如下: 示例查询开始日期为2017年3月15日到2017年3月16日的内容: sql查询语句如下: SELECT Inf ...

  10. 手机浏览PC版页面出现背景图片显示不全的问题解决方案

    手机浏览PC版页面出现背景图片显示不全 给定宽高的值