【Spring】SpringMVC请求参数接收与响应数据返回

Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架。

易于同其它View框架(Tiles等)无缝集成,采用IOC便于测试。Spring MVC的核心为Controller控制器,用于处理请求产生响应。

SpringMVC实现原理

SpringMVC通过核心控制器DispatcherServlet控制器接收各种请求,并根据请求地址转发给各个控制器,进行逻辑处理,待完成逻辑处理后,将响应结果返回给相对应的视图并完成对视图的渲染。

SpringMVC环境搭建

引入Maven依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.14.RELEASE</version>
        </dependency>
    </dependencies>

spring-webmvc可以一次性引入spring的核心包,aop包和MVC需要的jar包

配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <!-- 初始化spring配置文件的目录 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
        </init-param>

        <!-- 在服务启动时创建SpringIOC容器,并初始化DispatcherServlet -->
        <load-on-startup>0</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

DispatcherServlet是Spring MVC的核心类用于拦截前端的请求,并根据HTTP请求路径调用相关的Controller控制器去处理。

如果没有添加load-on-startup标签,程序将在浏览器第一次进行访问时创建DispatcherServlet,所以为了提高程序的响应速度一般在服务启动后就开始创建

配置applicationContext.xml

配置Spring核心配置文件,添加context和mvc约束。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        https://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/mvc
        https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <context:component-scan base-package="com.spring.mvc"/>

    <!-- 开启SpringMVC注解开发模式 -->
    <mvc:annotation-driven/>

    <!-- 对图片、js、css等静态资源不进行拦截 -->
    <mvc:default-servlet-handler />
</beans>

<mvc:default-servlet-handler/>添加后对于前台请求的静态资源Servlet将不会再进行处理,提高程序效率

注解

URL映射

Spring MVC可以通过注解的形式为方法添加对应的URL映射,使核心控制器对前端的请求进行分发。常用的注解主要有一下三类:

注解作用域描述
@GetMapping(value = “{url}”)方法获取前端的Get请求
@PostMapping(value = “{url}”)方法获取前端的Post请求
@PutMapping(value = “{url}”)方法获取前端的Put请求
@DeleteMapping(value = “{url}”)方法获取前端的Delete请求

以上4中注解均为组合注解,是由@RequestMapping注解根据不同的属性值进行封装之后产生的

属性作用域描述
name
方法
为映射提供名称,若为组合名称可以使用“#”分隔
value
方法
请求映射地址,在类上使用时,所有方法的映射都会继承此映射,针对特定的处理程序方法将其范围缩小
method
方法
HTTP请求方法,主要用:GET、POST、PUT、DELETE等方法,在类上使用后,该类的所有方法都会继承此HTTP方法
params
方法
映射请求的参数,限制请求范围,只有在符合该参数时才允许映射请求。
headers
方法
映射请求的请求头,限制请求范围,只有符合该类型的请求头才允许请求映射,参数为JSON格式可以使用通配符
consumes
方法
映射请求的请求类型,限制请求范围,只有符合该请求类型(Content-Type)时才允许映射,参数为JSON格式可以使用通配符
produces
方法
映射请求的响应类型,限制请求范围,只有当Accept能匹配时才允许映射请求,参数为JSON格式可以使用通配符

请求

无注解形式

若控制器的方法中参数为一个实体类,Spring MVC会根据请求的参数名称,自动去寻找实体类中名称相同的属性进行赋值并自动封装为实体类并传入控制器的方法中。

若实体类中还包含另外的实体类,在前端请求时需要注意该参数的写法。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
	用户名:<input name="username">
	密码:<input name="password">
	姓名:<input name="idcard.name">
	身份证:<input name="idcard.idno">
	过期时间:<input name="idcard.expire">
</body>
</html>
// 实体类
public class User {
	private String username;
	private String password;
	private IDCard IDCard = new IDCard();
	
	//ignore setter and getter
}

@Controller
public class UserController {
	@RequestMapping(value = "/user", method = RequestMethod.POST)
	public String getUser(User user) {
		// ignore
	}
}

参数绑定

Spring MVC提供了便捷方法可以在控制器方法中书写对应的请求参数,如此核心控制器会自动将请求中的参数赋值给方法中的参数上,极大简化了接收参数的方法。

对于参数的数据类型Spring MVC会自动进行转化,例如某一参数为Integer类型,Spring MVC会将请求中的参数自动转化为Integer类型。

当请求的参数名与控制器方法中的参数名不相同时,可以对方法参数添加@RequestParam注解对请求参数进行映射。

属性描述
name参数名称
valuename属性的别名
required是否为必传参数,为布尔类型,当为true时若前端不传入该参数会报错
defualtValue参数默认值
@Controller
public class UserController {
	@PostMapping("/apply")
    @ResponseBody
    public String apply(@RequestParam(name = "name", value = "n",defaultValue = "ANON") String name, String course, Integer[] purpose){
        System.out.println(name);
        System.out.println(course);
        for (Integer p : purpose) {
            System.out.println(p);
        }
        return "SUCCESS";
    }
}

路径参数

SpringMVC可以将参数写入请求路径中,可以通过注解@PathVariable解析路径并绑定参数

属性描述
name参数名称
valuename属性的别名
required是否为必传参数,为布尔类型,当为true时若前端不传入该参数会报错
@GetMapping("/pathvariable/{name}/{age}")
public User PathVariable(@PathVariable String name,@PathVariable int age) {
	User user = new User();
	user.setName(name);
	user.setAge(age);
	return user;
}

请求体

利用注解@RequestBody读取请求中的请求体,将其自动封装进映射方法的参数中

@Controller
public class UserController {
	@RequestMapping(value = "/user", method = RequestMethod.POST)
	public String getUser(@RequestBody User user) {
		// ignore
	}
}

响应

@ResponseBody

使用注解@ResponseBody将会直接产生响应体,不会再涉及前端视图,@ResponseBody产生的响应体可以是JSON、XML、HTML或字符串等格式数据,且会受到StringHttpMessageConverter所影响。

ModelAndView

ModelAndView是Spring MVC中用于桥接视图与控制器的类,该类可以将数据对象与模板引擎进行绑定,而ModelAndView的默认模板引擎为JSP,因此可以通过EL表达式进行数据的输出。

示例:

    @GetMapping("/printUser")
    public ModelAndView printUser(User user) {
    	// 创建ModelAndView对象,并利用构造方法绑定视图
        ModelAndView modelAndView = new ModelAndView("/success.jsp");

		// 向对象中添加数据
        modelAndView.addObject("user", user);
        return modelAndView;
    }

使用ModelAndView时要注意一下几个问题:

  1. 使用addObject()方法时,数据默认是放在当前请求中的
  2. 默认情况下,ModelAndView是使用请求转发至页面的
  3. 如果需要使用重定向到指定页面,则需要在绑定地址时添加redirect:前缀,例如:new ModelAndView("redirect:/success.jsp")

String+ModelMap

与ModelAndView用法相类似的还有一种String+ModelMap的用法,其本质上就是将MedolAndView的指定跳转页面和绑定数据分开实现,示例:

    @GetMapping("/printUser")
    public String printUser(User user, ModelMap modelMap) {
        String view = "/success.jsp";

        modelMap.addAttribute("user", user);

        return view;
    }

接收时间类型参数

前端请求都是以字符串传递,通过Spring MVC进行数据类型转化,对于时间类型的参数则需要使用注解@DateTimeFormat(pattern = "yyyy-MM-dd")通知Spring MVC进行数据类型转换,无论是使用方法参数或者Java Bean都可以使用注解进行转化。

除了使用注解还可以使用自定义转换器:

package com.springmvc.converter;

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

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MyDateConverter implements Converter<String, Date> {
    public Date convert(String s) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date d = sdf.parse(s);
            return d;
        } catch (ParseException e) {
            return null;
        }
    }
}

实现自定义转换器需要继承Spring MVC的Converter接口,实现convert()方法,在此方法中可以实现时间格式的转换,并返回时间类型。创建好自定义转换器后,还需在配置文件中添加对应的实例,Spring MVC才能在需要的时候自动对时间格式进行转化。

	<mvc:annotation-driven conversion-service="conversionService">
	
    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.springmvc.converter.MyDateConverter"/>
            </set>
        </property>
    </bean>

中文乱码问题解决

解决Get请求中的乱码问题

修改Tomcat的servlet.xml文件,在Connector标签中添加URIEncoding=utf-8即可解决Get请求中的乱码。

解决Post请求中的乱码问题

在Servlet中解决乱码问题时通过构建过滤器在请求过程中拦截请求并对其进行编码转换,而Spring MVC中封装好了一个过滤器可以直接在web.xml中直接添加过滤器,例如:

    <filter>
        <filter-name>characterFilter</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>characterFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

解决响应中的乱码问题

    <!--启用Spring MVC的注解开发模式-->
    <mvc:annotation-driven conversion-service="conversionService">
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/html;charset=utf-8</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

Spring MVC中也封装好了HTTP文本消息的转换器,只需要在mvc中实例化对应的类就可以解决响应中的乱码问题。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值