原理


发起请求时被前置控制器拦截到,这个其实就是一个DispatcherServlet,然后根据请求的参数生成代理请求,找到请求对应的实际控制器,控制器处理请求,创建数据模型,访问数据库,将模型响应给中心控制器,控制器使用模型与视图渲染试图结果,将结果返回中央控制器,然后返回给请求者。

运行步骤

简要分析:

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

    • 我们假设请求的URL为http://loclahost:8080/springmvc/hello
    • http://localhost:8080是服务器的域名
    • springmvc部署在服务器上的web站点
    • hello表示为控制器
    • 所以URL表示为请求服务器下的springmvc站点的hello控制器
  2. HandleMapping为处理器器映射。DispatcherServlet调用HandleMapping,HandleMapping根据URL查找到Handle
  3. HandleAdapter表示为处理器适配器,按照特定的规则去执行Handle
  4. Handle让具体的controller执行
  5. 如果设置了拦截器的话,不满足添加会被拦截下来
  6. controller将具体的执行信息返回给handleadapater,如modleandview
  7. 返回的时候也会被拦截器所拦截,同样需要满足条件
  8. handleadapter将试图逻辑名传递给dispatcherservlet
  9. dispatcherservlet调用ViewResolve来解析handleadapter传递的逻辑视图名
  10. ViewResolve将解析的视图名传给dispatcherservlet
  11. dispatcherservlet根据ViewResolve解析的视图结果,调用具体的视图
  12. 最终视图返回给用户

使用步骤:

xml版本:

  1. 配置dispatcherservlet中央处理器
    需要在web,xml中配置

    <?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">
    <!--    配置中央处理器配置路径用/,表示所有的请求都要经过这里/*:表示匹配所有请求,包括jsp页面/:表示只匹配所有的请求,不会去匹配jsp页面--><servlet><servlet-name>dispatcherServlet</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><servlet-mapping><servlet-name>dispatcherServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping></web-app>
    
  2. SpringMVC三要素的配置
    分别是处理器映射器(HandleMapping)、处理器适配器(handleadapter)、视图解析器(ViewResolve)

    <?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"/><!--    视图解析器dispatcherservlet给他的modelandview1.获取modeladnview中的数据2.解析了modleandview的视图名字3.拼接视图名字,找到相应的视图4.将数据渲染到视图上--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/"/><property name="suffix" value=".jsp"/></bean></beans>
    
  3. 编写controller

    package com.yu.controller;import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.Controller;import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;/*** @Description: TODO* @Author : yu* Date : 3/25/2020 1:58 PM*/
    public class HelloController implements Controller {@Overridepublic ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {ModelAndView mv = new ModelAndView();//业务代码String result = "hellospringmvc";mv.addObject("msg",result);//视图跳转mv.setViewName("test");//: /WEB-INF/jsp/test.jspreturn mv;}
    }

注意:如果代码没有问题,还是找不到目标,那么可以去查看一些依赖的问题


WEB-INF是否有lib目录,里面的配置是否有

缺点:一个controller只能有一个类,并且要配置一个bean

注意:

在将controller注册到spring中的时候,前面需要加/,否则就会404

<bean id="/t1" class="com.yu.controller.ControllerTest1"/>

可以省略处理器映射以及处理器适配器。结果不会改变,只需要视图解析器就行,因为mvc中默认有这两个东西。

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/"/><property name="suffix" value=".jsp"/></bean>

注意前缀哪里是jsp/,因为是将viewname拼接到这个里面,如果缺少/或者多/,那么就会出现url路径不正确,不能匹配的问题。

注解版:

  1. 在web中配置中央处理器dispatcherServlet

    <?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"><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:springmvc-servlet.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>
    </web-app>
    
  2. 在spring配置中开启注解

    <?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:cotext="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttps://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--    这个是扫描包,不用再自己配置bean--><cotext:component-scan base-package="com.yu.controller"/>
    <!--    让Spring MVC不在处理静态资源 .css .js .html .mp3等等--><mvc:default-servlet-handler/>
    <!--    开启mvc注解相当于与注入一个处理器映射一个处理器适配器--><mvc:annotation-driven/><!--    视图解析器--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp"/><property name="suffix" value=".jsp"/></bean></beans>
    
  3. 编写controller

    package com.yu.controller;import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;/*** @Description: TODO* @Author : yu* Date : 3/25/2020 3:01 PM*/
    @Controller
    public class HelloController {@RequestMapping("/h1")public String hello(Model model){//封装数据model.addAttribute("msg","hellow springmvcannatation");return "hello";  //会被视图解析器处理,这个/到底是为什么?要说和前面xml里面的id一样}
    }

    注意:

    1. 每次都要配置lib文件夹,因为好像是idea的问题,经常没有将依赖导进去。
    2. controller返回的字符串需要看看和视图解析器的前后缀拼接起来后是不是一个完整的url,缺少/就添,多了就去掉。

springMVC学习笔记二相关推荐

  1. springmvc学习笔记二:重定向,拦截器,参数绑定

    springmvc学习笔记二:重定向,拦截器,参数绑定 Controller方法返回值 返回ModelAndView controller方法中定义ModelAndView对象并返回,对象中可添加mo ...

  2. springMVC学习笔记(二)-----注解和非注解入门小程序

    阅读目录 一:基础环境准备 二:非注解的处理器和映射器 三:注解的处理器映射器和适配器 四:springmvc.xml中的内容以及项目工程目录 最近一直在做一个电商的项目,周末加班,忙的都没有时间更新 ...

  3. SpringMVC 学习笔记(二) @RequestMapping、@PathVariable等注解

    版权声明:本文为博主原创文章,博客地址:http://blog.csdn.net/a67474506?viewmode=contents 1.1. @RequestMapping映射请求 Spring ...

  4. SpringMVC学习笔记(二)常用注解

    SpringMVC学习笔记(二)常用注解 1.RequestParam 作用: 把请求中指定名称的参数给控制器中的形参赋值. 属性: value:请求参数中的名称. required:请求参数中是否必 ...

  5. SpringMVC学习笔记

    文章目录 SpringMVC学习笔记 Spring MVC 什么是 MVC 设计模式? Spring MVC 的核心组件 Spring MVC 的工作流程 如何使用? Spring MVC 注解 Sp ...

  6. SpringMVC学习笔记整理

    SpringMVC学习笔记 以下是我整理的SpringMVC学习笔记: 导入jar包 一:springmvc工作流程. ①.     servlet容器初始化一个request请求 ②.     Di ...

  7. JavaEE 企业级分布式高级架构师(四)SpringMVC学习笔记(4)

    SpringMVC学习笔记 高级应用篇 ControllerAdvice @ControllerAdvice @ModelAttribute 作用于方法 作用于方法参数 @InitBinder @Ex ...

  8. SpringMVC学习笔记_01

    SpringMVC学习笔记_01 1.JAVAEE体系结构 JAVAEE体系结构图如下所示: 2.什么是springmvc? 什么是mvc? Model1 Model2 SpringMVC是什么? S ...

  9. qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7851 ...

最新文章

  1. nginx中的event模块
  2. mysql快速入门_MySQL快速入门(三)
  3. Shell 脚本——测试命令
  4. gateway请求拦截_一种网关对用户请求进行统一拦截判断是否放行的方法与流程...
  5. 像数据科学家一样思考:12步指南(下)
  6. 挂载jffs2文件系统遇到的问题
  7. Mac下安装emacs+cscopse+auto-complete
  8. 11.Kong入门与实战 基于Nginx和OpenResty的云原生微服务网关 --- 自定义插件
  9. JQuery——基础
  10. MacBookpro安装mysql教程_mac安装mysql的两种方法
  11. Java实现 蓝桥杯 算法提高 文本加密
  12. 国内外实行HACCP情况(转载)
  13. 3小时GIS入门教程(一):为什么要学GIS
  14. 利用matlab裁剪图片大小,MATLAB裁剪图片
  15. JS——背景色的滑动效果以及输入框的状态切换效果实现
  16. ubuntu-Errors were encountered while processing
  17. SpringMVC 通过Map、Model和ModelMap向页面传值
  18. Win7/8/10安装Centos7/Redhat7双系统丢失windows启动项的解决办法
  19. OrCAD学习笔记1
  20. 2022秋软工实践 第一次结对编程作业

热门文章

  1. Springboot毕设项目校园二手交易平台x9zo8java+VUE+Mybatis+Maven+Mysql+sprnig)
  2. 详述 MIMIC 数据库 26张数据表(二)之 五种字典表
  3. 链接脚本.lds(详细)总结附实例快速掌握
  4. Android百度地图,绘制,覆盖物,导航,定位,细腻分解!
  5. Flutter:WebView和H5通信
  6. SpringBoot 集成接口文档,老鸟们也被打脸了!
  7. 2020-mac教程-sudo spctl --master-disable用不了
  8. UAC1.0和UAC2.0区别
  9. ubuntu忘记密码?怎么办
  10. 野蛮生长后,网络自制剧如何摆脱诸多顽疾?