SpringMVC配置文件
Web.xml
核心拦截器以及配置文件的路径
!-- spring 核心转发器,拦截指定目录下的请求,分配到配置的拦截路径下处理 --
servlet
servlet-namedispatcher/servlet-name
servlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class
init-param
!-- 指定springmvc配置文件的路径
如果不指定默认为:/WEB-INF/${servlet-name}-servlet.xml --
param-namecontextConfigLocation/param-name
param-valueclasspath:springmvc.xml/param-value
/init-param load-on-startup1/load-on-startup
/servlet
servlet-mapping
servlet-namedispatcher/servlet-name
!-- --
url-pattern//url-pattern
/servlet-mapping
加载spring容器
!-- 加载spring容器 --
context-param
param-namecontextConfigLocation/param-name
param-valueclasspath:spring/applicationContext-*.xml/param-value
/context-param
listener
listener-classorg.springframework.web.context.ContextLoaderListener/listener-class
/listener
编码过滤器
!-- spring 编码过滤器 --
filter
filter-namecharacterEncodingFilter/filter-name
filter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-class
init-param
param-nameencoding/param-name
param-valueUTF-8/param-value
/init-param
init-param
param-nameforceEncoding/param-name
param-valuetrue/param-value
/init-param
/filter
!-- 编码过滤器过滤的路径 --
filter-mapping
filter-namecharacterEncodingFilter/filter-name
url-pattern/*/url-pattern
/filter-mapping
url-pattern****配置讲解
在 servlet 和 filter 中我们都需要配置 url-pattern,但这个配置的解析规则有哪几种我们接下来就详细的说一下。
1、精确匹配:如 /xxx.html 就只会匹配 xxx.html。
2、路径匹配:如 /xxx/ 会匹配以 xxx 为前缀的 url。
3、后缀匹配:如 .html 会匹配所有以 html 为后缀的 url。
但是对于 url-pattern 的匹配来说可能会存在冲突的情况,这种情况下就需要排个优先级了,以上三者的优先级为 精确匹配 路径匹配 后缀匹配 。
Spring-MVC.xml
MVC的注解驱动
上面源码的配置我们看到了,其中映射器和适配器的注解模式是过时的所以我们需要重新配置一下
?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:p="http://www.springframework.org/schema/p"
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-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"
!-- 配置处理器映射器 --
bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/
!-- 配置处理器适配器 --
bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/
为什么这么配置spring就能用呢?因为spring对bean的加载有一个顺序,同名称的spring只会认第一次加载的bean,也就是配置文件最先配置的bean
/beans
**配置了这个上面俩个就不用配置了**mvc:annotation-driven会自动注册RequestMappingHandlerMapping与RequestMappingHandlerAdapter两个Bean,这是Spring MVC为@Controller分发请求所必需的,并且提供了数据绑定支持,@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持读写XML的支持(JAXB)和读写JSON的支持(默认Jackson)等功能
?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:p="http://www.springframework.org/schema/p"
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-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"
mvc:annotation-driven
/beans
视图解析器
原配的配置文件中我们可以看到,系统默认的视图解析器,以及视图解析器的种类。所以我们只需要重配默认的视图解析器就行了
bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /
property name="prefix" value="/WEB-INF/jsp/" /
property name="suffix" value=".jsp" /
/bean
视图解析器详解https://blog.csdn.net/bingbeichen/article/details/65937526
原理解析:
概述
装配: 无论请求处理方法的返回值类型是String、View或ModelMap,SpringMVC均会将其装配为ModelAndView对象,其包含逻辑视图的名称和模型对象信息。
解析: SpringMVC借助视图解析器(ViewResolver)获取最终的物理制图对象,其可以是JSP页面、Excel或JFreeChart等各种表现形式的视图。
视图
为了实现视图模型和具体实现技术的解耦,Spring在org.springframework.web.servlet包中定义高度抽象的View接口;其作用是渲染模型数据,即将模型数据以某种形式呈现给用户。其中,视图对象由视图解析器负责实例化,由于视图是无状态的,故其不会有线程安全的问题。
其中,常用的视图实现类主要有:
**大类** | **视图类型** | **说明** |
---|---|---|
解析为Bean的名字 | **BeanNameViewResolver** | 将逻辑视图解析为一个Bean,其id对应于逻辑视图的名称 |
解析为URL文件 | **InternalResourceViewResolver** | 将逻辑视图解析为一个URL文件,通常解析为一个保存在WEB-INF下的程序文件(如JSP页面) |
解析为URL文件 | JasperResportsViewResolver | 将逻辑视图解析为一个报表文件对应的URL |
模板文件视图 | FreeMarkerViewResolver | 解析为基于FreeMarker模板技术的模板文件 |
模板文件视图 | VelocityViewResolver | 解析为基于Velocity模板技术的模板文件 |
模板文件视图 | VelocityLayoutViewResolver | 解析为基于Velocity模板技术的模板文件 |
!-- 配置视图解析器:将逻辑视图解析为物理视图 --
bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
property name="prefix" value="/WEB-INF/views/"/property
property name="suffix" value=".jsp"/property
/bean
视图解析器的主要作用是将逻辑视图解析为具体的物理视图对象,可以在Spring WEB上下文中配置一种或多种解析策略,并指定其先后顺序;所有的视图解析器都必须实现ViewResolver接口。
说明:每个视图解析器均实现了Ordered接口,可通过其order属性指定解析器的优先顺序,order越小优先级越高;SpringMVC会按视图解析器的顺序对逻辑视图进行解析,直到解析成功并返回视图对象,否则将抛出ServletException异常。
JSP是最常见的视图技术,可以使用InternalResourceViewResolver作为视图解析器,SpringMVC会将逻辑视图解析为InternalResourceView对象。
若在WEB-INF/lib目录下添加jstl.jar,则SpringMVC会自动将视图由InternalResourceView转为JstlView。其中,使用JSTL的fmt标签则需要在SpringMVC的配置文件中配置国际化资源文件:
!-- springmvc.xml文件:配置国际化资源文件 --
!-- 可以在success.jsp页面中导入fmt标签后,使用fmt:message显示对应信息 --
bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"
property name="basename" value="i18n"/property
/bean
如:
i18n.properties:
i18n.username=UserName
i18n.password=Password
i18n_zh_CN.properties:
i18n.username=u7528u6237u540D
i18n.password=u5BC6u7801
i18n_en_US.properties
i18n.username=UserName
i18n.password=Password
若希望直接响应通过SpringMVC渲染的页面,而不经过目标方法,可以在Spring的Bean配置文件中使用mvc_view-controller标签来实现。
!-- 配置直接转发的页面 : 可以直接转发到相应页面而无需经过Handler的处理方法 --
mvc:view-controller path="springmvc/success" view-name="success"/
!-- 在实际开发中通常都需要配置 mvc:annotation-driven 标签 --
!-- 若配置mvc:view-controller时,务必要配置mvc:annotation-driven,否则易出错 --
mvc:annotation-driven/mvc:annotation-driven
自定义视图
**第一步:**创建自定义视图类,继承于View,并将其配置到IoC容器中;
package com.qiaobc.springmvc.view;
import java.util.Date;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.View;
@Component
public class MyView implements View {
@Override
public String getContentType() {
return "text/html";
}
@Override
public void render(MapString, ? model, HttpServletRequest request,
HttpServletResponse response) throws Exception {
response.getWriter().print("time : " + new Date());
}
}
第二步:在SpringMVC的配置文件中,配置BeanNameViewResolver视图解析器,并配置其优先级;
!-- 配置BeanNameViewResolver视图解析器 --
bean class="org.springframework.web.servlet.view.BeanNameViewResolver"
property name="order" value="1"/property
/bean
!-- 配置自动扫描的包 --
context:component-scan base-package="com.qiaobc.springmvc"/context:component-scan
第三步:在处理器中编写目标方法,其返回值对应自定义类的BeanName;
@RequestMapping("/springmvc")
@Controller
public class TestViewAndViewResolver {
@RequestMapping("/testView")
public String testView() {
System.out.println("testView...");
return "myView";
}
}
第四步:在index.jsp页面正常使用,即请求springmvc/testView即可。
重定向
一般情况下,控制器目标方法返回字符串类型的值会被当成逻 辑视图名来处理;但如果返回的字符串中带“forward:”或“redirect:”前缀时,SpringMVC 会对其进行特殊处理,即将“forward:”或“redirect:”当成指示符,其后的字符串作为URL来处理。@RequestMapping("/springmvc")
@Controller
public class TestViewAndViewResolver {
@RequestMapping("/testRedirect")
public String testRedirect() {
System.out.println("testRedirect");
return "redirect:/index.jsp"; //重定向
}
}
注意:SpringMVC的实现流程具体可参考UrlBasedViewResolver类的createView(String, Locale)方 h
希望使用Excel展示数据列表,仅需要扩展SpringMVC提供的AbstractExcelView或AbstractJExcelView,实现其buildExcelDocument()方法,并在方法中使用模型数据对象构建Excel 文档即可。其中,AbstractExcelView是基于POI API的,而AbstractJExcelView是基于JExcel API的。 视图对象需要配置为IOC 容器中Bean,即需要使用BeanNameViewResolver作为视图解析器。若希望在浏览器中直接下载Excel文档,则可以设置其响应头Content-Disposition的值为attachment;filename=xxx.xls。
注意:SpringMVC的实现流程具体可参考UrlBasedViewResolver类的createView(String, Locale)方 h
类型转换
转换器自主要用来定义一些 数据之间的转换,比如日期与字符串格式的日期之间的转换
1,创建爱你Converter
public class DateConverter implements ConverterString, Date {
@Override
public Date convert(String source) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
return simpleDateFormat.parse(source);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
2,配置Converter(第一种)
!-- 加载注解驱动 --
mvc:annotation-driven conversion-service="conversionService"/
!-- 转换器配置 --
bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean"
property name="converters"
set
bean class="cn.itcast.springmvc.convert. DateConverter "/
/set
/property
/bean
2,配置Converter(第二种,补偿用)
?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"
!-- 扫描带Controller注解的类 --
context:component-scan base-package="cn.itcast.springmvc.controller" /
!-- 转换器配置 --
bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean"
property name="converters"
set
bean class="cn.itcast.springmvc.convert.DateConverter"/
/set
/property
/bean
!-- 自定义webBinder --
bean id="customBinder" class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"
property name="conversionService" ref="conversionService" /
/bean
!--注解适配器 --
bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"
property name="webBindingInitializer" ref="customBinder"/property
/bean
!-- 注解处理器映射器 --
bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/
!-- 加载注解驱动 --
!-- mvc:annotation-driven/ --
!-- 视图解析器 --
bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" /
!-- jsp前缀 --
property name="prefix" value="/WEB-INF/jsp/" /
!-- jsp后缀 --
property name="suffix" value=".jsp" /
/bean
/beans
校验器Validation
?xml version="1.0" encoding="UTF-8"?
beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd"
mvc:annotation-driven validator="globalValidator"/
/beans
//配置局部校验器
@Controller
public class MyController {
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.addValidators(new FooValidator());
}
}
代码
//配置局部校验器
@Controller
public class MyController {
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.addValidators(new FooValidator());
}
}
拦截器nterceptors
mvc:interceptors
bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/
mvc:interceptor
mvc:mapping path="/**"/
mvc:exclude-mapping path="/admin/**"/
bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor"/
/mvc:interceptor
mvc:interceptor
mvc:mapping path="/secure/*"/
bean class="org.example.SecurityInterceptor"/
/mvc:interceptor
/mvc:interceptors
package com.itheima.springmvc.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class Interceptor2 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("Interceptor2 preHandle......");
// 在handle执行之前执行此方法。
//返回值:如果返回true,放行
//返回值:如果返回false,拦截
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
//handle执行之后,返回ModelAndView之前。
System.out.println("Interceptor2 postHandle......");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// 返回ModelAndView之后。
//可以在此处理异常
System.out.println("Interceptor2 afterCompletion......");
}
代码
package com.itheima.springmvc.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class Interceptor2 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("Interceptor2 preHandle......");
// 在handle执行之前执行此方法。
//返回值:如果返回true,放行
//返回值:如果返回false,拦截
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
//handle执行之后,返回ModelAndView之前。
System.out.println("Interceptor2 postHandle......");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// 返回ModelAndView之后。
//可以在此处理异常
System.out.println("Interceptor2 afterCompletion......");
}
视图解析器View Resolvers
mvc:view-resolvers
mvc:content-negotiation
mvc:default-views
bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/
/mvc:default-views
/mvc:content-negotiation
mvc:jsp/
/mvc:view-resolvers
请注意, FreeMarker、平铺、Groovy 标记和脚本模板还需要配置基础视图技术.
MVC 命名空间提供专用元素。例如与 FreeMarker:
mvc:view-resolvers
mvc:content-negotiation
mvc:default-views
bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/
/mvc:default-views
/mvc:content-negotiation
mvc:freemarker cache="false"/
/mvc:view-resolvers
mvc:freemarker-configurer
mvc:template-loader-path location="/freemarker"/
/mvc:freemarker-configurer
静态资源Static Resources
mvc:resources mapping="/resources/**" location="/public, classpath:/static/"cache-period="31556926" /
默认的Servlet。静态资源处理
在springMVC-servlet.xml中配置
一般Web应用服务器默认的Servlet名称是”default”,因此DefaultServletHttpRequestHandler可以找到它。如果你所有的Web应用服务器的默认Servlet名称不是”default”,则需要通过default-servlet-name属性显示指定:
mvc:default-servlet-handler default-servlet-name="所使用的Web服务器默认使用的Servlet名称" /
混合视图Path maching
可以根据不同的后缀 不同的结果,更详细的文章::https://blog.csdn.net/yingxiake/article/details/51150316
文章如有错误,请您一定指出,感谢之至!
如果你有不同的见解,欢迎留言,或者加我QQ986320270
图片可能来源于网络,如有侵权请告知。
最后:关注一下呗
如果你有不同的见解,欢迎留言,或者加我QQ986320270
最后:关注一下呗
长按二维码识别关注