SpringMVC 之Resolver视图解析器笔记(六)

来源:互联网 发布:网络使人疏远 反方问题 编辑:程序博客网 时间:2024/05/17 04:36

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>



原创粉丝点击