四、视图与视图解析器
通常像spring mvc 这样的web框架都会有相应的定位视图技术,spring提供了视图解析器来解析ModelAndView模型数据到特定的视图上,spring提供了ViewResolver和View两个特别重要的接口,ViewResolver提供了从视图名称到实际视图的映射,View处理请求的准备的工作,并将该请求提交给某种具体的视图解析器
1.使用Excel作为视图(了解)
步骤一:建立后端控制器ExcelControl.java,主要代码如下:
package com.asm; //...省略导入的相关类 public class ExcelControl extends AbstractController { @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { Map map = new HashMap(); List wordList = new ArrayList(); wordList.add("first"); wordList.add("second"); wordList.add("third"); map.put("wordList", wordList); return new ModelAndView("exl", map); } }
步骤二:编写web.xml(参前面实例),编写配置spmvc-servlet.xml文件,主要代码如下:
<bean id="rbViewResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver"> <property name="order" value="2" /> <property name="basename" value="view" /> </bean> <bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/getExcel.do">excelControl</prop> </props> </property> </bean> <bean id="excelControl" class="com.asm.ExcelControl"></bean>
简析:ResourceBundleViewResolver视图解析器会在classpath中寻找properties属性文件,根据此bean配置的<property name="basename" value="view" />说明寻找的properties文件名为view.properties。<property name="order" value="2" />说明了此解析器在整个解析链接中的顺序。
步骤三:编写view.properties文件,主要代码如下:
exl.(class)=com.asm.ExcelViewBuilder
说明:在控制器中返回的视图名称exl——>return new ModelAndView("exl", map),所以这里要用exl.(class)。而exl视图会交给com.asm.ExcelViewBuilder进行预处理。
步骤四:编写AbstractExcelView.java,由于此类用到了生成Excel文件相关的jar包,所以应先下载poi-2.5.1.jar并导入。主要代码如下:
package com.asm; //...省略导入的相关类 public class ExcelViewBuilder extends AbstractExcelView { protected void buildExcelDocument(Map model, HSSFWorkbook wb, HttpServletRequest req, HttpServletResponse resp) throws Exception { HSSFSheet sheet; HSSFCell cell; sheet = wb.createSheet("Spring's Excel"); // 创建一张表; // sheet = wb.getSheetAt(0);//根据索引,得到第一张存在的表 sheet.setDefaultColumnWidth((short) 10); // 设置列数为10:即A-J cell = getCell(sheet, 0, 0); //第二个参数-->excel表数字序号;第三个参数-->excel表字母序号,比如此处,构建A1单元格 setText(cell, "Spring-Excel test"); // 把内容写入A1 List words = (List) model.get("wordList"); for (int i = 0; i < words.size(); i++) { cell = getCell(sheet, 2, i);// A3-B3-C3 setText(cell, (String) words.get(i)); } } }
步骤五:启动服务器,输入… /getExcel.do ,将访问到 excel 文件。
简析执行过程:当后端控制器接受到前端控制派发的请求时,后端控制器会首先准备Model,这里即Map对象,然后返回exl视图。在返回视图前,会查找spmvc-servlet.xml配置文件,当查找名为exl的视图是由ResourceBundleViewResolver视图解析器进行解析时,这时根据此视图解析的解析规则,会对每个待解析的视图,ResourceBundle里(这时即view.properties文件)的[视图名].class
所对应的值就是实现该视图的类。 同样,[
视图名].url
所对应的值是该视图所对应的URL。当视图类成功完成视图的预处理工作后,会把此视图返回给客户端。