SpringMVC入门

SpringMVC入门

SpringMVC基础

主要内容

  1. 理解springmvc的工作流程
  2. 使用注解搭建springmvc
  3. 使用注解搭建springmvc

内容详解

复习之前的servlet写法

public class DemoServlet extends HttpServlet {
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("method in");
//        req.getParameter("");
        req.setAttribute("a","bb");
        resp.getWriter().write("hello qy105");
//        req.getRequestDispatcher("/login.jsp").forward(req,resp);
    }
}

回顾:

  1. ​ MVC模式:控制层负责前台与后台的交互,数据模型层封装用户的输入/输出数据,视图层选择恰当的试图来显示最终的执行结果,这样层次分明的软件开发和处理流程被称为MVC模式。而目前使用比较广泛的MVC框架就是SpringMVC框架。
  2. servlet的处理流程,搭建一个之前的web项目,web.xml 配置实现
  3. 配置tomcat先跑一下,测试环境是否正常,先回忆之前的web.xml 配置,先给大家解释清楚2个顺序,web.xml中的加载顺序和执行顺序。回忆之前的web项目,复习tomcat启动的流程以及web.xml加载的顺序:
    • 1,启动一个WEB项目的时候,web容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点:
    • 2.紧接着,容器创建一个ServletContext(上下文),当前这个WEB项目所有部分都将共享这个上下文.
    • 3.容器将转化为键值对,并交给ServletContext.
    • 4.容器创建中的类实例,即创建监听.
    • 5.在监听中会有contextInitialized(ServletContextEvent args)初始化方法,在这个方法中获得ServletContext = ServletContextEvent.getServletContext();

SpringMVC介绍

SpringMVC简介

​ springmvc也称spring web mvc 是基于MVC架构的轻量级web层框架,其目的是将Web开发模块化,对整体架构进行解耦,简化Web开发流程。是spring体系的一个模块。它与Struts2框架一样,都属于MVC框架,但其使用和性能等方面比Struts2更加优异。SpringMVC是对之前Servlet原生代码进行了封装

SringMVC特点

  • 是Spring框架的一部分,可以方便的利用Spring所提供的其他功能,比如依赖注入DI和切面编程AOP。
  • 灵活性强,易于与其他框架集成。
  • 提供了一个前端控制器DispatcherServlet,使开发人员无需额外开发控制器对象。
  • 可自动绑定用户输入,并能正确的转换数据类型。
  • 内置了常见的校验器,可以校验用户输入。如果校验不能通过,那么就会重定向到输入表单。
  • 支持国际化。可以根据用户区域显示多国语言。
  • 支持多种视图技术。它支持JSP、Velocity和FreeMarker等视图技术。
  • 使用基于XML的配置文件,在编辑后,不需要重新编译应用程序。
  • 支持RESTful风格

SpringMVC工作流程图解析

1.用户通过浏览器向服务器发送请求,请求会被Spring MVC的前端控制器DispatcherServlet所拦截;
2.DispatcherServlet拦截到请求后,会调用HandlerMapping处理器映射器;
3.处理器映射器根据请求URL找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet;

4.DispatcherServlet会通过返回信息选择合适的HandlerAdapter(处理器适配器);
5.HandlerAdapter会调用并执行Handler(处理器),这里的处理器指的就是程序中编写的Controller类,也被称之为后端控制器;

6.Controller执行完成后,会返回一个ModelAndView对象,该对象中会包含视图名或包含模型和视图名;

7.HandlerAdapter将ModelAndView对象返回给DispatcherServlet;
8.DispatcherServlet会根据ModelAndView对象选择一个合适的ViewReslover(视图解析器);

9.ViewReslover解析后,会向DispatcherServlet中返回具体的View(视图);

10.DispatcherServlet对View进行渲染(即将模型数据填充至视图中);

11.视图渲染结果会返回给客户端浏览器显示。

Spring为什么要结合使用HandlerMapping以及HandlerAdapter来处理Handler?

​ 符合面向对象中的单一职责原则,代码架构清晰,便于维护,最重要的是代码可复用性高。如HandlerAdapter可能会被用于处理多种Handler。

搭建SpringMVC项目

业务描述:用户输入账号密码之后,点击登录 返回相应的页面

使用的注解搭建SpringMVC项目

  1. 在pom中添加依赖

      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.11</maven.compiler.source>
        <maven.compiler.target>1.11</maven.compiler.target>
        <spring.version>5.2.0.RELEASE</spring.version>
      </properties>
    
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>${spring.version}</version>
        </dependency>
    
  2. 新建一个web项目,修改项目目录结构,添加controller包,jsp的包,你只需要写handler的代码和页面的代码

  3. 配置web.xml,需要加载spring配置文件和springmvc的配置文件,tomcat容器启动之后加载web.xml文件然后去加载spring的配置文件创建spring容器

    ​ 继续添加配置,由上面的流程图可以知道所有请求都交给DispatcherServlet进行处理,那么现在需要编辑web.xml配置springMVC的前端控制器DispatcherServlet.

    <!--配置的是前端控制器-->
        <servlet>
            <servlet-name>dispatcher</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>WEB-INF/spring*.xml</param-value>
            </init-param>
            <!--表示容器启动就加载该servlet-->
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>dispatcher</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    
  4. 新添加spring配置文件,创建的时候选择spring config,直接由有模板,目前这个文件中不写东西

    <!--开启自动包扫描,controller是在web层配置的-->
        <context:component-scan base-package=""></context:component-scan>
    
  5. springmvc配置文件,此配置文件你也可以什么都不配置,那就会去加载默认的文件,使用默认的配置

      <!--    扫描web层的包-->
        <context:component-scan base-package="com.aaa.controller"></context:component-scan>
    <!--   还需要配置处理器映射器,处理器适配器,开启这个注解相当于下面的两行配置,一般使用第一个-->
        <mvc:annotation-driven></mvc:annotation-driven>
        <!--<bean id="handlerMapping" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
        <bean id="handlerAdapter" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>-->
    
        <!--开始配置视图解析器-->
        <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!--配置前缀,jsp页面全部放在WEB-INFO下,因为用户无法访问,所以安全-->
            <property name="prefix" value="/WEB-INF/jsp/"></property>
    <!--        配置后缀-->
            <property name="suffix" value=".jsp"></property>
        </bean>
    
  6. 编辑登录页面

    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <form action="userLogin" method="post">
        用户名: <input type="text" name="username"></br></br>
    
        密码: <input type="password" name="password"><br>
        <button type="submit">登录</button>
    </form>
    </body>
    </html>
    
  7. 编写controller代码,也就是Handler处理器

    /**
     *编写的是userController
     * @Controller表明该类是一个Handler类,可以被处理器适配器找到
     */
    @Controller
    public class UserController  {
        @RequestMapping(value = "/login")
        public ModelAndView  test() {
            System.out.println("handler method in");
            ModelAndView modelAndView = new ModelAndView();
            modelAndView.setViewName("index");
            return modelAndView;
        }
    }
    
  8. 结合流程图,再次熟悉springmvc的流程(分析源码),讲解xml加载过程,容器的启动和加载过程

  9. springmvc常用注解讲解

    • @Controller

      org.springframework.stereotype.Controller注解类型用于指示Spring类的实例是一个控制器,其注解形式为@Controller。该注解在使用时不需要再实现Controller接口,只需要将@Controller注解加入到控制器类上,然后通过Spring的扫描机制找到标注了该注解的控制器即可。

    • @RequestMapping注解类型

      Spring通过@Controller注解找到相应的控制器类后,还需要知道控制器内部对每一个请求是如何处理的,这就需要使用@RequestMapping注解类型,它用于映射一个请求或一个方法。使用时,可以标注在一个方法或一个类上。

      1. 标注在类上

      2. 标注在方法上

      3. @RequestMapping注解除了可以指定value属性外,还可以指定其他一些属性,如下表所示。

      作用在方法上的注解,在spring4.3的版本中增加了以下注解

      @GetMapping:匹配GET方式的请求;
      @PostMapping:匹配POST方式的请求;
      @PutMapping:匹配PUT方式的请求;
      @DeleteMapping:匹配DELETE方式的请求;
      @PatchMapping:匹配PATCH方式的请求。

4.2.2 使用Java配置搭建springmvc

新建一个项目,把上述xml文件全部改为Java类来代替,

  1. 把springmvcConfig.xml改为SpringMvcConfig.java

    @Configuration
    @ComponentScan(basePackages = {"com.aaa.controller"})
    @EnableWebMvc
    public class SpringMvcConfig {
        @Bean
        public InternalResourceViewResolver getInternalResourceViewResolver() {
            InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
            internalResourceViewResolver.setPrefix("/WEB-INF/jsp/");
            internalResourceViewResolver.setSuffix(".jsp");
            return internalResourceViewResolver;
        }
    }
    
  2. 把web.xml改为WebApplication

public class WebApplication implements WebApplicationInitializer {
    /**
     * Tomcat在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用
     * @param servletContext 代表的是当前的web应用
     * @throws ServletException
     */
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        System.out.println("启动啦");
        /*加载的是spring的配置类和springmvc的配置类*/
        AnnotationConfigWebApplicationContext app = new AnnotationConfigWebApplicationContext();
        app.register(SpringConfig.class);
        app.register(SpringMvcConfig.class);


        DispatcherServlet dispatcherServlet = new DispatcherServlet(app);
        ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", dispatcherServlet);

        dispatcher.addMapping("/");
//        设置启动优先级
        dispatcher.setLoadOnStartup(1);

    }
}

其余代码不变,以后全部使用Java配置的方式

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://championmi.cn/archives/springmvc入门

Buy me a cup of coffee ☕.