Spring-MVC

1.SpringMVC快速入门

采用MVC三层架构创建spring,因为web包下的servlet大都具有共有行为,即:接收数据,调用service对象,因此可以将共有行为提取出来,交由spring组件帮忙创建(前端控制器),而开发者只需要编写相关controller来实现一些特有行为。

7w62p8.png

执行流程

7w6W6g.png

需求:客户端发起请求,服务器接收请求,执行逻辑并进行视图跳转。

开发步骤:

  • 导入SpringMVC相关坐标

  • 配置SpringMVC核心控制器DispatherServlet

  • 创建Controller类和视图页面

  • 创建注解配置Controller类中业务方法的映射地址

  • 配置SpringMVC核心文件spirng-mvc.xml

  • 客户端发起请求测试

导入坐标:

1
2
3
4
5
6
首先,导入SpringMVC坐标:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.5</version>
</dependency>

配置SpringMVC的前端控制器:

1
2
3
4
5
6
7
8
9
10
11
12
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value> //用spring-mvc.xml配置 controller
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name> //配置servlet
<url-pattern>/</url-pattern> //用/表示所有路径
</servlet-mapping>

在Spring MVC 中使用 @RequestMapping 来映射请求,也就是通过它来指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置

因此,我们使用注解@RequestMapping来映射,

7w6cff.png

注意

@RequestMapping可放在方法上,也可放在类上方,如果同时存在,表示拼接的路径,即:上方路径/下方路径。

7wg2LQ.png

2.Spring组件解析:

7w6R1S.png

在此过程中,其实是有多个spring容器内部的组件分工完成的。

如下:

7w6fXQ.png

过程描述

1.DispatcherServlet为前端控制器,接收客户端的请求后调用处理器映射器HandlerMapping来获取访问页面的地址(为一个路径链,可能包含过滤器到servlet的一连串路径)。

2.前端控制器接收执行链后,调用处理器适配器HandlerAdaptor去调用资源,执行该路径对应的处理器(Controller),然后返回一个视图对象。

3.前端接收器接视图对象后调用视图解析器ViewResolver,去解析view对象,返回视图页面。

在这其中,spring已经实现了各组件的方法,我们接下来对ViewResolver进行增强。

首先回到上文,我们在controller中使用

1
return"success.jsp"

直接返回了一个视图对象,但其实他的默认值为

1
return"forword:success.jsp"

也就是转发,这种情况下访问路径是不变的,如果更改为

1
return"redirect:success.jsp"

表示重定向,会改变访问路径。

其次,我们也可以更改路径名称,可以更改默认的前缀和后缀,如下:

7w64mj.png

7w6I7n.png

小结:

7w6Tkq.png

4.SpringMVC的请求

1.接收请求数据:

  • 基本类型参数
  • POJO类型参数
  • 数组类型参数
  • 集合类型参数

1.基本数据类型:Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配

2.POJO类型参数:Controller中的业务方法的POJO参数的属性名(成员变量)与请求参数的name一致,业务方法参数是POJO类型,参数会自动映射匹配

3.数组类型参数:业务方法是数组,数组名与请求参数一致,可以结合ajax实现

4.集合类型参数:当使用ajax提交时,可以指定contentType为json形式,那么在方法参数位置使用@RequestBody可以直接接收集合数据。

1
2
//增加驱动,表示spring找不到servlet的时候交由tomcat完成。
<mvc:default-servlet-handler/>

请求乱码问题

当post请求时,数据会出现乱码,可以设置一个过滤器来解决乱码。

7hS9f0.png

参数绑定注解@Request:

7hSSkn.png

获得Restful风格的参数:

7hSPpV.md.png](https://imgtu.com/i/7hSpYq)

2.获得请求头:

1.@RequestHeader

使用@RequestHeader可以获得请求头信息,相当于web阶段学习的request.getHeader(name)

属性:

  • value:请求头名称:与浏览器的请求头名称一致
  • required:是否必须携带请求头,若设为true,则不带请求头时会报错
1
2
3
4
5
用法:
@RequestHeader(value = "User-Agent",required = false) String headValue()
{

}

2.CookieValue

同上,用来专门获取cookie的请求值。

3.文件上传

1.文件上传三要素

  • 表单项type = “file”
  • 表单的提交方式为post
  • 表单的enctype属性时多部份表单形式,即enctyoe = “multipart/form-data”

配置xml:

1
commons-io 和commons-fileupload

2.文件上传原理

7hSpYq.png

3、单文件上传实现:

7hSilT.png

使用uploadFile.transferTo将文件转移到服务器某处,或磁盘上。