Skip to content

四、请求

一、获得请求参数

信息

客户端请求参数的格式是:name=value&name=value..…

服务器端要获得请求的参数,有时还需要进行数据的封装,SpringMVC可以接收如下类型的参数:

  • 基本类型参数
  • POJO类型参数
  • 数组类型参数
  • 集合类型参数

1、获取基本类型参数

提示

Controller中的业务方法的参数名称要与求请求参数一致,参数值会自动映射匹配

代码

java
@Controller
@RequestMapping("/user")
public class UserController {
	@RequestMapping("/user")
	@ResponseBody
	public void basicDataRequest(String username,int age){
	    System.out.println(username);
	    System.out.println(age);
    }
}

测试

http://localhost:8080/spring_data_war_exploded/user/user?username=胡二狗&age=21

2、获取POJO类型参数

提示

Controller中的业务方法的参数名称要与求请求参数一致,参数值会自动映射匹配

代码

java
@Controller
@RequestMapping("/user")
public class UserController {
	@RequestMapping("/user")
	@ResponseBody
	public void basicDataRequest(User user){
	    System.out.println(user.getUsername());
	    System.out.println(user.getAge());
    }
}

测试

http://localhost:8080/spring_data_war_exploded/user/user?username=胡二狗&age=21

3、获取数组类型参数

提示

Controller中的业务方法的参数名称要与求请求参数一致,参数值会自动映射匹配

代码

java
@Controller
@RequestMapping("/user")
public class UserController {
	@RequestMapping("/user")
	@ResponseBody
	public void basicDataRequest(String[] strings){
   		 System.out.println(Arrays.asList(strings));
    }
}

测试

http://localhost:8080/spring_data_war_exploded/user/user?strs=aaa&strs=bbb&strs=ccc

4、获取集合类型参数


(1)方式一

  1. 创建Vo对象

    java
    package com.hdq.domain;
    
    import java.util.List;
    
    public class Vo {
        private List<User> userList;
    
        public List<User> getUserList() {
            return userList;
        }
    
        public void setUserList(List<User> userList) {
            this.userList = userList;
        }
    
        @Override
        public String toString() {
            return userList.toString();
        }
    }
  2. 封装user到userList集合

    java
    @Controller
    @RequestMapping("/user")
    public class UserController {
    	@RequestMapping(value = "/user")
    	@ResponseBody
    	public void basicDataRequest(Vo vo){
       		 System.out.println(vo);
        }
    }

(2)方式二

提示

当使用ajax提交时,可以指定contentType为json形式,那么在方法参数位置使用@RequestBody可以直接接收集合数据而无需使用POJO进行包装

提示

如果想引入jquery等外部资源,需要在spring-mvc.xml配置访问开发资源权限

xml
<mvc:resources mapping="/static/**" location="/static/"/>
js
<script src="${pageContext.request.contextPath}/static/js/test.js"></script>
javascript
<script>
//模拟数据
var userList=new array();
userList.push({username:"zhangsan",age:"20"});
userList.push({username:"lisi",age:"20”});

$.ajax({
	type:"POST",
	url:"/user/user",
	data:JSON.stringify(userList),
	contentType :"application/json;charset=utf-8"
})
</script>
java
@Controller
@RequestMapping("/user")
public class UserController {
	@RequestMapping(value="/user")
	@ResponseBody
	public void test(@RequestBody List<User> userList){
    	System.out.println(userList);
    }
}

二、解决请求乱码问题

配置web.xml文件

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>

三、参数绑定注解@requestParam

注解@RequestParam,有如下参数可以使用:

  • value:与请求参数名称
  • required:此在指定的请求参数是否必须包括,默认是true,提交时如果没有此参数则报错
  • defaultValue:当没有指定请求参数时,则使用指定的默认值赋值
java
@RequestMapping("/user")
@ResponseBody
public void test(@RequestParam(value="name",required=false,defaultValue="itcast") String username){
    System,out.println(username);
}

四、获得Restful风格的参数

介绍

Restful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。主要用于客户端和服务器交互类的软件,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存机制等。

Restful风格的请求是使用“url + 请求方式”表示一次请求目的的,HTTP协议里面四个表示操作方式的动词如下:

  • GET:用于获取资源
  • POST:用于新建资源
  • PUT:用于更新资源
  • DELETE:用于删除资源

例如:

  • /user/1 +GET :得到id=1的 user
  • /user/1 + DELETE:删除id=1的 user
  • /user/1 +PUT:更新id =1的 user
  • /user + POST:新增 user

1、使用@pathvariable获取请求路径参数

java
@RequestMapping("/user/{id}")
@ResponseBody
publie void test(@PathVariable(value="id",required=true) Integer id){
	System.out.println(id)
}

五、自定义类型转换器

自定义类型转换器的开发步骤

  1. 定义转换器类实现Converter接口
  2. 在配置文件中声明转换器
  3. <annotation-driven>中引用转换器

提示

针对不同的时间格式,springmvc不能全部能够进行处理

现在针对yyyy-MM-dd格式进行格式转换

1、创建converter文件夹,定义转换器

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

public class DateConverter implements Converter<String, Date> {
    @Override
    public Date convert(String dateStr) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            date = simpleDateFormat.parse(dateStr);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
        return date;
    }
}

2、在配置文件中声明转换器

spring-mvc.xml

xml
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <list>
            <bean class="com.hdq.converter.DateConverter"></bean>
        </list>
    </property>
</bean>

3、引用转换器

提示

注意id与上面一致

xml
<mvc:annotation-driven conversion-service="conversionService"/>

六、获得Servlet相关API

提示

SpringMVC支持使用原始ServetAPI对象作为控制器方法的参数进行注入,常用的对象如下

  • HttpServletRequest
  • HttpServletResponse
  • HttpSession
java
@RequestMapping("/test")
@ResponseBody
public void test(HttpServletRequest request,HttpServletResponseresponse,Httpsession session){
    System.out.println(request);
    System.out.println(response);
    System,out.printIn(session);
}

七、获取请求头

1、@RequestHeader

使用@RequestHeader可以获得请求头信息

  • value:请求头的名称
  • required:是否必须携带此请求头
java
@RequestMapping("/test")
@ResponseBody
public void test(@RequestHeader(value="User-Agent",reguired=false) String headerValue){
	System.out.println(headerValue);
}

2、@CookieValue

使用@CookieValue可以获得指定Cookie的值,@CookieValue注解的属性如下

  • value:指定cookie的名称
  • required:是否必须携带此cookie
java
@RequestMapping(value="/test")
@ResponseBody
public void test(@CookieValue(value="JSESSIONID") String jsessionId){
	System out.println(jsessionId);
}

八、上传文件

1、文件上传客户端三要素

  • 表单项type="file"
  • 表单的提交方式是post
  • 表单的enctype属性是多部分表单形式,即enctype="multipart/form-data"

2、文件上传原理

  • 当form表单修改为多部分表单时,request.getParameter()将失效.
  • enctype="application/x-www-form-urlencoded"时,form表单的正文内容格式是key=value&key=value&key=value
  • 当form表单的enctype取值为mutilpart/form-data时,请求正文内容就变成多部分形式

3、单文件上传步骤

  • 导入fileuploadio坐标
  • 配置文件上传解析器
  • 编写文件上传代码

(1)导入fileuploadio坐标

xml
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.2</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.3</version>
</dependency>

(2)配置文件上传解析器

spring-mvc.xml

xml
<!--文件上传解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--上传文件总大小-->
   <property name="maxUploadSize" value="5242800"/>
<!-- 上传单个文件大小-->
   <property name="maxUploadSizePerFile" value="5242800"/>
<!--        上传文件的编码类型-->
   <property name="defaultEncoding" value="UTF-8"/>
</bean>

(3)编写文件上传代码

java
@RequestMapping("/uploadSingleFile")
@ResponseBody
public void test(String username, MultipartFile uploadFile) throws IOException {
    System.out.println(username);
    System.out.println(uploadFile);
    String originalFilename = uploadFile.getOriginalFilename();
    uploadFile.transferTo(new File("c:\\upload\\"+originalFilename));
}

结果

忽而狗
MultipartFile[field="uploadFile", filename=001进门口(1).jpg, contentType=image/jpeg, size=996231]

4、多文件上传

提示

基于单文件上传而改动

html
<form action="${pageContext.request.contextPath}/user/uploadSingleFile" method="post" enctype="multipart/form-data">
    <label>姓名:</label> <input type="text" name="username"/> <br/>
    <label>文件:</label> <input type="file" name="uploadFile1" /><br/>
    <label>文件:</label> <input type="file" name="uploadFile2" /><br/>
    <label>文件:</label> <input type="file" name="uploadFile3" /><br/>
    <label>文件:</label> <input type="file" name="uploadFile4" /><br/>
    <input type="submit" name="提交">
</form>
java
@RequestMapping("/uploadSingleFile")
@ResponseBody
public void test(String username, MultipartFile[] uploadFiles) throws IOException {
    File uploadDir = new File("E:\\code\\java\\代码\\SpringMVC\\spring-data\\src\\main\\resources\\upload");
    if (!uploadDir.exists()) {
        uploadDir.mkdirs(); // 使用 mkdirs 以确保创建多层目录
    }
    for (MultipartFile file : uploadFiles) {
        if (!file.isEmpty()) {
            String filename = file.getOriginalFilename();
            System.out.println(new File(uploadDir, filename));
            file.transferTo(new File(uploadDir, filename));
        }
    }
}