学习目标:
1.Spring与Web环境集成
2.SpringMVC的简介
3.SpringMVC的组件解析
学习内容:
1.Spring与Web环境集成
Spring集成web环境步骤
1 配置ContextLoaderListener监听器
2 使用WebApplicationContextUtils获得应用上下文
先在pom.xml导入依赖spring-web
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
1.1 ApplicationContext应用上下文获取方式
在UserServlet.java中通过spring配置文件方式获取,如下:
public class UserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = app.getBean(UserService.class);
userService.save();
}
}
在web.xml中进行配置
<servlet>
<servlet-name>UserServlet</servlet-name> <!--名字-->
<servlet-class>com.itheima.web.UserServlet</servlet-class>
</servlet>
<servlet-mapping> <!--映射-->
<servlet-name>UserServlet</servlet-name>
<url-pattern>/userServlet</url-pattern>
</servlet-mapping>
此时:应用上下文对象是通过new ClasspathXmlApplicationContext(spring配置文件) 方式获取的,但是每次从 容器中获得Bean时都要编写new ClasspathXmlApplicationContext(spring配置文件) ,这样的弊端是配置 文件加载多次,应用上下文对象创建多次。
第二种方法:
1.创建ContextLoaderListener.java监听器类
public class ContextLoaderListener implements ServletContextListener {
//初始化方法
public void contextInitialized(ServletContextEvent servletContextEvent) {
ServletContext servletContext = servletContextEvent.getServletContext();
//读取web.xml中的全局参数
String contextConfigLocation = servletContext.getInitParameter("contextConfigLocation");
ApplicationContext app = new ClassPathXmlApplicationContext(contextConfigLocation);
//将Spring的应用上下文对象存储到ServletContext域中
servletContext.setAttribute("app",app);
System.out.println("spring容器创建完毕....");
}
public void contextDestroyed(ServletContextEvent servletContextEvent) {
}
}
在web.xml中配置listener(配置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>
在UserServlet.java中使用
public class UserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
ApplicationContext app = (ApplicationContext) servletContext.getAttribute("app");
UserService userService = app.getBean(UserService.class);
userService.save();
}
}
此时:在Web项目中,可以使用ServletContextListener监听Web应用的启动,我们可以在Web应用启动时,就加 载Spring的配置文件,创建应用上下文对象ApplicationContext,在将其存储到最大的域servletContext域 中,这样就可以在任意位置从域中获得应用上下文ApplicationContext对象了。
2. SpringMVC 简介
2.1 SpringMVC概述
SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,属于 SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 中。
SpringMVC 已经成为目前最主流的MVC框架之一,并且随着Spring3.0 的发布,全面超越 Struts2,成为最优 秀的 MVC 框架。它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口。同时 它还支持 RESTful 编程风格的请求。
需求:客户端发起请求,服务器端接收请求,执行逻辑并进行视图跳转。
2.2 SpringMvc开发步骤
- 在pom.xml中导入SpringMVC相关坐标
<!--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>
<!--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>
- 配置SpringMVC核心控制器DispathcerServlet(在web.xml配置SpringMVC的核心控制器)
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>c las spa th: spr ing -mv c.x ml< /pa ram -va lue >
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
- 创建Controller类和视图页面
public class QuickController{
public String quickMethod(){
System.out.println("quickMethod running.....");
return "index";
}
}
创建视图页面index.jsp
<html>
<body>
<h2>Hello SpringMVC!</h2>
</body>
</html>
- 使用注解配置Controller类中业务方法的映射地址
@Controller
public class QuickController {
@RequestMapping("/quick")
public String quickMethod(){
System.out.println("quickMethod running.....");
return "index";
}
}
- 配置SpringMVC核心文件 spring-mvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.alibaba.com/schema/stat"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://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.alibaba.com/schema/stat http://www.alibaba.com/schema/stat.xsd">
<!--配置注解扫描-->
<context:component-scan base-package="com.itheima"/>
</beans>
- 客户端发起请求测试
访问测试地址:
http://localhost:8080/itheima_springmvc1/quick
查看控制台打印的结果和网页显示的结果
SpringMVC流程图示
SpringMVC执行流程
3.SpringMVC的组件解析
3.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
SpringMVC 框架提供了很多的 View 视图类型的支持,包括:jstlView、freemarkerView、pdfView等。最 常用的视图就是 jsp。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程 序员根据业务需求开发具体的页面
3.2 SpringMVC注解解析
@RequestMapping
作用:用于建立请求 URL 和处理请求方法之间的对应关系 位置:
- 类上,请求URL 的第一级访问目录。此处不写的话,就相当于应用的根目录
@Controller
// 请求地址 http://localhost:8080/user/quick
@RequestMapping("/user")
public class UserController {
// 如果在类上面没有请求地址/user,即没有@RequestMapping("/user")
// 此时请求地址为 http://localhost:8080/quick
@RequestMapping(value="/quick")
public String save(){
System.out.println("Controller save running....");
return "/success.jsp";
}
}
- 方法上,请求 URL 的第二级访问目录,与类上的使用@ReqquestMapping标注的一级目录一起组成访问虚拟路径 属性:
– value:用于指定请求的URL。它和path属性的作用是一样的
– method:用于指定请求的方式
– params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的key和value必须和配置的一模一样
例如:
– params = {“accountName”},表示请求参数必须有accountName
– params = {“moeny!100”},表示请求参数中money不能是100
@Controller
@RequestMapping("/user")
public class UserController {
//method设置为GET,限制参数为username。
//因此请求地址 http://localhost:8080/user/quick?username=xxx
@RequestMapping(value="/quick",method = RequestMethod.GET,params = {"username"})
public String save(){
System.out.println("Controller save running....");
return "/success.jsp";
}
}
学习时间:
- 2022.4.7 上午