一、Spring与Web环境集成
-
ApplicationContext应用上下文获取方式
应用上下文对象是通过new ClasspathXmlApplication(Spring配置文件)方式获取的,但每次从容器中获取Bean都要编写配置文件,这样的弊端是配置文件加载很多次,应用上下文创建很多次,浪费很多资源。
在Web项目中,可以使用ServletContextListener监听Web应用的启动,我们可以在Web应用启动的时候,就加载Spring的配置文件,创建上下文对象ApplicationContext,再将其存入最大的域servletContext域中这样就可以在任意位置获得应用上下文ApplicationContext对象了。 -
在Spring中,对上述功通过监听器ContextLoaderListener进行了封装,该监听器内部加载Spring配置文件,创建应用上下文对象,并存储到ServletContext域中,提供了一个客户端工具WebApplicationContextUtils供使用者获得应用上下文对象
所以只需要做两个操作:
-
在web.xml中配置ContextLoaderListener监听器(导入Spring-web坐标)
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
-
使用WebApplicationContextUtils获得应用上下文对象ApplicationContext
ApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext()); UserDaoImpl userDao = (UserDaoImpl) applicationContext.getBean("userDao"); userDao.save(); UserServiceImpl userService = (UserServiceImpl) applicationContext.getBean("userService"); userService.save();
-
二、SpringMVC简介
-
SpringMVC快速入门
需求:客户端发起请求,服务端接收请求,执行逻辑并进行视图跳转
开发步骤:
- 导入SpringMVC相关坐标
- 配置SpringMVC核心控制器DispathcerServlet
- 创建Controller类和视图页面
- 使用注解配置Controller类中业务方法的映射地址
- 配置SpringMVC核心文件spring-mvc.xml
- 客户端发起请求测试
-
实现过程
- 导入SpringMVC相关坐标
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.9</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.3</version> <scope>provided</scope> </dependency>
这里的scope不能省略,防止和tomcat中的servlet冲突
- 配置SpringMVC核心控制器DispatherServlet
<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> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>DispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
- 创建Control层和视图界面
public class QuickController { public String quickMethod() { System.out.println("quickMethod running....."); return "index.jsp"; } }
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>null</title> </head> <body> <h1>hello</h1> </body> </html>
- 使用注解配置Controller类中业务方法的映射地址
package xyz.nchu200462.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class QuickController { @RequestMapping("/quick") public String quickMethod() { System.out.println("quickMethod running....."); return "index.jsp"; } }
-
配置SpringMVC核心文件spring-mvc.xml
由于CSDN发文会检测链接,而spring-mvc配置文件中有很多链接,导致无法发出,若需要查看,请点下面的链接下载查看。
链接:https://pan.baidu.com/s/1Jdikq1DwBSQr-ONWG7ggPQ
提取码:will -
客户端发起请求测试
-
执行分析
-
代码逻辑
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c8PPKjYL-1647767770098)(../../_resources/ca2763f29d8d1b9ff45415172392ce6f.png)]
- 视图逻辑
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jg4jxIan-1647767770099)(../../_resources/e945788c531395f90f17d755604c6755.png)]
- 执行流程
- 用户发送请求给前端控制器DisptcharServlet
- DisptcharServlet收到请求调用HandlerMapping处理器映射器
- 处理器映射器找到具体的处理器(可以根据XML配置、注解进行查找),生成处理器对象及处理器拦截器(如果没有则生成)一并返回给DisptcharServlet
- DispatchaerServlet调用HandlerAdapter处理器适配器
- HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)
- Controller执行完成后返回ModelAndView
- HandlerAdapter将Controller执行结果ModelAndView返回给DispatherServlet
- DispatcharServlet将ModelAndView传给ViewResolver视图控制器
- DispatcharServlet根据view进行渲染视图(即将模型数据填充至视图中)。DispatcherServlet响应用户
三、SpringMVC组件解析
-
各个组件解析
-
前端控制器:DispatcherServlet
用户请求到达前端控制器,它就相当于MVC模式中的C,DispatcherServlet是整个流程的中心,由它调用其他组件处理用户的请求,DispatcherServlet的存在降低了组件之间的耦合性
-
处理器映射器:HandlerMapping
HandlerMapping负责根据用户请求找到Handler即处理器,SpringMVC提供了不同的映射器实现不同的映射方式,例如:配置文件方式、实现接口方式、注解方式等。
-
处理器适配器:HandlerAdapter
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行
-
处理器:Handler
它就是开发过程中要编写的具体业务控制器,由DispatcherServlet把用户的请求转发到Handler。由Handler对具体的用户请求进行处理。
-
视图解析器:View Resolver
View Resolve负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析称物理视图名,即页面的具体地址,再生成视图对象,最后对View进行渲染将处理结果通过页面展示给用户
-
视图:View
SpringMVC框架提供了很多的View视图类型的支持,包括:jstlView、freemarkView、pdfView等。最常用的视图就是jsp。一般情况下需要通过页面标签或页面模板技术将数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。
-
-
注解解析
@RequestMapping
作用:用于建立请求URL和处理请求方法之间的对应关系。
位置:
-
类上,请求URL的第一级访问目录,此处如果不写,就相当于应用的根的目录。
-
方法上,请求URL的第二级访问目录,与类上的使用@RequestMapping标注的一级目录一起组成访问虚拟路径属性:
-
value:用于指定请求的URL,它的属性和path的属性的作用是一样的
默认只有value值,当需要写其他值时才需要写出来
-
method:用于指定请求的方式
@Controller public class QuickController { @RequestMapping(value = "/quick",method = RequestMethod.POST) public String quickMethod() { System.out.println("quickMethod running....."); return "success"; } }
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n2Sqf8Sh-1647767770100)(:/56f887aaf9b44297bcd1c2e496d6365a)]
-
params = {“accountName”},表示请求的参数必须有accountName
@Controller public class QuickController { @RequestMapping(value = "/quick",params = {"username"}) public String quickMethod() { System.out.println("quickMethod running....."); return "success"; } }
- params = {"money!10"},表示请求参数中的money的值不能是10
@Controller public class QuickController { @RequestMapping(value = "/quick",params = {"username!=capkin"}) public String quickMethod() { System.out.println("quickMethod running....."); return "success"; } }
-
-
命名空间引入
- 命名空间:
xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc"
- 约束地址:
原因同前面spring-mvc.xml
链接:https://pan.baidu.com/s/1pdveQxUCkv-4Q6tw6pIVpQ
提取码:will
-
组件扫描
SpringMVC基于Spring容器,所以在进行SpringMVC操作时,需要将Controller存储到Spring容器中,如果使用@Controller注解的话,就需要使用以下配置进行扫描
<context:component-scan base-package="xyz.nchu200462.controller"/>
-
SpringMVC的XML配置解析
视图解析器
可以通过属性注入的方式,修改视图的前后缀
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/jsp/"></property> <property name="suffix" value=".jsp"></property> </bean>