文章目录
- SpringMVC实现原理
- SpringMVC环境搭建
- 引入Maven依赖
- 配置web.xml
- 配置applicationContext.xml
- 注解
- URL映射
- 请求
- 无注解形式
- 参数绑定
- 路径参数
- 请求体
- 响应
- @ResponseBody
- ModelAndView
- String+ModelMap
- 接收时间类型参数
- 中文乱码问题解决
- 解决Get请求中的乱码问题
- 解决Post请求中的乱码问题
- 解决响应中的乱码问题
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依赖
1
2
3
4
5
6
7
8<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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24<?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约束。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22<?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会根据请求的参数名称,自动去寻找实体类中名称相同的属性进行赋值并自动封装为实体类并传入控制器的方法中。
若实体类中还包含另外的实体类,在前端请求时需要注意该参数的写法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15<!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>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17// 实体类 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 | 参数名称 |
value | name属性的别名 |
required | 是否为必传参数,为布尔类型,当为true时若前端不传入该参数会报错 |
defualtValue | 参数默认值 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14@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 | 参数名称 |
value | name属性的别名 |
required | 是否为必传参数,为布尔类型,当为true时若前端不传入该参数会报错 |
1
2
3
4
5
6
7
8@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
读取请求中的请求体,将其自动封装进映射方法的参数中
1
2
3
4
5
6
7
8@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表达式进行数据的输出。
示例:
1
2
3
4
5
6
7
8
9
10@GetMapping("/printUser") public ModelAndView printUser(User user) { // 创建ModelAndView对象,并利用构造方法绑定视图 ModelAndView modelAndView = new ModelAndView("/success.jsp"); // 向对象中添加数据 modelAndView.addObject("user", user); return modelAndView; }
使用ModelAndView时要注意一下几个问题:
- 使用
addObject()
方法时,数据默认是放在当前请求中的 - 默认情况下,ModelAndView是使用请求转发至页面的
- 如果需要使用重定向到指定页面,则需要在绑定地址时添加
redirect:
前缀,例如:new ModelAndView("redirect:/success.jsp")
String+ModelMap
与ModelAndView用法相类似的还有一种String+ModelMap的用法,其本质上就是将MedolAndView的指定跳转页面和绑定数据分开实现,示例:
1
2
3
4
5
6
7
8
9@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都可以使用注解进行转化。
除了使用注解还可以使用自定义转换器:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20package 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才能在需要的时候自动对时间格式进行转化。
1
2
3
4
5
6
7
8
9
10<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中直接添加过滤器,例如:
1
2
3
4
5
6
7
8
9
10
11
12
13<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>
解决响应中的乱码问题
1
2
3
4
5
6
7
8
9
10
11
12
13<!--启用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
中实例化对应的类就可以解决响应中的乱码问题。
最后
以上就是香蕉香水最近收集整理的关于【Spring】SpringMVC请求参数接收与响应数据返回SpringMVC实现原理SpringMVC环境搭建注解接收时间类型参数中文乱码问题解决的全部内容,更多相关【Spring】SpringMVC请求参数接收与响应数据返回SpringMVC实现原理SpringMVC环境搭建注解接收时间类型参数中文乱码问题解决内容请搜索靠谱客的其他文章。
发表评论 取消回复