SpringMvc
SpringMvc是Spring框架中的产品之一,对应的解释,博主不再赘述,我们学习Spring,也不得不学习SpringMvc。
SpringMvc执行流程
大致过程如上图,深色框中的都不需要我们实现,我们仅仅需要关注Handler和View的部分,其他都由SpringMvc实现。
具体流程如下:
- 用户发起访问。
- DispatcherServlet根据用户的请求路径在HandlerMapping中查找对应的Handler。
- HandlerMapping生成处理器执行链HandlerExecutionChain(包括处理器对象和处理器拦截器)一并返回给DispatcherServlet。
- DispatcherServlet根据处理器Handler获取处理器适配器HandlerAdapter执行一系列的操作(比如请求数据封装,数据格式转换和数据验证等操作)。
- 执行处理器Handler(Controller控制器)。
- Handler处理完成后返回ModelAndView给处理器适配器。
- HandlerAdapter将Handler的执行结果ModelAndView返回给DispatcherServlet。
- DispatcherServlet将HandlerAdapter返回的ModelAndView传给ViewResolver解析。
- ViewResolver解析之后返回具体的View给DispatcherServlet。
- DispatcherServlet根据ViewResolver返回的View进行视图渲染(将ModelAndView中的Model数据填充到视图View中)。
- DispatcherServlet响应给用户。
入门案例
- 创建Maven项目,导入如下依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<!--演示原理需要,实际开发不会导入该依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
- 在resources中编写SpringMvc配置文件springMvc-config.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--处理器映射器:
DispatcherServlet先通过处理器映射器找到处理对应请求的Handler(我们自己编写的类和方法)
-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--处理器适配器:
按照特定的规则去执行对应的Handler
-->
<bean class= "org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--视图解析器:
1.获取ModelAndView中的数据
2.解析ModelAndView的视图名字
3.根据视图解析器拼接这个视图名字,并找到响应的视图
4.将ModelAndView中的数据渲染到这个视图中
5.最后视图就呈现在用户的浏览器上
-->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
- 在web中的WEB-INF下配置web.xml文件(让所有的请求都交由SpringMvc处理):
<servlet>
<servlet-name>springMvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--配置DispatcherServlet要绑定Spring的配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMvc-config.xml</param-value>
</init-param>
<!--配置DispatcherServlet的启动级别为1,与服务器同时启动加载-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--
/和/*的区别:
/:只匹配所有的请求,不会去匹配jsp页面
/*:匹配所有的请求,包括jsp页面
-->
<servlet-mapping>
<servlet-name>springMvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
- 编写Handler处理类(HelloController):
package com.ara.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//实现Controller接口 表示这是一个处理器
public class HelloController implements Controller {
//实现接口的方法 处理请求的方法
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView modelAndView = new ModelAndView();
//设置返回数据Model
String result = "Hello SpringMVC";
modelAndView.addObject("msg",result);
//设置返回视图
modelAndView.setViewName("test");
return modelAndView;
}
}
- 在WEB-INF下创建jsp目录,然后创建test.jsp页面,作为视图。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--取出模型中的数据--%>
${msg}
</body>
</html>
- 在SpringMvc的配置文件中添加处理器的bean:
<!-- BeanNameUrLHandlerMapping :bean id:对应请求路径-->
<bean id="/hello" class="com.ara.controller.HelloController"/>
- 现在我们就可以直接配置Tomcat,运行看结果了,我们运行之后就直接访问该项目下的hello,结果如下:
到此,我们的第一个SpringMvc的入门程序就成功了。
当然,实际开发我们不会这样做,这个入门仅仅为了展示其原理,实际的开发,我们更多的是用注解开发,但是我们在学习时,需要先了解其原理,然后再学习简单的操作。