在 SpringMVC 中,提交请求的数据是通过方法形参来接收的。从客户端请求的 key/value 数据,经过参数绑定,将 key/value 数据绑定到 Controller 的形参上,然后在 Controller 就可以直接使用该形参。
作用:一般来讲,前端请求函数名称和后台参数名称是一致的,如果不一致,需要用请求中指定名称的参数给控制器中的形参赋值。
属性:
value: 请求参数中的名称。
required:请求参数中是否必须提供此参数。默认值: true。表示必须提供,如果不提供将报错。
演示
前端代码,请求参数是accountId=10
<a href="account/findAccount?accountId=10">查询账户</a>
后台代码(形参名称为id,和请求参数名称accountId不一致)
// 控制器,处理请求的类
@Controller
@RequestMapping("/account")
public class UserController {
@RequestMapping("/findAccount")
public String findAccount(\@RequestParam("accountId",required="true") Integer id){
System.out.println("查询了账户。。"+id)
return "success";
}
}
搭建springmvc的环境,配置pom.xml,web.xml和spring配置文件,接下来的参数绑定测试默认有这几个文件。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.zmysnagroupId>
<artifactId>springmvc01artifactId>
<version>1.0-SNAPSHOTversion>
<packaging>warpackaging>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<maven.compiler.source>1.8maven.compiler.source>
<maven.compiler.target>1.8maven.compiler.target>
properties>
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>5.0.2.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webmvcartifactId>
<version>5.0.2.RELEASEversion>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>servlet-apiartifactId>
<version>2.5version>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>jsp-apiartifactId>
<version>2.0version>
dependency>
dependencies>
project>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<servlet>
<servlet-name>DispatcherServletservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:springmvc.xmlparam-value>
init-param>
<load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>DispatcherServletservlet-name>
<url-pattern>*.dourl-pattern>
servlet-mapping>
<filter>
<filter-name>characterEncodingFilterfilter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
<init-param>
<param-name>encodingparam-name>
<param-value>UTF-8param-value>
init-param>
<init-param>
<param-name>forceEncodingparam-name>
<param-value>trueparam-value>
init-param>
filter>
<filter-mapping>
<filter-name>characterEncodingFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
web-app>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tool http://www.springframework.org/schema/tool/spring-tool.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/pages/">property>
<property name="suffix" value=".jsp">property>
bean>
<context:component-scan base-package="com.zmysna.controller">context:component-scan>
<mvc:annotation-driven>mvc:annotation-driven>
beans>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
hello
hello world!!!!!
注意:
// 控制器,处理请求的类
@Controller
// 访问当前类的一级目录。最后访问路径要是一级目录 + 方法的访问路径
@RequestMapping("user")
public class UserController {
// 请求路径: http://localhost:8080/user/save?id=100&name=Jack
@RequestMapping("save.do")
public String save(Integer id, String name) {
System.out.println(id); //100
System.out.println(name);//jack
return "success";
}
// 请求路径: http://localhost:8080/user/update?id=&name=Jack
@RequestMapping("update.do")
public String update(int id, String name) {
System.out.println(id); //产生异常
System.out.println(username);
return "success";
}
}
注意:请求参数名称一定要和对象的属性一致(不能使用@RequestParam,因此必须一致)
例如:页面参数绑定User实体类
id 就是 user 对象的属性
name 也是 user 对象的属性
public class User {
private Integer id;
private String usernamename;
//....get/set省略不写
}
部分代码,提交参数id和username
@Controller
@RequestMapping("/user")
public class UserController {
// 测试请求路径: http://localhost:8080/user/userMapping?id=100&username=Jack
@RequestMapping(value = "/userMapping")
private String userMapping(User user) {
System.out.println(user);
return "hello";
}
}
结果
user[id=100,username=Jack]
注意:
集合类型的请求参数必须在POJO实体类中,作为一个POJO属性存在,并且请求参数名称和实体类中集合属性名称相同。
给List集合中的元素赋值,使用下标。
给Map集合中的元素赋值,是要键值对。
需求:给处理器方法赋值,方法参数是一个有集合属性的实体类。
public class Address{
private String province;
private String city;
//...get/set方法省略
}
package com.zmysna.entity;
import java.util.List;
import java.util.Map;
public class User {
private Integer id;
private String name;
private List<Addresss> Int;
private Map<String,String> map;
//...get/set方法省略
}
获取请求参数:3.把请求参数封装到对象的集合中
//封装请求参数到形参。
@RequestMapping("/multiUser")
private String multiUser(User user) {
System.out.println(user);
return "hello";
}
SpringMVC 还支持使用原始 ServletAPI 对象作为控制器方法的参数。支持原始 ServletAPI 对象有:
HttpServletRequest
HttpServletResponse
HttpSession
java.security.Principal
Locale
InputStream
OutputStream
Reader
Writer
我们可以把上述对象,直接写在控制的方法参数中使用
@RequestMapping(value = "/servletApi")
private void servletApi(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws ServletException, IOException {
//转发
// request.getRequestDispatcher("/pages/hello.jsp").forward(request,response);
//重定向
`response.sendRedirect("/pages/hello.jsp");
}
为了实现参数绑定,spring默认实现了一些数据类型自动转换。想要实现自定义的类型转换,可以定义类实现Converter接口,并且配置类型转换器工厂(ConversionServiceFactoryBean)。
需求:将页面上的date参数值(字符串)封装到后台的形参上
日期 2
####7.2 后台部分代码
@RequestMapping("/searchByDate2.do")
private String searchByDate2(Date date) {
System.out.println(date);
return "hello";
}
package com.zmysna.utils;
import org.springframework.core.convert.converter.Converter;
import org.springframework.util.StringUtils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class StringToDateConvert implements Converter<String, Date> {
@Override
public Date convert(String s) {
try {
if (StringUtils.isEmpty(s)) {
throw new RuntimeException("数据源为空");
}
return new SimpleDateFormat("yyyy-MM-dd").parse(s);
} catch (ParseException e) {
throw new RuntimeException("只支持日期类型为 yyyy-MM-dd 的转换!");
}
}
}
<bean id="serviceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.zmysna.utils.StringToDateConvert">bean>
set>
property>
bean>
<mvc:annotation-driven conversion-service="serviceFactoryBean">mvc:annotation-driven>
beans>