zoukankan      html  css  js  c++  java
  • Spring学习之旅(六)--SpringMVC集成

    对大多数 Java 开发来说,基于 web 的应用程序是我们主要的关注点。 Spring 也提供了对于 web 的支持,基于 MVC 模式的 Spring MVC 能够帮助我们灵活和松耦合的完成 web 应用程序。

    Spring MVC 处理流程

    • 第一步:发起请求到前端控制器(DispatcherServlet)

    • 第二步:前端控制器请求HandlerMapping查找 Handler(可以根据xml配置、注解进行查找)

    • 第三步:处理器映射器HandlerMapping向前端控制器返回Handler

    • 第四步:前端控制器调用处理器适配器(Controller,也叫后端控制器)去执行 Handler

    • 第五步:处理器适配器去执行Handler

    • 第六步:Handler 执行完成给适配器返回ModelAndView (ModelAndView是springmvc框架的一个底层对象,包括Model和view)

    • 第七步:处理器适配器向前端控制器返回ModelAndView

    • 第八步:前端控制器请求视图解析器去进行视图解析 (根据逻辑视图名解析成真正的视图(jsp))

    • 第九步:视图解析器向前端控制器返回View

    • 第十步:前端控制器进行视图渲染( 视图渲染将模型数据(在ModelAndView对象中)填充到request域)

    • 第十一步:前端控制器向用户响应结果


    组件说明

    组件名称 作用 是否需要开发者实现
    前端控制器 DispatcherServlet 接收请求,响应结果,相当于转发器,中央处理器。
    处理器映射器 HandlerMapping 根据请求的 url 查找 Handler
    处理器适配器 HandlerAdapter 按照特定规则(HandlerAdapter 要求的规则)去执行 Handler
    处理器 Handler 按 HandlerAdapter 规范编写的处理器,具体的业务逻辑实现
    视图解析器 View resolver 进行视图解析,根据逻辑视图名解析成真正的视图(view)
    视图View View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf…)

    集成 SpringMVC

    集成 SpringMVC 的第一步就是先将依赖导入进项目中来。

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

    配置 DispatcherServlet 组件有两种方式:

    • 配置在 web.xml 文件中
    • 通过 Java 类 的形式配置到 Servlet 容器中

    注:Java 类 方式需要 tomcat 支持 Servlet3 规范,否则只能采用 web.xml 方式。


    Java 形式

    1.配置 DispatcherServlet

    public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    
        protected String[] getServletMappings() {
            return new String[]{"/"};
        }
    
        protected Class<?>[] getRootConfigClasses() {
            return new Class[]{ApplicationConfig.class};
        }
    
        protected Class<?>[] getServletConfigClasses() {
            return new Class[]{WebConfig.class};
        }
    
    }
    

    2.配置 WebConfig

    @Configuration
    @EnableWebMvc
    @ComponentScan("com.marklogzhu.web")
    public class WebConfig extends WebMvcConfigurerAdapter {
    
        @Bean
        public ViewResolver viewResolver(){
            InternalResourceViewResolver  resolver = new InternalResourceViewResolver();
            // 设置页面文件前缀
            resolver.setPrefix("/WEB-INF/views/");
            // 设置页面文件后缀
            resolver.setSuffix(".jsp");
            // 设置页面允许访问上下文属性
            resolver.setExposeContextBeansAsAttributes(Boolean.TRUE);
            return resolver;
        }
    
        /**
         * 默认静态资源处理器
         * @param configurer
         */
        @Override
        public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
            configurer.enable();
        }
    }
    

    3.配置 RootConfig

    @Configuration
    @ComponentScan(basePackages = {"com.marklogzhu"},
            // 排除已包含 EnableWebMvc 注解的配置
            excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.class)}
    )
    public class RootConfig {
    
    
    }
    

    新建 Controller 并测试

    1. 新建 HomeController

    @Controller
    public class HomeController {
        
        @RequestMapping(value = "/",method = RequestMethod.GET)
        public String home(){
            return "home";
        }
    
    }
    

    2. 新建 /WEB-INF/views/home.jsp 页面

    <html>
        <head></head>
        <body>
            <h1>home html</h1>
        </body>
    </html>
    

    3. 新建单元测试类

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = ApplicationConfig.class)
    public class HomeControllerTest {
    
        @Test
        public void testHomePage() throws Exception {
            MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new HomeController()).build();
            // 对 "/" 发起 GET 请求
            mockMvc.perform(MockMvcRequestBuilders.get("/"))
                    // 预期得到 home 视图
                    .andExpect(MockMvcResultMatchers.view().name("home"));
        }
    
    }
    

    注解说明:

    • @Controller:@Component注解一样,它的作用只是辅助实现组件扫描。
    • @RequestMapping: 用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径,如果类上没有映射,那么 url 直接就是方法的映射。详情查看 SpringMVC学习总结(二)--RequestMapping注解

    web.xml 引用 Java 形式

    注意:要先注释掉 WebAppInitializer

    新建 WEB-INI/web.xml 文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
            "http://java.sun.com/dtd/web-app_2_3.dtd">
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
             xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
             version="2.5">
    
        <!-- 使用 Java 配置 -->
        <context-param>
            <param-name>contextClass</param-name>
            <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
        </context-param>
    
        <!-- 指定根配置类 -->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>com.marklogzhu.RootConfig</param-value>
        </context-param>
    
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
    
        <servlet>
            <servlet-name>appServlet</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!-- 使用 Java 配置 -->
            <init-param>
                <param-name>contextClass</param-name>
                <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
            </init-param>
            <!-- 指定 DispatcherServlet 配置类 -->
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>com.marklogzhu.config.WebConfig</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>appServlet</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    </web-app>
    

    web.xml 引用 xml 形式

    注意:要先注释掉 RootConfigWebConfig

    1.新建 WEB-INI/web.xml 文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
            "http://java.sun.com/dtd/web-app_2_3.dtd">
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
             xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
             version="2.5">
    
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>WEB-INF/spring/root-context.xml</param-value>
        </context-param>
    
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
    
        <servlet>
            <servlet-name>appServlet</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>WEB-INF/spring/root-context.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>appServlet</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    </web-app>
    

    2.新建 WEB-INI/spring/root-context.xml 文件

    <?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:aop="http://www.springframework.org/schema/aop"
           xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
           xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:mvc="http://www.springframework.org/schema/mvc"
           xmlns:util="http://www.springframework.org/schema/util"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
                         http://www.springframework.org/schema/beans/spring-beans.xsd
                         http://www.springframework.org/schema/tx
                         http://www.springframework.org/schema/tx/spring-tx.xsd
                         http://www.springframework.org/schema/context
                         http://www.springframework.org/schema/context/spring-context.xsd
                         http://www.springframework.org/schema/aop
                         http://www.springframework.org/schema/aop/spring-aop.xsd
                         http://www.springframework.org/schema/jdbc
                         http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
                         http://www.springframework.org/schema/util
                         http://www.springframework.org/schema/util/spring-util-3.2.xsd
                         http://www.springframework.org/schema/mvc
                         http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
        <!--开启注解功能,如果不设置也会添加默认的实现类,但是该实现类已过时 -->
        <mvc:annotation-driven/>
        <!-- 配置Controller -->
        <context:component-scan base-package="com.marklogzhu"/>
    
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/views/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
    
    
    </beans>
    
  • 相关阅读:
    win10+PHP 安装memcache
    win10+PHP 安装redis
    一个github搞定微信小程序支付系列
    Linux下新建一个站点
    Linux下更改mysql版本
    零基础配置Linux服务器环境
    手把手教你使用ueditor
    react学习三
    react学习二 生命周期
    window.location.replace和window.location.href区别
  • 原文地址:https://www.cnblogs.com/markLogZhu/p/11400405.html
Copyright © 2011-2022 走看看