springMVC运行原理详解及项目创建

引言

以下是我自己的理解,可能会比较浅薄。

运行原理

图为SpringMVC的一个较完整的流程图,实线表示SpringMVC框架提供的技术,不需要开发者实现,虚线表示需要开发者实现。

简要分析执行流程

  1. DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求。

     <servlet-mapping>
         <servlet-name>springmvc</servlet-name>
         <url-pattern>/</url-pattern>
     </servlet-mapping>

    所有的请求都被拦截了

    我们假设请求的url为 : http://localhost:8080/SpringMVC/hello

    如上url拆分成三部分:

    http://localhost:8080服务器域名

    SpringMVC部署在服务器上的web站点

    hello表示控制器

    通过分析,如上url表示为:请求位于服务器localhost:8080上的SpringMVC站点的hello控制器。

  2. HandlerMapping为处理器映射。DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler

     <!--    添加 处理映射器-->
         <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
     <!--添加 处理器适配器-->
         <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
     ...
     ​
     <!--    handler-->
     <bean id="/hello" class="com.lyc.controller.HelloController"/>

  3. HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器,如上url被查找控制器为:hello。

  4. HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。

  5. HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。

  6. Handler让具体的Controller执行。实现controller接口的类,都会去找

  7. Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。

     @Override
     public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
         //ModelAndView 模型和视图
         ModelAndView mv = new ModelAndView();
         //封装对象,放在ModelAndView中。Model
         mv.addObject("msg","HelloSpringMVC!");
         //封装要跳转的视图,放在ModelAndView中
         mv.setViewName("hello");
         //: /WEB-INF/jsp/hello.jsp
         return mv;
     }

  8. HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。

  9. DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。

  10. 视图解析器将解析的逻辑视图名传给DispatcherServlet。

  11. DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。

  12. 最终视图呈现给用户。

springMVC的第一个项目

第一步:确定我们项目中的maven依赖中有spring-webmvc;

 <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-webmvc</artifactId>
     <version>5.1.9.RELEASE</version>
 </dependency>

第二步:为了防止报错404,确定我们项目中artifacts中lib包内有项目的全部依赖

第三步:在web.xml中配置dispatcherServlet

<!--配置dispatcherServlet:这个是springmvc的核心:前端控制器-->
     <servlet>
         <servlet-name>springmvc</servlet-name>
         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
     </servlet>
 <!--    servlet映射-->
     <servlet-mapping>
         <servlet-name>springmvc</servlet-name>
         <url-pattern>/</url-pattern>
     </servlet-mapping>

注意点:

在springmvc中 /:只匹配所有的请求,不会去匹配jsp页面 /*:匹配所有的请求,包括jsp页面

我们去配视图解析器时会添加视图页面的前后缀,如果在servletMapper中使用/* 会将jsp页面也做一遍,就会变成a.jsp.jsp无限死循环,需要注意

第四步:为dispatcherServlet绑定spring的配置文件(需要在<servlet></servlet>中配置)

 <init-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>classpath:springmvc-servlet.xml</param-value>
 </init-param>

且需要在resource包中创建springmvc-servlet.xml文件,

第五步:设置启动级别:需要跟服务器一起启动,级别为1

 <load-on-startup>1</load-on-startup>

代码展示:

 
<?xml version="1.0" encoding="UTF-8"?>
 <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
          version="4.0">
 <!--配置dispatcherServlet:这个是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-servlet.xml</param-value>
         </init-param>
 <!--        启动级别:1 跟服务器一起启动-->
         <load-on-startup>1</load-on-startup>
     </servlet>
 <!--
 在springmvc中
 /:只匹配所有的请求,不会去匹配jsp页面
 /*:匹配所有的请求,包括jsp页面
 -->
 <!--    servlet映射-->
     <servlet-mapping>
         <servlet-name>springmvc</servlet-name>
         <url-pattern>/</url-pattern>
     </servlet-mapping>
 </web-app>

第六步:在springmvc-servlet.xml中配置处理器映射器与处理器适配器以及视图解析器(为了理解原理才配置,真实开发不需要配置,这三个是springmvc的核心三要素

 <?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
 <!--    处理器映射器,显示的一种配置,在之后开发可以用注解替代-->
 <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
 <!--    处理器适配器-->
 <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
 <!--    视图解析器:模板引擎Thymeleaf Freemarker...,可以更换,也可以自定义-->
     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
 <!--       前缀 -->
         <property name="prefix" value="/WEB-INF/jsp/"/>
         <!--       后缀 -->
         <property name="suffix" value=".jsp"/>
     </bean>
 <!--    springmvc的核心三要素-->
 </beans>

第七步:spring文件的配置完成了,现在去写Controller层的业务并完成视图跳转

HelloController.java

 package com.lyc.controller;
 ​
 import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.mvc.Controller;
 ​
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 ​
 public class HelloController implements Controller {
     @Override
     public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
 ​
         ModelAndView mv = new ModelAndView();
         //业务代码
         
         String result = "HelloSpringMVC!";
         mv.addObject("msg",result);
         
         //视图跳转
         mv.setViewName("test");
         
         return mv;
     }
 }

第八步:因为这个处理器映射器BeanNameUrlHanderMapper是根据Bean的名字去找,因此我们还需要设置Bean

 <!--  BeanNameUrlHandlerMapping:bean  -->
     <bean id="/hello" class="com.lyc.controller.HelloController"/>

第九步:配置tomcat

运行效果

至此项目完成!希望对大家有所帮助

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值