我是靠谱客的博主 香蕉香水,这篇文章主要介绍【Spring】SpringMVC请求参数接收与响应数据返回SpringMVC实现原理SpringMVC环境搭建注解接收时间类型参数中文乱码问题解决,现在分享给大家,希望可以做个参考。

文章目录

  • 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参数名称
valuename属性的别名
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参数名称
valuename属性的别名
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时要注意一下几个问题:

  1. 使用addObject()方法时,数据默认是放在当前请求中的
  2. 默认情况下,ModelAndView是使用请求转发至页面的
  3. 如果需要使用重定向到指定页面,则需要在绑定地址时添加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
20
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才能在需要的时候自动对时间格式进行转化。

复制代码
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环境搭建注解接收时间类型参数中文乱码问题解决内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部