SpringMVC 之Resolver视图解析器笔记(六)
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视图解析器笔记(六)相关推荐
- springmvc多个视图解析器管理跳转资源
springmvc多个视图解析器管理跳转资源 项目结构 第一步:将所有资源交由springmvc管理 <servlet><servlet-name>springmvc</ ...
- 【SpringMVC笔记05】SpringMVC中的视图解析器
这篇文章,主要介绍SpringMVC框架中的几种视图解析器. 目录 一.视图解析器 1.1.什么是视图解析器 1.2.InternalResourceViewResolver 1.3.UrlBased ...
- springmvc如何使用视图解析器_SpringMVC的工作原理
SpringMVC的工作原理图: SpringMVC流程 1. 用户发送请求至前端控制器DispatcherServlet. 2. DispatcherServlet收到请求调用HandlerMapp ...
- springmvc如何使用视图解析器_SpringMVC工作原理
SpringMVC工作原理图: SpringMVC流程 1. 用户发送请求至前端控制器DispatcherServlet. 2. DispatcherServlet收到请求调用HandlerMappi ...
- springmvc中的视图解析器详细配置
视图解析器 springmvc中View Resolver负责将处理结果生成View视图,处理器执行完业务逻辑后将带有逻辑视图的ModelAndView返回给前端控制器,前端控制器再将ModelAnd ...
- springmvc如何使用视图解析器_SpringMVC相关面试题
点击蓝字 关注我们 最近面试时,每家公司的必问题,今日作此分享,如有更好的解决方案或者存在错误,还请指正. Q1 什么是 SpringMvc? SpringMvc 是 spring 的一个模块,基于 ...
- springmvc配置thymeleaf视图解析器
引入thymeleaf的依赖 <dependency><groupId>org.thymeleaf</groupId><artifactId>thyme ...
- 【SpringMVC】SpringMVC模型数据+视图解析器
目录 一.模型数据-如何将数据存入request域 二.模型数据-如何将数据存入session域 三.@ModelAttribute 四.视图解析器 相关文章 [SpringMVC]入门篇:带你了解S ...
- SpringMVC的视图解析器
文章目录 SpringMVC的自定义视图解析器 [1] SpringMVC的视图解析器 [2] SpringMVC的自定义视图解析器 SpringMVC自定义视图解析器的使用 [1] 目前项目资源的声 ...
- 【SpringMVC框架】小结+视图解析器配置前缀和后缀
1.入门程序小结 通过入门程序理解springmvc前端控制器.处理器映射器.处理器适配器.视图解析器用法. 前端控制器配置: 第一种:*.action,访问以.action结尾 由Dispatche ...
最新文章
- 作为一枚第二天上班的小小.net程序员(技术宅的那种)很迷茫哦,第一个随笔
- 《CCNP TSHOOT 300-135认证考试指南》——6.4节SVI故障检测与排除
- float数据类型研究,发现其能显示的有效数字极为有限
- 在WebLogic 12c上运行RichFaces
- 191. 位1的个数 golang
- 拿去用,常见几种加密算法的Python实现
- OpenCV3.4.1+opencv_contrib编译:windows10
- python自动填日志_Selenium3+python自动化012+日志logging基本用法、高级用法
- 【Flink】Flink 操作HDFS报错 hadoop is not in the classpath/dependencies
- readonly(C# 参考)
- java矩阵相乘泛型_21.8 实例学习:泛型矩阵类
- idea插件开发可能出现的问题
- net3.5离线一键安装工具_一键获取抖音直播源地址(无水印高清下载),无需安装Fiddler抓包工具...
- 网络游戏植入广告案例
- Vue-Layout(可视化布局)
- Springboot集成使用阿里云kafka详细步骤
- 张朝阳开课手推E=mc²,李永乐现场狂做笔记!CEO当太久都忘了他是MIT物理博士
- 微营销之微信公众号+个人号矩阵营销的核心关键思路分享
- 计算机专业-找工作相关经验
- 联想小新一键恢复小孔_联想小新笔记本如何一键恢复出厂设置_联想小新air恢复出厂设置教程...