Spring MVC简单入门

叁歲伎倆 2022-12-16 14:25 345阅读 0赞

Spring MVC简单入门

  1. 概述

    1. Spring MVC是Spring框架的web层的解决方案
    2. Spring MVC框架提供了MVC(模型 - 视图 - 控制器)架构和用于开发灵活和松散耦合的Web应用程序的组件。 MVC模式导致应用程序的不同方面(输入逻辑,业务逻辑和UI逻辑)分离,同时提供这些元素之间的松散耦合。

      1. M: model(模型):封装了程序数据,通常是一些POJO类组成的。
      2. V: view(视图):负责绚烂模型数据,生成浏览器可以解析的HTML。
      3. C:controller(控制器):负责处理用户请求并构建相应的数据模型,然后将其传递给视图进行数据渲染。
    3. 引用Spring官方文档的话:

      • Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, “Spring Web MVC,” comes from the name of its source module (spring-webmvc), but it is more commonly known as “Spring MVC”.
      • 意思是Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就包含在Spring Framework中。正式名称“Spring Web MVC”来自其源模块(spring-webmvc)的名称,但它通常被称为“Spring MVC”。
  2. 使用配置的方式构建一个Spring MVC项目

    1. 编写pom文件:

        1. <dependency>
        2. <groupId>org.springframework</groupId>
        3. <artifactId>spring-context</artifactId>
        4. <version>4.3.21.RELEASE</version>
        5. </dependency>
        6. <dependency>
        7. <groupId>org.springframework</groupId>
        8. <artifactId>spring-context-support</artifactId>
        9. <version>4.3.21.RELEASE</version>
        10. </dependency>
        11. <dependency>
        12. <groupId>org.springframework</groupId>
        13. <artifactId>spring-web</artifactId>
        14. <version>4.3.21.RELEASE</version>
        15. </dependency>
        16. <dependency>
        17. <groupId>org.springframework</groupId>
        18. <artifactId>spring-webmvc</artifactId>
        19. <version>4.3.21.RELEASE</version>
        20. </dependency>
        21. <dependency>
        22. <groupId>javax.servlet</groupId>
        23. <artifactId>servlet-api</artifactId>
        24. <version>2.5</version>
        25. <scope>provided</scope>
        26. </dependency>
        27. <dependency>
        28. <groupId>javax.servlet.jsp</groupId>
        29. <artifactId>jsp-api</artifactId>
        30. <version>2.2</version>
        31. <scope>provided</scope>
        32. </dependency>
        33. <dependency>
        34. <groupId>javax.servlet</groupId>
        35. <artifactId>jstl</artifactId>
        36. <version>1.2</version>
        37. </dependency>

        SpringMVC01


        org.apache.tomcat.maven
        tomcat7-maven-plugin
        2.2

        UTF-8
        /SpringMVC01
        8080



    2. 编写web.xml文件

      • <!DOCTYPE web-app PUBLIC
        “-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN”
        “http://java.sun.com/dtd/web-app_2_3.dtd“ >

        Archetype Created Web Application
        1. <servlet-name>springmvc</servlet-name>
        2. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        1. <servlet-name>springmvc</servlet-name>
        2. <url-pattern>*.action</url-pattern>

    3. 准备Spring MVC的配置文件

      • 默认情况下必需放在WEB-INF下
      • 该文件的命名是-servlet.xml。(但是该文件的名称和路径都可以更改)
      • 如我这里配置文件名字就是springmvc-servlet.xml
    4. 编写后端控制器

      • package com.fxyh.springmvc.web;

        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 {

        1. @Override
        2. public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        3. ModelAndView modelAndView = new ModelAndView();
        4. modelAndView.addObject("info", "Hello World Spring Mvc");
        5. modelAndView.setViewName("success");
        6. return modelAndView;
        7. }

        }

    5. 编写JSP文件(success.jsp)

      • <%@ page contentType=”text/html;charset=UTF-8” language=”java” isELIgnored=”false” %>

        Title


        ${info}

    6. 编写Spring MVC配置文件

      • <?xml version=”1.0” encoding=”UTF-8”?>

















    7. 目录结构图

      • 在这里插入图片描述
  3. Spring MVC默认配置

    • 在这里插入图片描述
    • Default implementation classes for DispatcherServlet’s strategy interfaces.

      Used as fallback when no matching beans are found in the DispatcherServlet context.

      Not meant to be customized by application developers.

      org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver

      org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver

      org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
      org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping

      org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
      org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
      org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter

      org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,\
      org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\
      org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver

      org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator

      org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver

      org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager

    1. 映射处理器(HandlerMapping)

      • 在这里插入图片描述
      • BeanNameUrlHandlerMapping(配置方式)
      • DefaultAnnotationHandlerMapping(注解方式)
    2. 映射适配器(HandlerAdapter)

      • 在这里插入图片描述
      • SimpleControllerHandlerAdapter(配置方式)
      • HttpRequestHandlerAdapter(配置方式)
      • AnnotationMethodHandlerAdapter(注解方式)
    3. 视图解析器(ViewResolver)

      • 在这里插入图片描述
      • InternalResourceViewResolver(配置和注解方式)
    4. 异常处理(HandlerExceptionResolver)

      • 在这里插入图片描述
      • DefaultHandlerExceptionResolver(配置方式)
      • AnnotationMethodHandlerExceptionResolver(注解方式)
      • ResponseStatusExceptionResolver(注解方式)
  4. 关于Spring MVC配置文件重命名问题:

    1. 默认情况下为WEB-INF下的-servlet.xml
    2. 真实开发中:


      1. springmvc
        org.springframework.web.servlet.DispatcherServlet

        1. <param-name>contextConfigLocation</param-name>
        2. <param-value>classpath*:springmvc.xml</param-value>




        springmvc
        *.action

      2. 在servlet配置的时候添加初始化参数,指定contextConfigLocation参数

  5. 关于映射处理器问题

    • 多个映射路径映射到了同一个后端控制器


        1. <property name="mappings">
        2. <props>
        3. <prop key="/abc.action">handlerMappingController</prop>
        4. <prop key="/handlerMapping.action">handlerMappingController</prop>
        5. </props>
        6. </property>
        7. <!--<property name="order" value="1"/>-->
      • 上述场景下,会执行handlerMapping处理器,因为从上而下执行,先找到上面的handlerMapping的处理器,所以直接解析了,所以两个处理器换一个位置就可以换一个处理器执行。
      • 处理器也可以设置order,数值越小的优先级越高,配置方式如上注释的property。
      • 如果多个映射处理器中配置了order的优先级比没有配置order的高,从上而下执行的情况只有所有的处理器都没有配置order属性的时候才有效。
      • 怎么看是执行哪个处理器?

        • org.springframework.web.servlet.DispatcherServlet的doDispatch方法里面
        • 在这里插入图片描述
        • 在这里打上断点,然后查看mappedHandlerd的值
        • 在这里插入图片描述
  6. 关于映射适配器问题

    • 后端控制器的执行方法(handleRequest)是由适配器调用。
    • 适配器来适配后端控制器实现的接口

      • 如:HelloController实现Controller接口,那么使用SimpleControllerHandlerAdapter适配器可以成功调用
      • 如:

        • package com.fxyh.springmvc.web;

          import org.springframework.web.HttpRequestHandler;

          import javax.servlet.ServletException;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;
          import java.io.IOException;

          public class HandlerAdapterController implements HttpRequestHandler {

          @Override
          public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

          1. request.setAttribute("info", "http request handler");
          2. request.getRequestDispatcher("/WEB-INF/pages/adapter/success.jsp").forward(request, response);

          }
          }

        • 这个Controller实现的是HttpRequestHandler接口,使用SimpleControllerHandlerAdapter那么就会报错误

          • javax.servlet.ServletException: No adapter for handler [com.fxyh.springmvc.web.HandlerAdapterController@517db47a]
        • 如果要让这个正常使用,必须要改适配器

          • 使用HttpRequestHandlerAdapter适配器来适配,这里测试的时候这样玩,实际开发中是不会的,最好统一风格
  7. 关于跳转问题

    1. 服务器端跳转(转发)

      1. modelAndView.setViewName(“forward/success”);
      2. modelAndView.setViewName(“forward:/WEB-INF/pages/forward/success.jsp”);
      3. // 第三种: 只适合在后端控制器实现了HttpRequestHandler接口的时候
        request.getRequestDispatcher(“/WEB-INF/pages/forward/success.jsp”).forward(request,response);
      4. View view = new JstlView(“/WEB-INF/pages/forward/success.jsp”);
        modelAndView.setView(view);
    2. 重定向

      1. public class RedirectController implements Controller {

        @Override
        public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {

        1. ModelAndView modelAndView = new ModelAndView();
        2. modelAndView.addObject("info", "redirect");
        3. modelAndView.setViewName("redirect:/redirectResult.action");
        4. return modelAndView;

        }
        }

      2. public class RedirectResultController implements Controller {

        @Override
        public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {

        1. ModelAndView modelAndView = new ModelAndView();
        2. modelAndView.setViewName("redirect/success");
        3. return modelAndView;

        }
        }

      3. 属性值取不到了,但是会做成http://localhost:8787/SpringMVC01/redirectResult.action?info=redirect
  8. 后端控制器

    1. MultiActionController

      • package com.fxyh.springmvc.web;

        import org.springframework.web.servlet.ModelAndView;
        import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;

        public class UserController extends MultiActionController {

  1. public ModelAndView add(HttpServletRequest request, HttpServletResponse response) {
  2. System.out.println("add");
  3. return null;
  4. }
  5. public ModelAndView delete(HttpServletRequest request, HttpServletResponse response) {
  6. System.out.println("delete");
  7. return null;
  8. }
  9. public ModelAndView update(HttpServletRequest request, HttpServletResponse response) {
  10. System.out.println("update");
  11. return null;
  12. }
  13. public ModelAndView list(HttpServletRequest request, HttpServletResponse response) {
  14. System.out.println("list");
  15. return null;
  16. }
  17. }
  18. * <bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
  19. <property name="paramName" value="method"/>
  20. </bean>
  21. <bean id="userController" name="/user.action" class="com.fxyh.springmvc.web.UserController">
  22. <property name="methodNameResolver" ref="methodNameResolver"></property>
  23. </bean>
  24. * http://localhost:8787/SpringMVC02/user.action?method=update 会调用UserController的update方法
  25. * http://localhost:8787/SpringMVC02/user.action?\[paramName\]=方法名 的方式来通过不同的参数值来调用不同的方法
  26. 2. ### ServletForwardingController ###
  27. * package com.fxyh.springmvc.servlet;
  28. import javax.servlet.ServletException;
  29. import javax.servlet.ServletRequest;
  30. import javax.servlet.ServletResponse;
  31. import javax.servlet.http.HttpServlet;
  32. import java.io.IOException;
  33. public class DemoServlet extends HttpServlet {
  34. private static final long serialVersionUID = 2206792018849975111L;
  35. @Override
  36. public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
  37. System.out.println("进来了");
  38. }
  39. }
  40. * <servlet>
  41. <servlet-name>demoServlet</servlet-name>
  42. <servlet-class>com.fxyh.springmvc.servlet.DemoServlet</servlet-class>
  43. </servlet>
  44. * <bean id="servletForwardingController" name="/servlet.action" class="org.springframework.web.servlet.mvc.ServletForwardingController">
  45. <property name="servletName" value="demoServlet"/>
  46. </bean>
  47. * 这里在web.xml中配置的servlet可以不配置servlet-mapping,这里请求servlet.action就会转发到DemoServlet

发表评论

表情:
评论列表 (有 0 条评论,345人围观)

还没有评论,来说两句吧...

相关阅读

    相关 简单了解Spring MVC

    Spring MVC从一开始就定位于一个较为松散的组合,展示给用户的视图(View)、控制器返回的数据模型(Model)、定位视图的视图解析器(ViewResolver)和处理

    相关 spring MVC入门

    2.1、Spring Web MVC是什么 Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架