文章目录

  • 1.介绍
  • 1.1 官网查看
  • 1.2 大概运行流程
  • 2.接收请求处理
  • 2.1 RequestMapping(主要用于URL映射、校验等处理)
  • 2.1.1 请求映射以及校验
  • 2.1.2 Ant风格
  • 2.1.3 PathVariable
  • 2.1.3 REST风格
  • 2.2 请求参数处理
  • 2.2.1 RequestParam
  • 2.2.2 RequestHeader
  • 2.2.3 CookieValue
  • 2.2.4 POJO方式传递给方法入参
  • 2.2.5 Servlet 原生 API 获取形参
  • 2.2.6
  • 2.2.7
  • 2.3 输出模型数据
  • 2.3,1 ModelAndView
  • 2.3.2 入参为Map
  • 2.3.3 SessionAttributes
  • 2.3.4 ModelAttribute
  • 2.4 Json接收与返回
  • 3.注意
  • 3.1 springmvc默认加载配置文件路径
  • 3.2 No mapping found for HTTP request with URI
  • 3.3 default-servlet-handler
  • 3.4 EL表达式不执行
  • 3.5 IDEA springmvc debug日志不显示


1.介绍

1.1 官网查看

官网4.3.24文档

springmvc接收map的坑 springmvc接收请求_spring


SNAPSHOT:快照版,可以稳定使用,且仍在继续改进版本

R,RELEASE:正式版,等价于GA

GA:(Ggeneral Availability):发行稳定版,官方推荐使用此版本。

版本说明参考

环境搭建:SpringMVC环境简单搭建

1.2 大概运行流程

springmvc接收map的坑 springmvc接收请求_MVC_02

springmvc接收map的坑 springmvc接收请求_springmvc接收map的坑_03

2.接收请求处理

2.1 RequestMapping(主要用于URL映射、校验等处理)

@RequestMapping 是 Spring Web 应用程序中最常被用到的注解之一。这个注解会将 HTTP 请求映射到 MVC 和 REST 控制器的处理方法上。
Spring MVC 使用 @RequestMapping 注解为控制器指定可以处理哪些 URL 请求 • 在控制器的类定义及方法定义处都可标注
@RequestMapping
类定义处:提供初步的请求映射信息。相对于 WEB 应用的根目录 – 方法处:提供进一步的细分映射信息。相对于类定义处的 URL。若
类定义处未标注 @RequestMapping,则方法处标记的 URL 相对于WEB 应用的根目录
• DispatcherServlet 截获请求后,就通过控制器上@RequestMapping 提供的映射信息确定请求所对应的处理方法。

2.1.1 请求映射以及校验

一个请求的内容如下:

springmvc接收map的坑 springmvc接收请求_MVC_04


springmvc接收map的坑 springmvc接收请求_spring_05


params和header仅供了解,知道这两个参数加上后,访问后台,就更加需要符合这两个里面的条件,才能访问指定的方法

springmvc接收map的坑 springmvc接收请求_springmvc_06


springmvc接收map的坑 springmvc接收请求_spring_07


springmvc接收map的坑 springmvc接收请求_spring_08

@RequestMapping(value = "/index", method = RequestMethod.GET,params = {"pid=1","pname"},headers = {"Accept-Language=zh-CN,zh;q=0.9"})
    public String index() {
        logger.info("RequestMapping start");
        return "index";
    }

URL:IP+PORT+项目名+类名注解+方法名注解 即如果有类名+方法名映射,那么类名就相当于web项目名下的根目录,如果没有类名,则方法名就相当于根目录

2.1.2 Ant风格

说白了,就是url支持通配符过滤而已,就是只要满足这个通配符的要求,所有请求都会进入到此方法中,这个也了解

springmvc接收map的坑 springmvc接收请求_spring_09


springmvc接收map的坑 springmvc接收请求_MVC_10


springmvc接收map的坑 springmvc接收请求_springmvc接收map的坑_11

2.1.3 PathVariable

主要作用就是后台参数绑定Url里的占位符,由于有这种功能,后续为REST风格提供了基础

springmvc接收map的坑 springmvc接收请求_springmvc接收map的坑_12


springmvc接收map的坑 springmvc接收请求_springmvc_13

2.1.3 REST风格

springmvc接收map的坑 springmvc接收请求_springmvc_14


springmvc接收map的坑 springmvc接收请求_springmvc接收map的坑_15


springmvc接收map的坑 springmvc接收请求_springmvc接收map的坑_16


springmvc接收map的坑 springmvc接收请求_spring_17


springmvc接收map的坑 springmvc接收请求_springmvc_18

2.2 请求参数处理

Spring MVC 通过分析处理方法的签名,将 HTTP 请求信息绑定到处理方法的相应形参中 对方法及方法入参标注相应的注解(@PathVariable、@RequestParam、@RequestHeader等)、SpringMVC 框架会将 HTTP 请求的信息绑定到相应的方法入参中,并根据方法的返回值类型做出相应的后续处理。

2.2.1 RequestParam

在处理方法入参处使用 @RequestParam 可以把请求参数传递给请求方法

– value:参数名

– required:是否必须。默认为 true, 表示请求参数中必须包含对应的参数,若不存在,将抛出异常

springmvc接收map的坑 springmvc接收请求_MVC_19

2.2.2 RequestHeader

请求头包含了若干个属性,服务器可据此获知客户端的信息,通过 @RequestHeader 即可将请求头中的属性值绑定到处理方法的入参中

用的比较少

springmvc接收map的坑 springmvc接收请求_MVC_20

2.2.3 CookieValue

@CookieValue 可让处理方法入参绑定某个 Cookie 值 就是把cook值放到一个参数里,这个也了解

springmvc接收map的坑 springmvc接收请求_MVC_21


springmvc接收map的坑 springmvc接收请求_spring_22

2.2.4 POJO方式传递给方法入参

Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配,自动为该对象填充属性值。支持级联属性。

springmvc接收map的坑 springmvc接收请求_springmvc_23


springmvc接收map的坑 springmvc接收请求_处理方法_24


springmvc接收map的坑 springmvc接收请求_spring_25


springmvc接收map的坑 springmvc接收请求_处理方法_26

2.2.5 Servlet 原生 API 获取形参

MVC 的 Handler 方法可以接受哪些 ServletAPI 类型的参数:
• HttpServletRequest
• HttpServletResponse
• HttpSession
• java.security.Principal
• Locale
• InputStream
• OutputStream
• Reader
• Writer

springmvc接收map的坑 springmvc接收请求_springmvc_27


springmvc接收map的坑 springmvc接收请求_spring_28

2.2.6
2.2.7

2.3 输出模型数据

Spring MVC 提供了以下几种途径输出模型数据:
ModelAndView: 处理方法返回值类型为 ModelAndView时, 方法体即可通过该对象添加模型数据
Map 及 Model: 入参为
org.springframework.ui.Model、org.springframework.ui.ModelMap 或 java.uti.Map 时,处理方法返回时,Map中的数据会自动添加到模型中。
@SessionAttributes: 将模型中的某个属性暂存到HttpSession 中,以便多个请求之间可以共享这个属性
@ModelAttribute: 方法入参标注该注解后, 入参的对象就会放到数据模型中

2.3,1 ModelAndView

控制器处理方法的返回值如果为 ModelAndView, 则其既包含视图信息,也包含模型数据信息。
• 添加模型数据:
– MoelAndView addObject(String attributeName, ObjectattributeValue)
– ModelAndView addAllObject(Map<String, ?> modelMap)
• 设置视图:
– void setView(View view)
– void setViewName(String viewName)
pom

<dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.0.1</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.2</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp.jstl</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>

suc.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h3>Now : ${requestScope.nowTime}</h3>
</body>
</html>
@RequestMapping(value = "/index")
    public ModelAndView index() {
        String view = "suc";
        ModelAndView mv = new ModelAndView(view);
        mv.addObject("nowTime",new Date());
        return mv;
    }

springmvc接收map的坑 springmvc接收请求_spring_29

2.3.2 入参为Map

springmvc接收map的坑 springmvc接收请求_处理方法_30


springmvc接收map的坑 springmvc接收请求_springmvc_31


springmvc接收map的坑 springmvc接收请求_springmvc接收map的坑_32


springmvc接收map的坑 springmvc接收请求_springmvc接收map的坑_33

2.3.3 SessionAttributes

• 若希望在多个请求之间共用某个模型属性数据,则可以在控制器类上标注一个 @SessionAttributes, Spring MVC将在模型中对应的属性暂存到 HttpSession 中
• @SessionAttributes 除了可以通过属性名指定需要放到会话中的属性外,还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中
– @SessionAttributes(types=User.class) 会将隐含模型中所有类型为 User.class 的属性添加到会话中。
– @SessionAttributes(value={“user1”, “user2”})
– @SessionAttributes(types={User.class, Dept.class})
– @SessionAttributes(value={“user1”, “user2”},
types={Dept.class})

springmvc接收map的坑 springmvc接收请求_spring_34


springmvc接收map的坑 springmvc接收请求_springmvc_35


springmvc接收map的坑 springmvc接收请求_springmvc接收map的坑_36

2.3.4 ModelAttribute

在方法定义上使用 @ModelAttribute 注解

Spring MVC在调用目标处理方法前,会先逐个调用在方法级上标注了@ModelAttribute 的方法。

在方法的入参前使用 @ModelAttribute 注解

– 可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数绑定到对象中,再传入入参

– 将方法入参对象添加到模型中

springmvc接收map的坑 springmvc接收请求_spring_37

springmvc接收map的坑 springmvc接收请求_springmvc_38


springmvc接收map的坑 springmvc接收请求_处理方法_39

2.4 Json接收与返回

springmvc接收json数据的4种方式SpringMVC中controller接收Json数据SpringMVC接收和响应json数据

• ConversionService 是 Spring 类型转换体系的核心接口。
• 可以利用 ConversionServiceFactoryBean 在 Spring 的 IOC容器中定义一个 ConversionService. Spring 将自动识别出IOC 容器中的 ConversionService,并在 Bean 属性配置及Spring MVC 处理方法入参绑定等场合使用它进行数据的转换
• 可通过 ConversionServiceFactoryBean 的 converters 属性注册自定义的类型转换器

springmvc接收map的坑 springmvc接收请求_处理方法_40


springmvc接收map的坑 springmvc接收请求_springmvc_41


springmvc接收map的坑 springmvc接收请求_处理方法_42


springmvc接收map的坑 springmvc接收请求_MVC_43


springmvc接收map的坑 springmvc接收请求_MVC_44

所以,当我们需要支持json字符串转对象,对象转json字符串的时候,是需要引入相关json包的
pom.xml

<dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.7.0</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.7.0</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.7.0</version>
    </dependency>

springmvc接收map的坑 springmvc接收请求_springmvc_45


springmvc接收map的坑 springmvc接收请求_springmvc_46

3.注意

3.1 springmvc默认加载配置文件路径

DispatcherServlet 默认加载 /WEBINF/.xml 的 Spring 配置文件, 启动 WEB 层的 Spring 容器。可以通过 contextConfigLocation 初始化参数自定义配置文件的位置和名称

<!-- 配置 DispatcherServlet -->
	<servlet>
		<servlet-name>dispatcherServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!-- 配置 DispatcherServlet 的一个初始化参数: 配置 SpringMVC 配置文件的位置和名称 -->
		<!-- 
			实际上也可以不通过 contextConfigLocation 来配置 SpringMVC 的配置文件, 而使用默认的.
			默认的配置文件为: /WEB-INF/<servlet-name>-servlet.xml
		-->
		<!--  
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:springmvc.xml</param-value>
		</init-param>
		-->
		<load-on-startup>1</load-on-startup>
	</servlet>

springmvc接收map的坑 springmvc接收请求_处理方法_47

3.2 No mapping found for HTTP request with URI

若写成/*就会报这个错误

springmvc接收map的坑 springmvc接收请求_MVC_48

3.3 default-servlet-handler

慎用这个,mvc:default-servlet-handler/,不然添加了后,前端页面返回给浏览器,浏览器只会显示整个代码出来

3.4 EL表达式不执行

jsp里一定要写 isELIgnored=“false”,不然EL表达式不会执行

3.5 IDEA springmvc debug日志不显示

参考