SpringMVC学习笔记-02搭建SpringMVC

Posted Moon&&Dragon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC学习笔记-02搭建SpringMVC相关的知识,希望对你有一定的参考价值。

3 搭建SpringMVC

3.1 前提要求

因为我们使用的是Spring5.x版本,所以有以下的要求:

  • JDK:最低为JDK8+
  • J2EE7:建议Servlet3.1+,Tomcat8.5+

3.2 创建项目

导入SpringMVC依赖

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

将普通的maven项目转化为web项目

方式一:

  • 在idea的file中点击ProjectStructure中,点击左侧的facets来配置,因为我们一般约定web应用的路径为src/main/webapp下,但是创建的默认web脸面是在项目目录下直接创建了一个web文件夹。

在这里插入图片描述

  • 修改路径

在这里插入图片描述

  • 添加依赖到Artifacts

在这里插入图片描述

  • 配置tomcat

方式二:

  • src/main/创建webapp文件夹

  • 在maven配置下配置war包打包方式

    <packaging>war</packaging>
    
  • 这时候webapp文件夹就变成了web应用图标,但是里面没有web.xml配置文件

  • 我们可以选择自己去创建,也可以想方式一在Project Structure中进行创建

  • maven已经帮我们吧war包打包好了,我们就不需要去配置依赖

  • 配置tomcat

3.3 配置Spring配置文件

3.3.1 基于XML配置文件

这里的Spring配置文件和之前在学习Spring时的配置文件基本一致,不同的是我们需要对mvc进行支持

静态资源处理:

方式说明
<mvc:default-servlet-handler/>开启资源的检查,如果发现是静态文件则不使用DispatcherServlet而是使用默认的Servlet去处理静态文件
<mvc:resources />开启资源的检查,但是发现是静态资源后不使用默认的Servlet去处理,而是SpringMVC框架自己去处理了,而且,该配置支持静态资源在任何地方存在,打破了传统Web容器静态资源只能放在容器根目录下
<?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
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--开启Spring的注解扫描-->
    <context:component-scan base-package="com.moon"/>
    <!--
        注意:需要先导入mvc的约束xsd
        配置mvc开启注解支持,其实默认的就是使用的支持注解的组件
				其中还包含了俩个组件:HandlerMapping和HandlerAdaper
    -->
    <mvc:annotation-driven/>
    <!--开启资源检查,如果是静态资源,会使用默认servlet处理-->
    <mvc:default-servlet-handler/>
  
  	<!--
			将web目录下的myResource映射为resource
			<mvc:resources location="/,classpath:/META-INF/myResources/" mapping="/resources/**"/>
		-->

    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/jsp/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

3.3.2 基于Java配置文件

基于Java配置文件也是也之前学习的Spring的Java配置文件一样

// Spring配置文件
@Configuration
// 启动SpringMVC
@EnableWebMvc
// 开启包扫描
@ComponentScan(basePackages = "com.moon.controller")
public class SpringConfig implements WebMvcConfigurer {

   /**
     * 配置静态资源
     *
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**")
                .addResourceLocations("classpath:resource");
    }
  
    /**
     * 配置视图解析器
     *
     * @return 视图解析器
     */
    @Bean
    public InternalResourceViewResolver viewResolver() {
        // 使用Spring默认提供的
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        // 设置前缀
        viewResolver.setPrefix("/jsp/");
        // 设置后缀
        viewResolver.setSuffix(".jsp");
        // 返回bean
        return viewResolver;
    }
}

3.4 配置web.xml

3.4.1 基于XML配置

因为SpringMVC的底层其实就是Servlet,所以在web.xml我们需要吧SpringMVC所依赖的servlet配置好,其实就是DispatcherServlet

配置Servlet:

  • <servlet-name>:这里配置就是我们自己给springMVC的servlet的命名,可以随意起,但是mapping要和该名字对应。

  • <servlet-class>:配置SpringMVC调度器的class,就是DispatcherServlet,它在org.springframework.web.servlet包下。

  • <init-param>:初始化配置,配置Spring容器的配置文件

    这里有xml配置和java文件配置俩种方式,下面通过xml文件来配置

  • <load-on-startup>:启动级别,数字越小,则级别越高

配置mapping:

  • mapping中的servlet的名字要和上面的servlet的名字一致
  • <url-pattern>:配置拦截的请求,我们这里一般使用/就可以,拦截全部请求。如果是/*的话会把jsp拦截
<?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-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <!--springMVC调度servlet-->
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--初始化spring的配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <!--启动级别,在tomcat启动就初始化,数字越小,级别越高-->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!--DispatcherServletMapping-->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!--/表示拦截请求-->
        <!--/*可以拦截jsp-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

3.4.2 基于Java类配置

上面的配置方法是针对一个xml的Spring配置文件进行配置,如果Spring的配置文件我们选择使用Java类的话也是可以的,其中就又有俩种配置方式,一种就是在web.xml注册配置DispatcherServlet,还有一种可以直接通过继承Spring提供的抽象类进行配置。这里先使用web.xml的方式

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">

    <!--DispatcherServlet-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <!--springMVC调度servlet-->
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      
        <!--配置开启注解支持-->
        <init-param>
            <param-name>contextClass</param-name>
            <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
        </init-param>
        <!--配置Spring的java类配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>com.moon.SpringConfig</param-value>
        </init-param>
      
        <!--启动级别,在tomcat启动就初始化,数字越小,级别越高-->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!--DispatcherServletMapping-->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!--/表示拦截请求-->
        <!--/*可以拦截jsp-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

3.4 继承抽象类配置

SpringMVC中也为我们提供了抽象类来实现配置,不需要依赖web.xml文件

3.4.1 准备配置类

SpringMVC的配置类可以实现WebMvcConfigurer接口,这时我们可以选择里面的方法进行重写。我们也可以去选择继承WebMvcConfigurerAdapter类,不过该方法在Spring5以后已经被废弃。替代的方法是去继承WebMvcConfigurationSupport这个类,但是该方法会影响到Spring本身的@EnableAutoConfiguration,所以官方不推荐该方式,会出现新的问题,比如比如访问不到静态资源,所以我们需要对继承的每个方法重写。

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.moon.controller")
public class SpringMvcConfig implements WebMvcConfigurer {

    /**
     * 配置静态资源
     *
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**")
                .addResourceLocations("classpath:resource");
    }

    /**
     * 配置视图解析器
     *
     * @return 视图解析器
     */
    @Bean
    public InternalResourceViewResolver viewResolver() {
        // 使用Spring默认提供的
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        // 设置前缀
        viewResolver.setPrefix("/jsp/");
        // 设置后缀
        viewResolver.setSuffix(".jsp");
        // 返回bean
        return viewResolver;
    }
}

如果这里需要配置Spring的配置文件的话,可以使用java类,把控制层和mvc的配置不扫描即可

@Configuration
@ComponentScan(value = "com.moon",
        excludeFilters = {@ComponentScan.Filter(
                type = FilterType.ANNOTATION,
                value = {Controller.class, EnableWebMvc.class})})
public class ApplicationContextConfig {...}

3.4.2 继承SpringMVC抽象类

这里我们需要继承Spring为我们抽象类AbstractAnnotationConfigDispatcherServletInitializer,实现类里面的三个方法

方法说明
getRootConfigClasses()用来配置根配置,就是我们之前的applicationContext,如果没有可以返回null,也可以和mac的配置写一起,也可以通过web.xml来配置
getServletConfigClasses()用来配置SpringMVC,返回我们的Java配置文件
getServletMappings()用于指定映射地址
/**
 * 继承Spring的AbstractAnnotationConfigDispatcherServletInitializer抽象类
 */
public class ApplicationInitialize extends AbstractAnnotationConfigDispatcherServletInitializer {
    /**
     * 这里的Spring配置文件没有设置,和MVC的配置文件现在了一起,所以返回null
     * @return null
     */
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return null;
    }

    /**
     * 返回我们书写的SpringMVC配置类
     * @return 配置类
     */
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[]{SpringMvcConfig.class};
    }

    /**
     * 返回url的请求映射
     * @return 映射
     */
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

3.5 书写Controller

不管是上面哪一种方式,都可以实现对SpringMVC的配置,当配置好了,写个Controller来测试一下

@Controller
public class FirstController {
    /**
     * 访问地址默认为index
     * @return 返回viewName
     */
    @RequestMapping("/")
    public String test(){
        return "index";
    }

    /**
     * 访问地址/hello
     * @return 携带参数的ModelAndView对象
     */
    @RequestMapping("/hello")
    public ModelAndView test2(){
        // 实例ModelAndView对象
        ModelAndView modelAndView = new ModelAndView();
        // 绑定参数
        modelAndView.addObject("message","Hello SpringMVC!");
        // 设置页面
        modelAndView.setViewName("index");
        // 返回ModelAndView对象
        return modelAndView;
    }
}

对应的index.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>Hello!</h1>
${message}
</body>
</html>

3.6 测试项目

访问http://localhost:8080

在这里插入图片描述

访问http://localhost:8080/hello

在这里插入图片描述

当访问/hello时,可以拿到我们绑定的值,项目搭建成功

以上是关于SpringMVC学习笔记-02搭建SpringMVC的主要内容,如果未能解决你的问题,请参考以下文章

学习笔记——SpringMVC简介;SpringMVC处理请求原理简图;SpringMVC搭建框架

Spring MVC 学习笔记 --- [初步接触SpringMVC,上手搭建一个案例出来]

springmvc学习总结 -- maven+springmvc+spring+mybatis+mysql详细搭建整合过程讲解

springmvc+mybatis学习笔记(汇总)

Spring MVC 学习笔记 --- [SpringMVC的文件上传与拦截器,以及更新登录用户头像的简易案例]

ssm框架搭建-maven