SpringMVC框架学习记录 4 获取请求数据

基本类型数据

Controller 中的业务方法的参数名与请求参数的 name 保持一致,SpringMVC 自动进行匹配

@RequestMapping("/eat1")
@ResponseBody
public void eat1(String username, int age) {
	System.out.println(username);
	System.out.println(age);
}

通过如下请求进行测试

http://localhost:8080/user/eat1?userName=猫头夜鹰&age=3

服务端成功接受数据


POJO 类型数据

Controller 中的业务方法的 POJO 类型的属性名与请求参数的 name 保持一致,SpringMVC 自动进行匹配

User 类中含有 userName 和 age 属性

@RequestMapping("/eat2")
@ResponseBody
public void eat2(User user) {
	System.out.println(user);
}

通过如下请求进行测试

http://localhost:8080/user/eat2?userName=猫头夜鹰&age=3

服务端成功接受数据


数组类型数据

Controller 中的业务方法的数组参数名与请求参数的 name 保持一致,SpringMVC 自动进行匹配

@RequestMapping("/eat3")
@ResponseBody
public void eat3(String[] food) {
	System.out.println(Arrays.asList(food));
}

通过如下请求进行测试

http://localhost:8080/user/eat3?food=苹果&food=西瓜&food=菠萝

服务端成功接受数据


集合类型数据

(1)创建 VO 类,含相应的集合属性,将请求数据封装到 VO 对象中

package Entity;

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 "VO{" + "userList=" + userList + '}';
	}
}

Controller 中的业务方法的参数为相应的 VO 类型

@RequestMapping("/eat4")
@ResponseBody
public void eat4(VO vo) {
	System.out.println(vo);
}

jsp 中表单如下,name 指定了将要填充的位置下标,以及该对象的具体属性,如 userList[0].userName 表示填充 VO 对象的属性 userList 的第一个元素,并填充它的 userName 为相应值

<form action="${pageContext.request.contextPath}/user/eat4">
    <input type="text" name="userList[0].userName">
    <input type="text" name="userList[0].age"><br>
    <input type="text" name="userList[1].userName">
    <input type="text" name="userList[1].age">
    <input type="submit" value="提交">
</form>

(2)Ajax 指定 contentType 为 json ,通过 @RequestBody 接受集合数据

@RequestMapping("/eat5")
@ResponseBody
public void eat5(@RequestBody List<User> userList) {
	System.out.println(userList);
}

Controller 中的业务方法的参数名可以任取,@RequestBody 一般用于接受 POST 请求的 application/json 类型的数据,也就是 json 格式的字符串,并自动解析生成相应 java 对象

var userList = [];
userList.push({userName: "猫头夜鹰", age: 3})
userList.push({userName: "卡比兽", age: 5})

$.ajax({
    type: "POST",
    url: "${pageContext.request.contextPath}/user/eat5",
    data: JSON.stringify(userList),
    contentType: "application/json;charset=utf-8"
})

请求数据乱码问题

在 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 与 Controller 中的业务方法的参数名不一致时,可以通过 @RequestParam 注解显式的进行参数绑定

@RequestMapping("/eat6")
@ResponseBody
public void eat6(@RequestParam("uName") String userName) {
	System.out.println(userName);
}

此时请求数据的 name 可以为 uName ,示例请求如下

http://localhost:8080/user/eat6?uName=猫头夜鹰

服务端成功接受数据

对于 @RequestParam 注解,默认参数为 value ,当参数仅有一个时,可以不显式的写出 value

  • value:请求参数的 name
  • required:请求参数是否必须包括,默认为 true ,为 true 时若请求数据中不含该参数会报错
  • defaultValue:请求参数的默认值

RESTful 风格参数

RESTful(Representational State Transfer)是一种网络应用程序的设计风格开发方式,使用 POST ,DELETE ,PUT 和 GET 四种请求方式对指定的 URL 资源进行增删改查操作

RESTful 使用 url + 请求方式 表示一次请求的目的

  • GET:获取
  • POST:增加
  • PUT:更新
  • DELETE:删除

在 MVC 中使用占位符进行参数绑定,使用 @PathVariable 注解将占位符参数绑定到 Controller 中的业务方法的形参

@RequestMapping("/eat7/{name}")
@ResponseBody
public void eat7(@PathVariable(value = "name") String userName) {
	System.out.println(userName);
}

通过如下请求进行测试

http://localhost:8080/user/eat7/猫头夜鹰

服务端成功接受数据

可通过 RequestMapping 对请求方法进行判断,进而调用不同的处理方法

@RequestMapping(value = "/eat7/{name}", method = RequestMethod.PUT)
@ResponseBody
public void eat7Put(@PathVariable(value = "name") String userName) {
	System.out.println(userName);
}

@RequestMapping(value = "/eat7/{name}", method = RequestMethod.GET)
@ResponseBody
public void eat7Get(@PathVariable(value = "name") String userName) {
	System.out.println(userName);
}

自定义类型转换器

在 SpringMVC 中,默认提供了一些常用的类型转换器,如在请求中的字符串,如果是数字,可以自动转化为 int 类型,对于一些特殊类型,需要自定义类型转换器,下面以日期类型示例

对于前端请求中的日期数据,格式不一,当后端需要用 Java 的 Date 类型接受时,则需要相应的类型转换器

(1)创建 DateConverter 类,实现 Converter 接口并重写 convert 方法

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) {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		Date date = null;
		try {
			date = format.parse(s);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return date;
	}
}

泛型中 String 表示传入的数据是字符串,转换后传出 Date

(2)在 spring-mvc.xml 文件中声明转换器

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

(3)在 spring-mvc.xml 文件中用 <mvc:annotation-driven> 引用转换器

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

测试如下: 

@RequestMapping(value = "/eat8")
@ResponseBody
public void eat8(Date date) {
	System.out.println(date);
}

请求日期数据

http://localhost:8080/user/eat8?date=2021-11-29

服务端成功接受数据,并转化为相应的 Date 对象


获取请求头

通过 @RequestHeader 注解可以获取请求标头信息,默认参数为 value ,当参数仅有一个时,可以不显式的写出 value

  • value:请求标头的参数名
  • required:请求参数是否必须包括
@RequestMapping(value = "/eat9")
@ResponseBody
public void eat9(@RequestHeader("User-Agent") String user_agent) {
	System.out.println(user_agent);
}

通过 @CookieValue 注解获得指定 Cookie 的值,默认参数为 value ,当参数仅有一个时,可以不显式的写出 value

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

Guess you like

Origin blog.csdn.net/qq_25274377/article/details/121569112