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详细搭建整合过程讲解