@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. rails使用mysql数据库

    简单步骤 1,安装mysql 安裝 MySQL Ubuntu 上安裝 MySQL 請執行: $ sudo apt-get install mysql-server mysql-common mysql ...

  2. vue中使用axios post上传头像/图片并实时显示到页面

    在前端开发中,为了更好的用户体验,在头像上传时会先将图片显示到页面然后点击保存按钮 完成图片的上传成功 代码部分有参考他人的写法. html代码:   <div id="myPhoto ...

  3. 【selenium】常见问题

    1鼠标变粗:setting→1.打开设置 点击 plugins 输入ideavim  把 这个勾去掉!这个是插件的配置问题.  2.editor->appearance  去掉 use bloc ...

  4. 并不对劲的p4449于神之怒加强版

    题目大意 给定\(t,k(t\leq2000,k\leq5*10^6)\) \(t\)组询问,每组给出\(n,m(n,m\leq5*10^6)\)求$\sum_{i=1}^n \sum_{j=1}^m ...

  5. [Selenium] 测试机器上安装了多个Firefox,如何指定运行哪一个?

    可通过FirefoxBinary 来指定运行某个路径下的Firefox, 示例代码如下: public class testFirefoxBinary{ public static void main ...

  6. 【扬中集训 DAY4T1】跳马

    [题目链接] 点击打开链接 [算法] 数据范围很大,显然暴力是不能通过的 我们可以先打表,发现答案为 : 41 109 205 325 473 649 853 1085 1345 观察数列的差 68 ...

  7. NOIP2008 传纸条(DP及滚动数组优化)

    传送门 这道题有好多好多种做法呀……先说一下最暴力的,O(n^4的做法) 我们相当于要找两条从左上到右下的路,使路上的数字和最大.所以其实路径从哪里开始走并不重要,我们就直接假设全部是从左上出发的好啦 ...

  8. 201响应为什么进了AJAX error回调函数

    明明AJAX发送请求成功,但是后端返回的不是200,而是201,结果进了error的回调函数,想这种情况,只需要把“dataType:"json",改成dataType:" ...

  9. struct 结构体解析(原)

    (一)基本概念 结构体是一个或是多个变量的集合,这些变量可能为不同的类型,为了处理的方便而将这些变量组合在一个名字之下.我们将关键字struct引入了结构声明中.结构声明包含在花括号内的一系列声明组成 ...

  10. Codechef WEASELTX

    WEASELTX code给你一棵 n 个节点的有根树(节点),以及每个节点 i 的初始权值 a[i] .一次操作则是指将每个节点的权值变为以其为根的子树中所有节点的权值之异或和.维护 q 个询问,每 ...