SpringMVC学习
一、SpringMVC概述
- SpringMVC是基于Java实现了MVC模型的轻量级Web框架。
二、SpringMVC开发
2.1、基于配置开发
2.1.1、相关依赖导入
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.itheima</groupId>
<artifactId>SpringMVC01</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<!--servlet 3.1规范-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--jsp坐标-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<!--spring坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<!--springWeb坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<!--spring-mvc坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<!--lombok相关依赖(需要下载相关的插件)-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.6</version>
</dependency>
<!--json相关坐标3个-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<target>1.8</target>
<source>1.8</source>
<encoding>utf-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>80</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
2.1.2、核心配置文件
1、在resources中定义spring-mvc.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: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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
// Controller 处理之后的结果会被拼接这个地址,转发到对应JSP文件总展示
<!-- 视图分解解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 这是前缀 -->
<property name="prefix" value="/"></property>
<!-- 这是后缀 -->
<property name="suffix" value=".jsp"></property>
<!-- 在spring的控制器中,返回的是一个字符串,那么请求的路径则是,前缀+返回字符串+后缀 -->
</bean>
// “ /test ”是前端拼接的地址,对应的请求会被 class 对应的 Controller 处理
<bean name="/test" class="com.itheima.controller.TestController"></bean>
</beans>
2、在WEB-INFO文件的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">
<servlet>
<!--服务器已启动就会加载dispatcherServlet-->
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--服务器启启动之后,就会读取spring-mvc.xml中配置,加载"xx"路径下的所有标记为bean的类-->
<!-- 配置DispatcherServlet的一个初始化参数:配置SpringMVC配置文件位置和名称,这个也可以不配置,如果不配置,则默认是WEB-INFO下的springMVC-servlet.xml -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationcontent.xml</param-value>
</init-param>
<!--在服务器创建时自动创建-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
1、springmvc配置拦截的三种方式
- " / ": 拦截所有请求但是不包括JSP页面,但是会拦截静态页面如:img、js、css
- " /* " : 拦截所有请求包括JSP页面
- “ *.do ” : 所以以“ .do ”结尾的前端请求都会被拦截
2.1.3、定义一个类作为控制器
1、方式一:实现“ Controller “ 接口,重写里面方法。
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 TestController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndViw mv = new ModelAndView();
// 设置访问jsp文件的地址
mv.setViewNew("/hello.jsp");
// 设置需要返回的信息
mv.addObject("msg","welcome to springmvc");
return mv;
}
}
2、方式二:实现” HttpRequestHandler “ 接口,重写里面的方法。
public class TestController implements HttpRequestHandler
public void handleRequest(HttpServlertRequest request,HttpServlertResponse response) throws ServletException,IOException{
System.out.println("welcome to springmvc");
}
注:需要把创建对应的Controller 在 spring-mvc.xml文件中注册成Bean,交给Spring容器进行管理。
2.2、基于注解开发
2.2.1、相关依赖导入
- 和基于配置文件开发导入的依赖一致
2.2.2、核心配置文件
1、在resources中定义spring-mvc.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: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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 定义扫描的包 -->
<context:component-scan base-package="被扫描包的全路径类名"/>
<!--开启SpringMVC注解驱动-->
<mvc:annotation-driven conversion-service="conversionService"/>
// Controller 处理之后的结果会被拼接这个地址,转发到对应JSP文件总展示
<!-- 视图分解解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 这是前缀 -->
<property name="prefix" value="/"></property>
<!-- 这是后缀 -->
<property name="suffix" value=".jsp"></property>
<!-- 在spring的控制器中,返回的是一个字符串,那么请求的路径则是,前缀+返回字符串+后缀 -->
</bean>
</beans>
2、在WEB-INFO文件的web.xml文件中定义相关配置
- 和基于配置文件开发进行的配置文件一致。
2.2.3、定义一个类作为控制器
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @Controller是控制器的注解
*/
@Controller
@RequestMapping("/test")
public class UserController {
@RequestMapping("/save")
public String save() {
System.out.println("save is run .....");
return "/success.jsp";
}
@RequestMapping("/requestParam")
public String requestParam(String name){
System.out.println(name);
return "/success.jsp";
}
}
注:@RequestMapping("/test")这里的“ /test ”,作为父类的路径,前端请求的url地址为:http://localhost:8080/test/save,类里面的每个方法请求的都会加上这个前缀,其也可以不进行配置。如果不配置前端的访问地址为:http://localhost:8080/save。
2.3、基于java代码开发
2.3.1、相关依赖导入
- 和基于配置文件开发导入的依赖一致
2.3.2、配置类的创建
1、定义配置类代替“ 在resources中定义spring-mvc.xml文件 ”。
@Configuration
@ComponentScan("com.itheima.controller") // 指定包扫描的位置
@EnableWebMvc //mvc的注解驱动
public class SpringMVCConfig implements WebMvcConfigurer {
// 注解配置放行指定资源格式
/* public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/img/**").addResourceLocations("/img/");
registry.addResourceHandler("/js/**").addResourceLocations("/js/");
registry.addResourceHandler("/css/**").addResourceLocations("/css/");
}*/
/**
* 放行静态资源文件 (一般配置这种方式就可以)
* @param configurer
*/
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
==**注意:**==替代Spring-mvc.xml文件,必须实现WebMvcConfigurer接口。
==**注意:**==之前spring-mvc.xml文件是在web.xml中读取的,我们知道,服务器启动时,会自动解析web.xml;那么当我们采用纯注解配置时,如何自动去解析该配置类呢。这里我们会用到之前咱们提到的spi机制。
2、定义配置类代替“ 在WEB-INFO文件的web.xml文件 ”
package com.itheima.config;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
import javax.servlet.Filter;
// 该类中onStartup方法会在服务器启动时自动执行
public class WebConfig extends AbstractDispatcherServletInitializer {
// 配置Springmvc容器,加载web层bean
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext acwc = new AnnotationConfigWebApplicationContext();
acwc.register(SpringMVCConfig.class);
return acwc;
}
// 配置DispatcherServlet的访问路径
protected String[] getServletMappings() {
return new String[]{"/"};
}
// 配置Spring容器,加载service层和dao层bean
protected WebApplicationContext createRootApplicationContext() {
AnnotationConfigWebApplicationContext acwc = new AnnotationConfigWebApplicationContext();
acwc.register(SpringConfig.class);
return acwc;
}
// 添加Post请求参数乱码过滤器
protected Filter[] getServletFilter(){
CharacterEncodingFilter cef = new CharacterEncodingFilter();
cef.setEncoding("utf-8");
cef.setForceEncoding(true);
return new Filter[]{cef};
}
}
2.3.2、定义一个类作为控制器
- 和基于注解开发定义的“ Controller ”一致。
三、SpringMVC请求
3.1、请求地址获取
1、@RequestMapping 获取请求url:
- 注解用于获取请求的url地址,其可以加在类上和方法上。加上类有作为父路径的作用,所以类中的方法的请求地址都会拼接类上的路径。
2、@RequestMapping 设置请求方式:
- @RequestMapping(value="/testMethod",method=RequestMethod.POST),其中" method "就是用于指定请求方式。