@Spring-MVC.xml

@MVC的注解驱动

Bean模式

上面源码的配置我们看到了,其中映射器和适配器的注解模式是过时的所以我们需要重新配置一下。

<!-- 配置处理器映射器 -->

<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

@标签模式

配置了这个上面俩个就不用配置了

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

@视图解析器

原配的配置文件中我们可以看到,系统默认的视图解析器,以及视图解析器的种类。所以我们只需要重配默认的视图解析器就行了

最简单的配置

<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

1. 概述

  装配: 无论请求处理方法的返回值类型是String、View或ModelMap,SpringMVC均会将其装配为ModelAndView对象,其包含逻辑视图的名称和模型对象信息。 
  解析: SpringMVC借助视图解析器(ViewResolver)获取最终的物理制图对象,其可以是JSP页面、Excel或JFreeChart等各种表现形式的视图。

  


2. 视图

  为了实现视图模型和具体实现技术的解耦,Spring在org.springframework.web.servlet包中定义高度抽象的View接口;其作用是渲染模型数据,即将模型数据以某种形式呈现给用户。其中,视图对象由视图解析器负责实例化,由于视图是无状态的,故其不会有线程安全的问题。

  

  其中,常用的视图实现类主要有:

大类

视图类型

说明

资源视图

InternalResourceView

将JSP或其他资源封装为视图,是InternalResourceViewResolver默认使用的视图实现类

资源视图

JstlView

若JSP页面使用了JSTL国际化标签的功能,则需要使用该试图类

文档视图

AbstractExcelView

Excel文档视图的抽象类,其基于POI构造Excel文档

文档视图

AbstractPdfView

PDF文档视图的抽象类,其基于iText构造PDF文档

报表视图

ConfigurableJasperReportsView

使用JasperReports报表技术的视图

报表视图

JasperReportsCsvView

使用JasperReports报表技术的视图

报表视图

JasperReportsMultiFormatView

使用JasperReports报表技术的视图

报表视图

JasperReportsHtmlView

使用JasperReports报表技术的视图

报表视图

JasperReportsPdfView

使用JasperReports报表技术的视图

报表视图

JasperReportsXlsView

使用JasperReports报表技术的视图

JSON视图

MappingJackson2JsonView

将模型数据通过Jackson开元框架的ObjectMapper以JSON方式输出


3. 视图解析器

  视图解析器的主要作用是将逻辑视图解析为具体的物理视图对象,可以在Spring WEB上下文中配置一种或多种解析策略,并指定其先后顺序;所有的视图解析器都必须实现ViewResolver接口。 
  其中,常用的视图解析器实现类主要有:

大类

视图类型

说明

解析为Bean的名字

BeanNameViewResolver

将逻辑视图解析为一个Bean,其id对应于逻辑视图的名称

解析为URL文件

InternalResourceViewResolver

将逻辑视图解析为一个URL文件,通常解析为一个保存在WEB-INF下的程序文件(如JSP页面)

解析为URL文件

JasperResportsViewResolver

将逻辑视图解析为一个报表文件对应的URL

模板文件视图

FreeMarkerViewResolver

解析为基于FreeMarker模板技术的模板文件

模板文件视图

VelocityViewResolver

解析为基于Velocity模板技术的模板文件

模板文件视图

VelocityLayoutViewResolver

解析为基于Velocity模板技术的模板文件

  说明:每个视图解析器均实现了Ordered接口,可通过其order属性指定解析器的优先顺序,order越小优先级越高;SpringMVC会按视图解析器的顺序对逻辑视图进行解析,直到解析成功并返回视图对象,否则将抛出ServletException异常。


4.
InternalResourceViewResolver

  JSP是最常见的视图技术,可以使用InternalResourceViewResolver作为视图解析器,SpringMVC会将逻辑视图解析为InternalResourceView对象。

<!-- 配置视图解析器:将逻辑视图解析为物理视图 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/"></property>
    <property name="suffix" value=".jsp"></property>
</bean>

5. JstlView

  若在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=\u7528\u6237\u540D
i18n.password=\u5BC6\u7801

  i18n_en_US.properties

i18n.username=UserName
i18n.password=Password

6. mvc_view-controller标签

  若希望直接响应通过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>

7. 自定义视图

  第一步:创建自定义视图类,继承于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(Map<String, ?> 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即可。


8. Excel视图

  若希望使用Excel展示数据列表,仅需要扩展SpringMVC提供的AbstractExcelView或AbstractJExcelView,实现其buildExcelDocument()方法,并在方法中使用模型数据对象构建Excel 文档即可。 
  其中,AbstractExcelView是基于POI API的,而AbstractJExcelView是基于JExcel API的。 
  视图对象需要配置为IOC 容器中Bean,即需要使用BeanNameViewResolver作为视图解析器。 
  若希望在浏览器中直接下载Excel文档,则可以设置其响应头Content-Disposition的值为attachment;filename=xxx.xls。


9. 重定向

  一般情况下,控制器目标方法返回字符串类型的值会被当成逻 辑视图名来处理;但如果返回的字符串中带“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)方

类型转换

自定义Converter

public class DateConverter implements Converter<String, 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;

}

}

配置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(了解)

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

注意:此方法需要独立配置处理器映射器、适配器,不再使用<mvc:annotation-driven/>

校验器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());

}

}

拦截器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......");

       }

 

      

 

}

视图解析器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中配置<mvc:default-servlet-handler />后,会在Spring MVC上下文中定义一个org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,它会像一个检查员,对进入DispatcherServlet的URL进行筛查,如果发现是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet处理,如果不是静态资源的请求,才由DispatcherServlet继续处理。

一般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

SpringMVC-核心配置文件spring-mvc.xml的更多相关文章

  1. SpringMVC深度探险(四) —— SpringMVC核心配置文件详解

    在上一篇文章中,我们从DispatcherServlet谈起,最终为读者详细分析了SpringMVC的初始化主线的全部过程.整个初始化主线的研究,其实始终围绕着DispatcherServlet.We ...

  2. spring mvc: xml生成

    spring mvc: xml生成 准备: javax.xml.bind.annotation.XmlElement; javax.xml.bind.annotation.XmlRootElement ...

  3. Spring,SpringMvc配置常见的坑,注解的使用注意事项,applicationContext.xml和spring.mvc.xml配置注意事项,spring中的事务失效,事务不回滚原因

    1.Spring中的applicationContext.xml配置错误导致的异常 异常信息: org.apache.ibatis.binding.BindingException: Invalid ...

  4. Spring MVC Xml视图解析器

    XmlViewResolver用于在xml文件中定义的视图bean来解析视图名称.以下示例演示如何在Spring Web MVC框架使用XmlViewResolver. XmlViewResolver ...

  5. springMVC核心配置文件样例

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  6. spring mvc: xml练习

    xml练习,得到的结果是: <?xml version="1.0" encoding="UTF-8" standalone="yes" ...

  7. Spring+Spring MVC+Mybatis 框架整合开发(半注解半配置文件)

    项目结构: (代码里面都有注释) 一.在pom文件中依赖jar包 因为我这里分了模块,所以有父子级的共两个pom文件 父级: <?xml version="1.0" enco ...

  8. spring MVC核心思想

    目录  一.前言二.spring mvc 核心类与接口三.spring mvc 核心流程图 四.spring mvc DispatcherServlet说明 五.spring mvc 父子上下文的说明 ...

  9. Spring MVC 是什么? 核心总结

    SpringMVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰 ...

  10. spring Mvc 执行原理 及 xml注解配置说明 (六)

    Spring MVC 执行原理 在 Spring Mvc 访问过程里,每个请求都首先经过 许多的过滤器,经 DispatcherServlet 处理; 一个Spring MVC工程里,可以配置多个的 ...

随机推荐

  1. jvm 命令

    jps  jps主要用来输出JVM中运行的进程状态信息.语法格式如下: jps [options] [hostid] 如果不指定hostid就默认为当前主机或服务器. -q 不输出类名.Jar名和传入 ...

  2. 网页Html代码优化及分析

  3. SAP系统更新模块

    SAP 系统中,一些单据保存到数据库用的是 update mudule function. 命名是ME_UPDATE_* (业务说明) 例:PR save module: ME_UPDATE_REQU ...

  4. Linux搭建lnmp环境

    在CentOS 6上使用yum安装lnmp服务,原文链接http://www.qiansw.com/yum-lnmp.html

  5. swing_AbstractTableModel 创建表格

    import javax.swing.table.AbstractTableModel; public class MyTable extends AbstractTableModel { /** * ...

  6. css3中我们不知道的一些属性

    1.图片作为边框:border-image; 2.圆角问题:border-radius:上.下.左.右: 3.字体的阴影与自动换行: 阴影: h1 {text-shadow: 5px 5px 5px ...

  7. MYSQL初级学习笔记一:MYSQL常用命令和数据库操作(DDL)!(视频序号:初级_3,4)

    知识点一:MYSQL常用命令(3) 登入方法:一,mysql –u 账号 –p 密码 退出方法:一,EXIT,QUIT 修改MYSQL命令提示符: 连接上客户机之后,通常使用prompt命令修改: 连 ...

  8. 根据用户时区显示当地时间 javascript+php

    在跨时区应用中会用到下面代码,这是以前写的一段代码. 服务器保存相关时间配置,保存形式为GMT时间,客户端需要根据客户所在时区做相应显示,以符合客户习惯. ​1. [代码][JavaScript]代码 ...

  9. Codeforces-914F Substrings in a String (Bitset求T串中S串出现次数)

    之前有过区域赛,简化版问题: 给定一个小写字符组成的字符串S,(|S|<1e5,下标从1开始),现在有Q种操作,对于每个操作Q(Q<=1e5),输入opt, 如果opt==1,输入x,c, ...

  10. bzoj 4756 Promotion Counting —— 线段树合并

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4756 合并子树的权值线段树: merge 返回 int 或者是 void 都可以. 代码如下 ...