四、视图与视图解析器
通常像spring mvc 这样的web框架都会有相应的定位视图技术,spring提供了视图解析器来解析ModelAndView模型数据到特定的视图上,spring提供了ViewResolver和View两个特别重要的接口,ViewResolver提供了从视图名称到实际视图的映射,View处理请求的准备的工作,并将该请求提交给某种具体的视图解析器
1.使用Excel作为视图(了解)
步骤一:建立后端控制器ExcelControl.java,主要代码如下:
Java代码
- package com.asm;
- //...省略导入的相关类
- publicclass 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);
- returnnew ModelAndView("exl", map);
- }
- }
步骤二:编写web.xml(参前面实例),编写配置spmvc-servlet.xml文件,主要代码如下:
Xml代码
- <beanid="rbViewResolver"class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
- <propertyname="order"value="2"/>
- <propertyname="basename"value="view"/>
- </bean>
- <beanid="simpleUrlHandlerMapping"class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
- <propertyname="mappings">
- <props>
- <propkey="/getExcel.do">excelControl</prop>
- </props>
- </property>
- </bean>
- <beanid="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并导入。主要代码如下:
Java代码
- package com.asm;
- //...省略导入的相关类
- publicclass ExcelViewBuilder extends AbstractExcelView {
- protectedvoid 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。当视图类成功完成视图的预处理工作后,会把此视图返回给客户端。