Spring MVC是Spring体系的轻量级Web MVC 框架. Spring MVC的核心Controller控制器,用于处理请求,产生响应. Spring MVC基于Spring IOC容器运行,所有对象被IOC管理
Spring MVC 官方网址: https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html
Spring 5.x 的版本变化,之前的文章都是根据spring 4.x的版本来开发的
- Spring 5.x最低要求JDK8与J2EE7(Servlet3.1/Tomcat8.5+)
- Spring 5.x支持JDK8/9 可以使用新特性
- Spring 5.x最重要的新特性支持响应式编程
Spring MVC环境配置
创建一个新的项目,进入product
得到如下界面,Type:选择Web Application : Exploded
创建完项目之后,在pom.xml中添加spring-webmvc 依赖
- Maven依赖spring-webmvc
- web.xml配置DispatcherServlet
- 配置applicationContext的mvc标记
- 开发Controller控制器
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
</dependencies>
配置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">
<!-- DispatchServlet 对所有请求进行拦截
DispatcherServlet是Spring MVC最核心对对象
DispatcherServlet用于拦截http请求
并根据请求对URL调用与之对应的Controller方法,来完成http请求处理
-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置加载哪个applicatoinContext.xml -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
<!-- 在web应用启动时自动创建Spring IOC容器 并初始化DispatcherServlet -->
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- 拦截所有请求 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
配置applicationContext.xml
<!--
在Spring ioc 初始化过程中,自动创建管理com.prim.springmvc及自包中拥有一下注解的对象
@Repository
@Service
@Controller
@Component
-->
<context:component-scan base-package="com.prim.springmvc"/>
<!-- 启动Spring MVC注解开发模式 conversion-service 一旦遇到date类型就会根据配置的转换 -->
<mvc:annotation-driven conversion-service="conversionService">
<!-- 设置消息的转换器 -->
<mvc:message-converters>
<!-- 对于http响应的消息文本转换 -->
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<!-- 原始的写法: response.setContextType() -->
<value>text/html;charset=utf-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!-- 将图片js/css等静态资源排除在外 不通过DispatcherServlet处理 提高执行效率 -->
<mvc:default-servlet-handler/>
<!-- 通知Spring MVC 有哪些自定义的时间格式转换类 -->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.prim.springmvc.converter.DateConverter"/>
</set>
</property>
</bean>
Spring MVC 数据绑定
如何进行数据绑定,controller 控制器的方法如何和URL绑定在一起的呢? 通过注解@GetMapping
- URL Mapping 🈯️将URL与Controller方法绑定
- 通过将URL与方法绑定,SpringMVC便可通过Tomcat对外暴露服务
- @RequestMapping 通用绑定
- @GetMapping 绑定Get请求
- @PostMapping 绑定post请求
接受请求参数
- 使用Controller方法参数接收
- 使用Java Bean接受数据
- 复合数据的获取
利用数组或者list接受请求中的复合数据 利用@RequestParam作为参数设置默认值 使用Map对象接受请求参数及注意事项
URI绝对路径与相对路径
/project
/js
/jquery.js
/index.js
/index.html
中文乱码
tomcat默认使用字符集ISO-8859-1,解决乱码将ISO-8859-1转换为UTF-8
controller中请求与响应都要设置utf-8字符集
解决方案:
Get请求乱码 - server.xml增加URIEncoding属性
URIEncoding=”UTF-8” tomcat 8.0之后版本默认是utf-8
8.0之前版本需要添加 URIEncoding=”UTF-8”<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
Post请求乱码 - web.xml配置CharacterEncodingFilter
<!-- 配置post请求中文乱码过滤 -->
<filter>
<filter-name>characterFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- Response响应乱码 - Spring配置StringHttpMessageConverter
<!-- 启动Spring MVC注解开发模式 conversion-service 一旦遇到date类型就会根据配置的转换 -->
<mvc:annotation-driven conversion-service="conversionService">
<!-- 设置消息的转换器 -->
<mvc:message-converters>
<!-- 对于http响应的消息文本转换 -->
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<!-- 原始的写法: response.setContextType() -->
<value>text/html;charset=utf-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
响应输出结果
@ResponseBody - 产生响应文本
ResponseBody 直接产生响应体的数据,不涉及任何视图 ResponseBody 可产生标准字符串/JSON/XML等格式数据 ResponseBody 被StringHttpMessageConverter所影响
ModelAndView - 利用模版引擎渲染输出
ModelAndView指“模型与视图”对象
通过ModelAndView可将包含数据对象与模版引擎进行绑定
SpringMVC中默认的View是JSP,也可以配置其他模版引擎.
- mav.addObject()方法设置的属性默认存放在当前请求中
- 默认ModeAndView 使用请求转发(forward)至页面
- 重定向使用new ModelAndView(“redirect:/index.jsp”)
Spring MVC 整合Freemarker
加入依赖后,必须将jar包添加到 WEB-INF/lib中,否则就会报错 找不到类的错误.
<!-- 整合freemarker模版引擎 -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
freemarker 配置
<!-- freemarker 配置 -->
<!-- 开启freemarker -->
<bean id="ViewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<!-- 产生结果以后 输出文本向客户端输出的字符集 -->
<property name="contentType" value="text/html;charset=utf-8"/>
<!-- 配置扩展名 -->
<property name="suffix" value=".ftl"/>
</bean>
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<!-- 配置模版文件目录 WEB-IN 目录下外部无法访问可以保证安全性-->
<property name="templateLoaderPath" value="/WEB-INF/ftl"/>
<property name="freemarkerSettings">
<props>
<!-- 渲染产生最终结果设置的字符集 -->
<prop key="defaultEncoding">UTF-8</prop>
</props>
</property>
</bean>
@Controller
@RequestMapping("/fm")
public class FreemarkerController {
@GetMapping("/test")
public ModelAndView test() {
//直接写文件名即可 Spring已经帮助我们找到扩展名
ModelAndView modelAndView = new ModelAndView("/test");
User user = new User();
user.setUsername("andy");
//传递请求 数据
modelAndView.addObject("u", user);
return modelAndView;
}
}
test.ftl 模版
<h1>${u.username}</h1>