SpringMVC框架技术总结
Posted 生命是有光的
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC框架技术总结相关的知识,希望对你有一定的参考价值。
✍目录总览
1. Spring与Web环境集成🔥
1.1、ApplicationContext应用上下文获取方式
应用上下文对象是通过new ClasspathXmlApplicationContext(spring配置文件)
方式获取的,但是每次从容器中获得Bean时都要编写new ClasspathXmlApplicationContext(spring配置文件)
,这样的弊端是配置文件加载多次,应用上下文对象创建多次。
ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = app.getBean(UserService.class);
userService.save();
在Web项目中,可以使用ServletContextListener监听Web应用的启动,我们可以在Web应用启动时,就加载Spring的配置文件,创建应用上下文对象ApplicationContext,在将其存储到最大的域servletContext域中,这样就可以在任意位置从域中获得应用上下文ApplicationContext对象了。
1.2、Spring提供获取应用上下文的工具🔥
上面的分析不用手动实现,Spring提供了一个监听器ContextLoaderListener就是对上述功能的封装,该监听器内部加载Spring配置文件,创建应用上下文对象,并存储到ServletContext域中,提供了一个客户端工具WebApplicationContextUtils供使用者获得应用上下文对象。
所以我们需要做的只有两件事:
①在web.xml中配置ContextLoaderListener监听器(导入spring-web坐标)
②使用WebApplicationContextUtils获得应用上下文对象ApplicationContext
1.3、导入Spring集成web的坐标🔥
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
1.4、配置ContextLoaderListener监听器🔥
<!--全局参数-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!--Spring的监听器-->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
1.5、通过工具获得应用上下文对象🔥
ApplicationContext applicationContext =
WebApplicationContextUtils.getWebApplicationContext(servletContext);
Object obj = applicationContext.getBean("id");
知识要点
Spring集成web环境步骤
①配置ContextLoaderListener监听器
②使用WebApplicationContextUtils获得应用上下文
2. SpringMVC的简介
2.1、SpringMVC概述
SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,属于SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 中。
SpringMVC 已经成为目前最主流的MVC框架之一,并且随着Spring3.0 的发布,全面超越 Struts2,成为最优秀的 MVC 框架。它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口。同时它还支持 RESTful 编程风格的请求。
2.2、SpringMVC快速入门
需求:客户端发起请求,服务器端接收请求,执行逻辑并进行视图跳转。
开发步骤
①导入SpringMVC相关坐标
②配置SpringMVC核心控制器DispathcerServlet
③创建Controller类和视图页面
④使用注解配置Controller类中业务方法的映射地址
⑤配置SpringMVC核心文件 spring-mvc.xml
⑥客户端发起请求测试
代码实现
①导入Spring和SpringMVC的坐标、导入Servlet和Jsp的坐标
<!--Spring坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!--SpringMVC坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!--Springweb坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!--Servlet坐标-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<!--Jsp坐标-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
</dependency>
②在web.xml配置SpringMVC的核心控制器
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--
为DispatcherServlet提供初始化参数的
设置springmvc配置文件的路径
name是固定的,必须是contextConfigLocation
value指的是SpringMVC配置文件的位置
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!--
指定项目启动就初始化DispatcherServlet
-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<!--
/ 表示当前servlet映射除jsp之外的所有请求(包含静态资源)
*.do 表示.do结尾的请求路径才能被SpringMVC处理(老项目会出现)
/* 表示当前servlet映射所有请求(包含静态资源,jsp),不应该使用其配置DispatcherServlet
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
③创建Controller和业务方法
public class UserController {
public String save(){
System.out.println("Controller save running..");
return "/success.jsp";
}
}
③创建视图页面success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>success</h1>
</body>
</html>
④配置注解
@Controller
public class UserController {
@RequestMapping("/quick")//指定请求路径是/quick的才能被该方法处理
public String save(){
System.out.println("Controller save running..");
return "/success.jsp";//跳转到success.jsp
}
}
⑤创建spring-mvc.xml
<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
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--Controller的组件扫描-->
<context:component-scan base-package="com.itheima.controller"/>
</beans>
⑥访问测试地址
http://localhost:8080/quick
2.3、web.xml配置详解🔥
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--
为DispatcherServlet提供初始化参数的
设置springmvc配置文件的路径
name是固定的,必须是contextConfigLocation
value指的是SpringMVC配置文件的位置
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!--
指定项目启动就初始化DispatcherServlet
-->
<load-on-startup>1</load-on-startup>
</servlet>
- SpringMVC的核心控制器 DispatcherServlet,官方自己写的Servlet
<init-param>
标签是为 DispatcherServlet 提供初始化参数- name属性是固定的,必须是
contextConfigLocation
- value属性指的是 SpringMVC 配置文件的位置
- name属性是固定的,必须是
<load-on-startup>
标签标记容器是否应该在web应用程序启动的时候就加载这个 servlet(实例化并调用其init()
方法)- 它的值必须是一个整数,表示 servlet 被加载的先后顺序
- 如果值为正整数或者0时,表示容器在应用启动时就加载并初始化这个 servlet ,值越小,servlet 的优先级越高,就越先被加载。
- 如果该元素的值为负数或者没有设置,则容器会当 servlet 被请求时再加载。
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<!--
/ 表示当前servlet映射除jsp之外的所有请求(包含静态资源)
*.do 表示.do结尾的请求路径才能被SpringMVC处理(老项目会出现)
/* 表示当前servlet映射所有请求(包含静态资源,jsp),不应该使用其配置DispatcherServlet
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
- 我们在 tomcat 中 web.xml 文件可以发现如下代码
<!-- The mapping for the default servlet -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- The mappings for the JSP servlet -->
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
- 我们的 DispatcherServlet url-pattern 配置为 / ,相当于覆盖掉默认的 DefaultServlet
- 此时如果请求路径为
/hello.html
,则会走我们的 DispatcherServlet ,会匹配是否有此路径的方法,根据图示,此时有对应此路径的方法。 - 但是如果请求路径为
/hello1.html
,匹配发现没有此路径的方法,那么会显示404找不到网页
解决方案:
- 在resources目录下创建mvc的配置文件spring-mvc.xml
<!--
SpringMVC只扫描controller包即可
-->
<context:component-scan base-package="com.sangeng.controller"/>
<!-- 解决静态资源访问问题,如果不加mvc:annotation-driven会导致无法访问handler-->
<mvc:default-servlet-handler/>
<!--解决响应乱码-->
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="utf-8"/>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
此时请求路径/hello1.html
会交给 Defalut-servlet-handler 来处理,此时就会找对应的静态资源响应请求
3、页面跳转🔥
在SpringMVC中我们可以非常轻松的实现页面跳转,只需要把方法的返回值写成要跳转页面的路径即可。
例如:
@Controller
public class PageJumpController {
@RequestMapping("/testJump")
public String testJump(){
return "/success.jsp";
}
}
- 默认的跳转其实是转发的方式跳转的。
- 我们也可以选择加上标识,在要跳转的路径前加上
forward:
这样SpringMVC也会帮我们进行请求转发。
@Controller
public class PageJumpController {
@RequestMapping("/testJump")
public String testJump(){
return "forward:/success.jsp";
}
}
- 如果想实现重定向跳转则可以在跳转路径前加上
redirect:
进行标识。 - 这样SpringMVC就会帮我们进行重定向跳转。
@Controller
public class PageJumpController {
@RequestMapping("/testJump")
public String testJump(){
return "redirect:/success.jsp";
}
}
4、SpringMVC流程分析
- 服务器启动
- 加载web.xml中DispatcherServlet
- 读取spring-mvc.xml中的配置,加载所有com.itheima包中所有标记为bean的类
- 读取bean中方法上方标注@RequestMapping的内容
- 处理请求
- DispatcherServlet配置拦截所有请求 /
- 使用请求路径与所有加载的@RequestMapping的内容进行比对
- 执行对应的方法
- 根据方法的返回值在webapp目录中查找对应的页面并展示
5、 SpringMVC的组件解析🔥
5.1、SpringMVC组件解析🔥
- 前端控制器:DispatcherServlet
用户请求到达前端控制器,它就相当于 MVC 模式中的 C,DispatcherServlet 是整个流程控制的中心,由
它调用其它组件处理用户的请求,DispatcherServlet 的存在降低了组件之间的耦合性。
- 处理器映射器:HandlerMapping
HandlerMapping 负责根据用户请求找到 Handler 即处理器,SpringMVC 提供了不同的映射器实现不同的
映射方式,例如:配置文件方式,实现接口方式,注解方式等。
- 处理器适配器:HandlerAdapter
通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理
器进行执行。
- 处理器:Handler
它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet 把用户请求转发到 Handler。由
Handler 对具体的用户请求进行处理。
- 视图解析器:View Resolver
View Resolver 负责将处理结果生成 View 视图,View Resolver 首先根据逻辑视图名解析成物理视图名,即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。
- 视图:View
视图,最终产出结果, 常用视图如jsp、 html
6、SpringMVC注解解析🔥
6.1、@RequestMapping🔥
设置请求映射规则@RequestMapping
作用:用于建立请求 URL 和处理请求方法之间的对应关系,我们可以用其来设定所能匹配请求的要求。只有符合了设置的要求,请求才能被加了该注解的方法或类处理。
6.1.1、指定请求路径🔥
path或者value属性都可以用来指定请求路径,都是用于指定请求的URL。
位置:@RequestMapping
注解可以加到方法上或者是类上
-
类上,请求URL 的第一级访问目录。此处不写的话,就相当于应用的根目录
-
方法上,请求 URL 的第二级访问目录,与类上的使用@ReqquestMapping标注的一级目录一起组成访问虚拟路径
@Controller
public class UserController {
@RequestMapping(value="/quick")
public String save(){
System.out.println("Controller save running..");
return "/success.jsp";
}
}
此时注解在方法上,则请求地址为:http://localhost:8080/quick
@Controller
@RequestMapping(value="/user")
public class UserController {
@RequestMapping(value="/quick")
public String save(){
System.out.println("Controller save running..");
return "/success.jsp";
}
}
此时注解在方法和类上都有,则请求地址为:http://localhost:8080/user/quick
6.1.2、指定请求方式🔥
- method 属性可以用来指定可处理的请求方式。
@Controller
@RequestMapping(value="/user")
public class UserController {
@RequestMapping(value="/quick",method = RequestMethod.POST)
public String save(){
System.out.println("Controller save running..");
return "/success.jsp";
}
}
注意:我们可以也可以运用如下注解来进行替换
-
@PostMapping 等价于 @RequestMapping(method = RequestMethod.POST)
-
@GetMapping 等价于 @RequestMapping(method = RequestMethod.GET)
-
@PutMapping 等价于 @RequestMapping(method = RequestMethod.PUT)
-
@DeleteMapping 等价于 @RequestMapping(method = RequestMethod.DELETE)
例如:
上面的需求我们可以使用下面的写法实现
@Controller
@RequestMapping("/user")
public class UserController {
@PostMapping(value="/quick")
public String save(){
System.out.println("Controller save running..");
return "/success.jsp";
}
}
6.1.3、指定请求参数🔥
我们可以使用params
属性来对请求参数进行一些限制。可以要求必须具有某些参数,或者是某些参数必须是某个值,或者是某些参数必须不是某个值。
例如:
-
params = {"username"}
,表示请求参数必须有username -
params = {"moeny!100"}
,表示请求参数中money不能是100
需求:我们期望让请求的资源路径为**/user/quick的GET请求,并且请求参数中具有username参数**的请求能够被testParams方法处理。则可以写如下代码
@Controller
@RequestMapping(value="/user")
public class UserController {
@RequestMapping(value="/quick",method = RequestMethod.GET,params={"username"})
public String save(){
System.out.println("Controller save running..");
return "/success.jsp";
}
}
这样我们访问的请求路径为:http://localhost:8080/user/quick?username=xxx
如果是要求不能有username这个参数可以把改成如下形式
@Controller
@RequestMapping(value="/user")
public class UserController {
@RequestMapping(value="/quick",method = RequestMethod.GET,params={"!username"})
public String save(){
System.out.println("Controller save running..");
return "/success.jsp";
}
}
如果要求有username这参数,并且这参数值必须是某个值可以改成如下形式
@Controller
@RequestMapping(value="/user")
public class UserController {
@RequestMapping(value="/quick",method = RequestMethod.GET,params={"username=xxx"})
public String save(){
System.out.println("Controller save running..");
return "/success.jsp";
}
}
如果要求有username这参数,并且这参数值必须不是某个值可以改成如下形式
@Controller
@RequestMapping(value="/user")
public class UserController {
@RequestMapping(value="/quick",method = RequestMethod.GET,params={"username!=xxx"})
public String save(){
System.out.println("Controller save running..");
return "/success.jsp";
}
}
6.1.4、指定请求头🔥
我们可以使用headers属性来对请求头进行一些限制。
例如:
我们期望让请求的资源路径为 /test/testHeaders 的GET 请求,并且请求头中具有deviceType的请求能够被testHeaders方法处理。则可以写如下代码
@Controller
@RequestMapping("/test")
public class TestController {
@RequestMapping(value = "/testHeaders",method = RequestMethod.GET,headers = "deviceType")
public String testHeaders(){
System.out.println("testHeaders处理了请求");
return "/success.jsp"以上是关于SpringMVC框架技术总结的主要内容,如果未能解决你的问题,请参考以下文章
Spring+SpringMVC+MyBatis+Maven框架整合