码迷,mamicode.com
首页 > 编程语言 > 详细

SpringMVC【二】SpringMVC 入门程序及执行流程

时间:2020-06-28 00:42:08      阅读:80      评论:0      收藏:0      [点我收藏+]

标签:文件夹   实现   步骤   def   渲染   ota   图解   strong   运行   

2、Spring MVC

2.1 简介

Spring MVC 是Spring Framework的一部分,是基于 Java 实现 MVC 的轻量级 Web 框架。

官方文档:https://docs.spring.io/spring/docs/5.2.7.RELEASE/spring-framework-reference/web.html#spring-web

Spring MVC 特点:

  1. 轻量级,简单易学
  2. 高效 , 基于请求响应的 MVC 框架
  3. 与 Spring 兼容性好,无缝结合
  4. 约定优于配置
  5. 功能强大:RESTful、数据验证、格式化、本地化、主题等
  6. 简洁灵活

2.2 中心控制器

Spring 的 web 框架围绕 DispatcherServlet [ 调度Servlet ] 设计。

DispatcherServlet 的作用是将请求分发到不同的处理器。从Spring 2.5开始,使用 Java 5 或者以上版本的用户可以采用基于注解形式进行开发,十分简洁。

Spring MVC 框架像许多其他 MVC 框架一样,以请求为驱动,围绕一个中心 Servlet 分派请求及提供其他功能,DispatcherServlet 是一个实际的 Servlet(它继承自 HttpServlet 基类)

SpringMVC 的原理

当发起请求时,被前置的控制器拦截到请求;根据请求参数生成代理请求,找到请求对应的实际控制器;控制器处理请求,创建数据模型,访问数据库;将模型响应给中心控制器;控制器使用模型与视图渲染视图结果;将结果返回给中心控制器;再将结果返回给请求者。

2.3 Spring 具体执行流程

技术图片

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

    假设请求的 url 为 : http://localhost:8080/SpringMVC/hello,这个 url 可被拆成三部分:

    http://localhost:8080 服务器域名;SpringMVC 部署在服务器上的web站点;hello 表示控制器。

    所以,url 表示为:请求位于服务器 localhost:8080 上的 SpringMVC 站点的 hello 控制器。

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

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

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

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

  6. 具体的 Controller 来执行 Handler。

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

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

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

  10. 【ViewResolver】 将解析过的逻辑视图名传给DispatcherServlet。

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

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

对应编写程序时的实现步骤为:

  1. 新建 web 项目,导入相关 jar 包
  2. 编写 web.xml , 注册 DispatcherServlet
  3. 编写 SpringMVC 配置文件
  4. 创建对应的控制类 , Controller
  5. 完善前端视图和 controller 之间的对应
  6. 测试运行调试

3、Spring MVC 入门程序

3.1 使用配置

  1. 新建一个模块,添加 web 的支持

  2. 确定项目中有 spring MVC 的依赖,确定发布的项目中也有所有的依赖

    在 Project Structure 中查看 WEB-INF 目录下是否有 lib 文件夹,如果没有则新建一个,并把所有依赖加入。

  3. 配置 web.xml,注册 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">
    
        <!--配置 DispatcherServlet:spring MVC的核心,请求分发器/前端控制器-->
        <servlet>
            <servlet-name>springmvc</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!--DispatcherServlet 要绑定 spring-MVC 的配置文件-->
            <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>
    
        <!--
            在 spring MCV 中:/  和   /*区别
            / :只匹配所有的请求,不会去匹配 jsp 页面,即:.jsp不会进入spring的 DispatcherServlet类【一般都写 /】
            /*:匹配所有的请求,包括 jsp 页面,会出现返回 jsp视图 时再次进入spring的DispatcherServlet 类,导致找不到对应的controller所以报 404 错。
        -->
        <servlet-mapping>
            <servlet-name>springmvc</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    
    </web-app>
    
  4. 编写 SpringMVC 的配置文件 springmvc-servlet.xml (在 src—main—resources 文件夹下)

    命名:【servlet-name】-servlet.xml

  5. 添加【处理映射器】

  6. 添加【处理器适配器】

  7. 添加【视图解析器】

    视图解析器:DispatcherServlet 给它 ModelAndView
        1、获取了 ModelAndView 中的数据
        2、解析 ModelAndView 的视图名字
        3、拼接视图名字,找到对应的视图 /WEB-INF/jsp/hello.jsp
        4、将数据渲染到视图上
    
    <?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>
    </beans>
    
  8. 编写要操作业务的 Controller 类 ,要么实现 Controller 接口,要么增加注解;需要返回一个ModelAndView,封装数据,视图跳转

    public class HelloController implements Controller {
        public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
            // ModelAndView 模型和视图
            ModelAndView mv = new ModelAndView();
    		// 调用业务层
            // 封装对象,放在 ModelAndView 中
            String result = "HelloSpringMVC";
            mv.addObject("msg", result);
            // 封装要跳转的视图,放在ModelAndView中,视图跳转
            mv.setViewName("test");
            return mv;
        }
    }
    
  9. 将自己的类交给 SpringIOC 容器,注册 bean

    <!--BeanNameUrlHandlerMapping:bean-->
    <bean id="/hello" class="com.song.controller.HelloController"/>
    
  10. 编写要跳转的 test.jsp 页面(放在 WEB-INF 下新建的 jsp 文件夹中),显示 ModelandView 存放的数据,以及我们的正常页面,即完善前端视图和 controller 之间的对应。

    注意:在视图解析器中我们把所有的视图都存放在/WEB-INF/目录下,这样可以保证视图安全,因为这个目录下的文件,客户端不能直接访问。

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    	${msg}
    </body>
    </html>
    
  11. 配置 Tomcat,部署项目,启动测试,在浏览器地址栏输入请求路径 localhost:8080/hello

可能遇到的问题:访问出现 404。排查步骤:

  1. 查看控制台输出,看一下是不是缺少了什么 jar 包。
  2. 如果 jar 包存在,显示无法输出,就在 IDEA 的项目发布中,添加 lib 依赖!
  3. 重启 Tomcat 即可解决!

注意:实际开发中并不会这样写程序。

3.2 使用注解

  1. 新建模块、添加依赖等,和上面一样

  2. 配置 web.xml,和使用配置的 web.xml 相同

    • web.xml 文件要最新版;
    • 注册 DispatcherServlet;
    • 关联 SpringMVC 的配置文件;
    • 启动级别为 1;
    • 映射路径为 / 【不要用 /*,会 404】
  3. 编写 Spring MVC 配置文件,注意要导入头文件约束

    为了支持基于注解的 IOC,设置了自动扫描包的功能

    • 让 IOC 的注解生效(开启自动扫描包);
    • 静态资源过滤,让Spring MVC不处理静态资源 :HTML、 . JS、 . CSS 、图片和视频等;
    • 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/context
           https://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/mvc
           https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
        <!-- 自动扫描包,让指定包下的注解生效,由IOC容器统一管理 -->
        <context:component-scan base-package="com.song.controller"/>
        <!-- 让Spring MVC不处理静态资源 .css .js  .html .mp3  .mp4...-->
        <mvc:default-servlet-handler />
        <!--
        支持mvc注解驱动
            在spring中一般采用@RequestMapping注解来完成映射关系
            要想使@RequestMapping注解生效
            必须向上下文中注册DefaultAnnotationHandlerMapping
            和一个AnnotationMethodHandlerAdapter实例
            这两个实例分别在类级别和方法级别处理。
            而annotation-driven配置帮助我们自动完成上述两个实例的注入。
         -->
        <mvc:annotation-driven />
    
        <!-- 视图解析器 -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
              id="internalResourceViewResolver">
            <!-- 前缀 -->
            <property name="prefix" value="/WEB-INF/jsp/" />
            <!-- 后缀 -->
            <property name="suffix" value=".jsp" />
        </bean>
    
    </beans>
    
  4. 创建控制类 Controller,添加注解

    • @Controller 是为了让 Spring IOC 容器初始化时自动扫描到;
    • @RequestMapping 是为了映射请求路径,类与方法上都可以有映射;
    • 方法中声明 Model 类型的参数是为了把 Action 中的数据带到视图中;
    • 方法返回的结果是要跳转的页面,因此写上视图的名称 hello,加上配置文件中的前后缀变成 WEB-INF/jsp/hello.jsp
    @Controller
    @RequestMapping("/hello")
    public class HelloController {
    
        // 访问地址:localhost:8080/hello/h1 
        // 如果没有上面的 hello,直接是 localhost:8080/h1
        @RequestMapping("/h1")
        public String hello(Model model){
            // 封装数据,向模型中添加属性msg与值,可以在JSP页面中取出并渲染
            model.addAttribute("msg", "hello,SpringMVCAnnotation");
            return "hello"; //会被视图解析器处理
        }
    }
    
  5. 创建视图层,和之前一样

    • WEB-INF/ jsp 目录下创建 hello.jsp,视图可以直接取出并展示从 Controller 带回的信息;
    • 可以通过 EL 表达式取出 Model 中存放的值或者对象。
  6. 配置 Tomcat 运行,在浏览器地址栏输入请求路径 localhost:8080/hello/h1

小结:

使用springMVC必须配置的三大件:处理器映射器、处理器适配器、视图解析器

通常,我们只需要手动配置视图解析器,而处理器映射器处理器适配器只需要开启注解驱动即可,省去大段的 xml 配置。

SpringMVC【二】SpringMVC 入门程序及执行流程

标签:文件夹   实现   步骤   def   渲染   ota   图解   strong   运行   

原文地址:https://www.cnblogs.com/Songzw/p/13200447.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!