Spring MVC执行的流程
用我个人的语言和理解进行讲解。
首先我们配置前端控制器Dispctcherservlet,扫描用户所发出的请求。
Controller 并未接收到用户请求,前端Servlet接收到用户请求后,通常会对用户请求进行简单预处理,例如解析,封装参数等,然后通过反射来创建Controller实例,并调用Controller的指定方法(MVC实际上封装的就是Servlet的请求和响应。)
Servlet拦截用户请求后,它如何知道创建那个 Controller接口的实例呢?
利用 xml 配置文件:例如在XML配置文件中描述hello请求对应使用HelloControllerL类。这就可以让MVC框架知道创建那个Controller接口的实例。
利用注解: 例如使用注解@Controller描述一个类,并使用注解RequestMapping(value=“/hello”)描述hello请求对应的方法。
Spring MVC执行的流程
1
用户向服务器发送请求,请求被DispacherServlet拦截获取,
2
DispacherServlet对请求的URL(统一资源定位符)进行解析,获得URL,再根据URL调用HandlerMapping获得该Handler配置的所有相关的对象,包括Handler对象以及Hanler对象对应的拦截器,这些对象会被封装到hanlerExecutionChain对象中进行返回。3
Servlet获得的Handler,选择一个合适的HandlerAdapter。
HandlerAdapter的设计符合面向对象中的单一职责原则,会被用于处理多种Handler,调用Handler实际处理请求的方法。
4
提取请求重点模型数据,开始执行Handler(Controller)在。再填充Handlerd的入参过程中,根据配置。
Spring将帮你做一些额外的工作: 消息转化,数据转化,数据格式化,数据验证
5
Handler执行完成后,DisptcherServlet返回一个ModelAndView对象,ModelAndView对象中应该包含视图名或视图名和模型。
6
根据返回的ModelAndView对象,选择一个合适的ViewResolver(视图解析器)返回给DispacherServlet
7
ViewResolver结合Model和View来渲染视图。
8
将视图渲染结果返回给客户端。
1 环境配置(导入Springjar包)
idea开发环境,配置Tomcat 创建项目 植入依赖 (不管是哪个ide都可以转化为maven项目。 所以在创建项目时,就创建maven项目。)
1)Maven项目 artifactID 产品ID GroupID 厂商id version 版本号 2)pom.xml
Maven的配置文件。 主要在dependencies添加 maven的相关依赖(maven官方) 3)d为该项目添加Web能力
(尝试利用打包的方式 来给项目添加 web的tomcat的能力。)自学点
开发Spring MVC应用
pom.xml 配置(首先增加Spring支持)
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.18</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.18</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.3.18</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.18</version>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
在 web.xml定义前端控制器Dispatcherservlet来拦截用户请求。
配置前端控制器Dispctcherservlet
修改web.xml (servler servlet mapping) 配置dispatcherservlet
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- 拦截所有的请求,并且由他对所有的请求进行分配 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<!-- 初始化参数 spring配置文件的作用-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springmvc-config.xml</param-value>
</init-param>
<!-- 启动序列,拍到第一位-->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 代表拦截的命令的类型 /所有类型-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- servlet 和 servlet-mapping 配置之后,代表springMVC接受了请求响应-->
</web-app>
3配置Spring MVC的控制类
<?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.springframework.org/schema/mvc"
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
https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 定义注解扫描-->
<context:component-scan base-package="org.chen.controller"/>
<!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>-->
<!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>-->
<!-- 默认装配方案-->
<mvc:annotation-driven/>
<!-- 静态资源处理-->
<mvc:default-servlet-handler/>
<!--视图解析器 解析jsp-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
</beans>
Controller类的实现
@Controller
public class Hellocontroller {
@RequestMapping(value = "/hello")
public ModelAndView hello() {
System.out.println("hello 方法被调用");
ModelAndView mv = new ModelAndView();
mv.addObject("message", "Hello World!");
mv.setViewName("/WEB-INF/view/weclome.jsp");
return mv;
}
}
View页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${requestScope.message}
<br>
<input type="submit" name="提交">
</body>
</html>
界面