Spring所支持的Resolver 非常多,但是我们最为常用的还是 InternalResourceViewResolver 。常规就是贴出一下InternalResourceViewResolver的常用配置:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
      p:prefix="/WEB-INF/views/" p:suffix=".jsp" p:order="99"
></bean>

这里我说一下其余的两个resolver

BeanNameViewResolver   这个resolver会找到相应的bean最为view这个非常有用,我们会使用这个resolver处理一些导出EXCEL和导出PDF的view,当然也有人使用这个来做JSON和XML View的视图解析,但是一般情况下我都是采用HttpMessageConvert做JSON和XML的输出。

CommonsMultipartResolver  这个用于文件上传之用。

其他还有什么国际化的、解析为URL文件的等等,这里就不再细说。下面我会做一个excel导出 和文件上传功能,来感受BeanNameViewResolver和CommonsMultipartResolver的作用。

EXCEL导出

Excel导出在SpringMVC非常简单,我们需要实现一个AbstractXlsxView的类,作为相应的View。然后通过BeanNameViewResolver 获得并使用这个View的输出进行响应。

编写一个导出用户数据excel的view

public class UserListExcelView extends AbstractXlsxView {protected void buildExcelDocument(Map<String, Object> map, Workbook workbook, HttpServletRequest httpServletRequest,
                                      HttpServletResponse httpServletResponse) throws Exception {httpServletResponse.setHeader(HttpHeaders.CONTENT_DISPOSITION, "inline;filename=" + new String("UserList.xlsx".getBytes(), "utf-8"));
        List<User> resultList = (List<User>) map.get("userList");
        Sheet sheet = workbook.createSheet("UserList");
        Row header = sheet.createRow(0);
        header.createCell(0).setCellValue("User id");
        header.createCell(1).setCellValue("User name");
        header.createCell(2).setCellValue("User Password");

        int rowIndex = 1;
        for (User userItem : resultList) {Row rowItem = sheet.createRow(rowIndex++);
            rowItem.createCell(0).setCellValue(userItem.getUserId());
            rowItem.createCell(1).setCellValue(userItem.getUsername());
            rowItem.createCell(2).setCellValue(userItem.getPwd());
        }}
}

使用之前我们需要一些依赖包的支持,maven的dependence:

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.9</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.9</version>
</dependency>

然后将我们写的UserListExcelView 配置为springMVC的bean:

<bean id="userListEXCEL" class="com.maxfunner.view.UserListExcelView"/>

最后我们需要定义BeanNameViewResolver,如果我们同时定义了InternalResourceViewResolver的话,需要注意优先级的问题。优先级后面会说

<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" p:order="10"/>

然后就在controller中编写一个处理方法:

@RequestMapping("/userListExport")
public ModelAndView getUserList() {ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("userListEXCEL");
    modelAndView.addObject("userList", this.userService.getUserByIdRange(0, 30));
    return modelAndView;
}

这里可以看见我们在设置ViewName的时候,是设置的<bean id="userListEXCEL" class="com.maxfunner.view.UserListExcelView"/>这个bean的id。BeanNameViewResolver主要的目的就是找到相对于ViewName的Bean作为视图。

但是InternalResourceViewResolver也会解析viewName,这个就涉及都一个优先级的问题,如果InternalResourceViewResolver优先级比较高,那么InternalResourceViewResolver会直接去找userListEXCEL.jsp这个文件,然后就不会执行BeanNameViewResolver的解析。所以我们应该将BeanNameViewResolver的优先级调高,如果BeanNameViewResolver发现有ID为userListEXCEL的bean就直接处理解析,如果没有找到就将这个处理请求交由InternalResourceViewResolver。

刚刚XML配置中的Order属性就是优先级,数值越小越优先。由于我们定义了InternalResourceViewResolver,所以我们需要将InternalResourceViewResolver设置一个较大的值,然后BeanNameViewResolver设置为一个较小的值。

然后我们尝试访问/userListExport就会获得一份Excel。

需要提醒的是,在以前的版本中使用AbstractExcelView,但是已经被废弃了,现在是使用AbstractXlsxView这个接口。AbstractXlsxView导出的是xlsx文件后缀的excel文件。

顺便一提:如果想导出PDF的话 是实现AbstractPdfView 同理也是使用BeanNameViewResolver作为解析器。以下是需要实现PDF导出的依赖包的pom文件dependence:

<dependency>
    <groupId>com.lowagie</groupId>
    <artifactId>itext</artifactId>
    <version>2.1.7</version>
</dependency>

SpringMVC的文件上传

使用SpringMVC进行文件上传功能相对比较简单,使用CommonsMultipartResolver作为解析器,以下是相应的配置:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="defaultEncoding" value="utf-8"></property>
    <property name="maxUploadSize" value="10485760000"></property>
    <property name="uploadTempDir" value="upload/temp"></property>
    <property name="maxInMemorySize" value="40960"></property>
</bean>

还有一些依赖包:

<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.2</version>
</dependency>

<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>

最后就是相应的controller处理方法

@RequestMapping("/uploadFile.action")
public ModelAndView updateFile(@RequestParam(value = "file",required = false) MultipartFile file, HttpSession session) throws IOException {ModelAndView modelAndView = new ModelAndView();
    if (file == null || file.isEmpty()) {modelAndView.setViewName("redirect:/user/uploadFile.html");
    } else {File targetFile = new File(session.getServletContext().getRealPath("/image"), file.getOriginalFilename());
        if (!targetFile.getParentFile().exists() || !targetFile.getParentFile().isDirectory()) {targetFile.getParentFile().mkdirs();
        }file.transferTo(targetFile);
        modelAndView.addObject("imagePath", targetFile.getName());
        modelAndView.setViewName("showImage");
    }return modelAndView;
}

BeanNameViewResolver如果View的bean比较多会导致MVC的配置文件极度不简洁,所以我们可以使用一个单独的XML作为View的bean定义:

<bean class="org.springframework.web.servlet.view.XmlViewResolver" p:order="20" p:location="views.xml" />

XmlViewResolver是定义view的xml文件位置。需要注意的是views.xml 定义的bean都不会被MVC容器中的bean所使用,这写bean只提供给相应的解释器使用。

views.xml的配置如下,其实就一个份普通的Spring配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       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">

    <bean id="userListEXCEL" class="com.maxfunner.view.UserListExcelView"/>

</beans>

SpringMVC 之Resolver视图解析器笔记(六)相关推荐

  1. springmvc多个视图解析器管理跳转资源

    springmvc多个视图解析器管理跳转资源 项目结构 第一步:将所有资源交由springmvc管理 <servlet><servlet-name>springmvc</ ...

  2. 【SpringMVC笔记05】SpringMVC中的视图解析器

    这篇文章,主要介绍SpringMVC框架中的几种视图解析器. 目录 一.视图解析器 1.1.什么是视图解析器 1.2.InternalResourceViewResolver 1.3.UrlBased ...

  3. springmvc如何使用视图解析器_SpringMVC的工作原理

    SpringMVC的工作原理图: SpringMVC流程 1. 用户发送请求至前端控制器DispatcherServlet. 2. DispatcherServlet收到请求调用HandlerMapp ...

  4. springmvc如何使用视图解析器_SpringMVC工作原理

    SpringMVC工作原理图: SpringMVC流程 1. 用户发送请求至前端控制器DispatcherServlet. 2. DispatcherServlet收到请求调用HandlerMappi ...

  5. springmvc中的视图解析器详细配置

    视图解析器 springmvc中View Resolver负责将处理结果生成View视图,处理器执行完业务逻辑后将带有逻辑视图的ModelAndView返回给前端控制器,前端控制器再将ModelAnd ...

  6. springmvc如何使用视图解析器_SpringMVC相关面试题

    点击蓝字 关注我们 最近面试时,每家公司的必问题,今日作此分享,如有更好的解决方案或者存在错误,还请指正. Q1 什么是 SpringMvc? SpringMvc 是 spring 的一个模块,基于 ...

  7. springmvc配置thymeleaf视图解析器

    引入thymeleaf的依赖 <dependency><groupId>org.thymeleaf</groupId><artifactId>thyme ...

  8. 【SpringMVC】SpringMVC模型数据+视图解析器

    目录 一.模型数据-如何将数据存入request域 二.模型数据-如何将数据存入session域 三.@ModelAttribute 四.视图解析器 相关文章 [SpringMVC]入门篇:带你了解S ...

  9. SpringMVC的视图解析器

    文章目录 SpringMVC的自定义视图解析器 [1] SpringMVC的视图解析器 [2] SpringMVC的自定义视图解析器 SpringMVC自定义视图解析器的使用 [1] 目前项目资源的声 ...

  10. 【SpringMVC框架】小结+视图解析器配置前缀和后缀

    1.入门程序小结 通过入门程序理解springmvc前端控制器.处理器映射器.处理器适配器.视图解析器用法. 前端控制器配置: 第一种:*.action,访问以.action结尾 由Dispatche ...

最新文章

  1. 作为一枚第二天上班的小小.net程序员(技术宅的那种)很迷茫哦,第一个随笔
  2. 《CCNP TSHOOT 300-135认证考试指南》——6.4节SVI故障检测与排除
  3. float数据类型研究,发现其能显示的有效数字极为有限
  4. 在WebLogic 12c上运行RichFaces
  5. 191. 位1的个数 golang
  6. 拿去用,常见几种加密算法的Python实现
  7. OpenCV3.4.1+opencv_contrib编译:windows10
  8. python自动填日志_Selenium3+python自动化012+日志logging基本用法、高级用法
  9. 【Flink】Flink 操作HDFS报错 hadoop is not in the classpath/dependencies
  10. readonly(C# 参考)
  11. java矩阵相乘泛型_21.8 实例学习:泛型矩阵类
  12. idea插件开发可能出现的问题
  13. net3.5离线一键安装工具_一键获取抖音直播源地址(无水印高清下载),无需安装Fiddler抓包工具...
  14. 网络游戏植入广告案例
  15. Vue-Layout(可视化布局)
  16. Springboot集成使用阿里云kafka详细步骤
  17. 张朝阳开课手推E=mc²,李永乐现场狂做笔记!CEO当太久都忘了他是MIT物理博士
  18. 微营销之微信公众号+个人号矩阵营销的核心关键思路分享
  19. 计算机专业-找工作相关经验
  20. 联想小新一键恢复小孔_联想小新笔记本如何一键恢复出厂设置_联想小新air恢复出厂设置教程...

热门文章

  1. Spring中整合mybatis包
  2. Multi-modal Knowledge Graphs for Recommender Systems论文解读
  3. 下载安装Vue-CLI
  4. 1960-征战的Loy
  5. 盘点:上海十处最具情调的小资地!(组图)
  6. java颜色识别_Java颜色检测
  7. 【0514 更新中】CVPR 2019 论文汇总 按方向划分
  8. 今日恐慌与贪婪指数为20 恐慌程度有所上升
  9. web页面实现剪切板图片黏贴功能
  10. CapsNet入门系列之二:胶囊如何工作