首页 > 编程语言 > 详细

SpringMVC请求参数绑定

时间:2021-01-24 11:13:10      阅读:35      评论:0      收藏:0      [点我收藏+]

请求参数的绑定

请求参数的绑定说明

绑定机制

  1. 表单提交的数据都是k=v格式的,username=hh&password=123
  2. SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的。
  3. 要求提交表单的name和参数的名称相同。

支持的数据类型

  1. 基本数据类型和字符串类型
  2. 实体类型JavaBean
  3. 集合数据类型(List,Map集合等)

绑定基本数据类型和字符串类型

  1. 提交表单的name和参数的名称一致
  2. 区分大小写

前端代码示例:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>请求参数的绑定</title>
</head>
<body>
    <a href="/param/testParam?username=hehe&password=123">请求参数绑定</a>
</body>
</html>

后台代码示例:

package com.example.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/param")
public class ParamController {
    @RequestMapping("testParam")
    public String testParam(String username,String password){
        System.out.println("执行");
        System.out.println(username);
        System.out.println(password);
        return "success";
    }
}

请求参数绑定实体类型(JavaBean)

绑定时,标签的name属性必须和JavaBean的属性名一致才能封装上,实质上使用的是setter方法。在JavaBean中如果有另一个实体作为属性时,则使用该Bean的属性名.另一个类的属性名。例如:Account中有一个User的实体类作为属性,属性名为user,而User中的属性有uname和age,则标签的name属性的值为user.uanmeuser.age

前端代码示例:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>请求参数的绑定</title>
</head>
<body>
    <form action="/param/saveAccount" method="post" >
        姓名:<input type="text" name="username"><br>
        密码:<input type="text" name="password"><br>
        金额:<input type="text" name="money"><br>
        用户姓名:<input type="text" name="user.uname"><br>
        用户年龄:<input type="text" name="user.age"><br>
        <input type="submit" value="提交">
    </form>
</body>
</html>

后台代码示例:

package com.example.domain;
import java.io.Serializable;
public class User implements Serializable {
    private String uname;
    private Integer age;
}
package com.example.domain;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

public class Account implements Serializable {
    private String username;
    private String password;
    private Double money;
	private User user;
}
package com.example.controller;
import com.example.domain.Account;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/param")
public class ParamController {
    @RequestMapping("saveAccount")
    public String saveAccount(Account account){
        System.out.println("执行了。。。");
        System.out.println(account);
        return "success";
    }
}

配置解决中文乱码的过滤器

在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>

请求参数绑定集合类型

在标签的name属性只要说明集合的名称,其他与绑定实体类型一致。

前端代码示例:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>请求参数的绑定</title>
</head>
<body>
    <form action="/param/saveAccount" method="post" >
        姓名:<input type="text" name="username"><br>
        密码:<input type="text" name="password"><br>
        金额:<input type="text" name="money"><br>
        用户姓名1:<input type="text" name="list[0].uname"><br>
        用户年龄1:<input type="text" name="list[0].age"><br>
        用户姓名2:<input type="text" name="map[‘one‘].uname"><br>
        用户年龄2:<input type="text" name="map[‘one‘].age"><br>
        <input type="submit" value="提交">
    </form>
</body>
</html>

后台代码示例:

package com.example.domain;
import java.io.Serializable;
public class User implements Serializable {
    private String uname;
    private Integer age;
}
package com.example.domain;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
public class Account implements Serializable {
    private String username;
    private String password;
    private Double money;
    private List<User> list;
    private Map<String,User> map;
}
package com.example.controller;
import com.example.domain.Account;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/param")
public class ParamController {
    @RequestMapping("saveAccount")
    public String saveAccount(Account account){
        System.out.println("执行了。。。");
        System.out.println(account);
        return "success";
    }
}

自定义类型转换器

在实际应用中,会出现类型输入问题,例如:日期格式问题。这时,需要把输入的格式转换成我们想要的格式,这时需要自定义类型转换器。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>请求参数的绑定</title>
</head>
<body>
    <form action="/param/saveUser" method="post">
        用户姓名:<input type="text" name="uname"><br>
        用户年龄:<input type="text" name="age"><br>
        用户生日:<input type="text" name="date"><br>
        <input type="submit" value="提交">
    </form>
</body>
</html>
package com.example.domain;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable {
    private String uname;
    private Integer age;
    private Date date;
}

使用步骤

第一步:定义按一个类,实现Converter接口,该接口有2个泛型。

package com.example.utils;
import org.springframework.core.convert.converter.Converter;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
 * 把字符串转换为日期
 */
public class StringToDateConverter implements Converter<String, Date> {
    @Override
    public Date convert(String source) {
        if(source == null){
            throw new RuntimeException("请传入数据");
        }
        DateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd");
        try {
            return dateFormat.parse(source);//把字符串转化为日期
        } catch (Exception e) {
            throw new RuntimeException("数据类型转换出现错误");
        }
    }
}

第二步:在springmvc.xml配置文件中配置

<!--配置自定义类型转换器-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <bean class="com.example.utils.StringToDateConverter"></bean>
        </set>
    </property>
</bean>
<!--开启注解扫描中添加转换器,启动转换器。-->
<mvc:annotation-driven conversion-service="conversionService"/>

获取原生request和response

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>请求参数的绑定</title>
</head>
<body>
    <a href="/param/testServlet">Servlet原生API</a>
</body>
</html>
package com.example.controller;
import com.example.domain.Account;
import com.example.domain.User;
import org.springframework.http.HttpRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@Controller
@RequestMapping("/param")
public class ParamController {
    @RequestMapping("/testServlet")
    public String testServlet(HttpServletRequest request, HttpServletResponse response){
        System.out.println(request);
        HttpSession session = request.getSession();
        System.out.println(session);
        ServletContext servletContext = session.getServletContext();
        System.out.println(servletContext);
        System.out.println(response);
        return "success";
    }
}

SpringMVC请求参数绑定

原文:https://www.cnblogs.com/acknowledge/p/14320131.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!