MyException - 我的异常网
当前位置:我的异常网» VC/MFC » SpringMVC学习札记(五)-视图解析器

SpringMVC学习札记(五)-视图解析器

www.MyException.Cn  网友分享于:2015-08-26  浏览:36次
SpringMVC学习笔记(五)---视图解析器

视图与视图解析器

 

 

通常像spring mvc 这样的web框架都会有相应的定位视图技术,spring提供了视图解析器来解析ModelAndView模型数据到特定的视图上,spring提供了ViewResolver和View两个特别重要的接口,ViewResolver提供了从视图名称到实际视图的映射,View处理请求的准备的工作,并将该请求提交给某种具体的视图解析器
1.使用Excel作为视图(了解)
步骤一:建立后端控制器ExcelControl.java,主要代码如下:

 

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文件,主要代码如下:

    Xml代码 复制代码  收藏代码
    1.   
    <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并导入。主要代码如下:

    Java代码 复制代码  收藏代码
      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 。当视图类成功完成视图的预处理工作后,会把此视图返回给客户端。

       

      2.使用FreeMarker作为视图

       

       

      步骤一:建立后端控制器FreeMarkerController.java,主要代码如下:

      Java代码 复制代码  收藏代码
        package com.asm;
        //...省略导入的相关类
        @SuppressWarnings("deprecation")
        public class FreeMarkerController extends AbstractCommandController {
        	@Override
        	protected ModelAndView handleRequestInternal(HttpServletRequest reqeust, HttpServletResponse response)
        			throws Exception {
        		ModelAndView mav = new ModelAndView("base");
        		mav.addObject("username", "张三");
        		mav.addObject("time", new Date().toString());
        		return mav;
        	}
        
        	@Override
        	protected ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object command,
        			BindException errors) throws Exception {
        		return null;
        	}
        }

         

        步骤二:在spmvc-servlet.xml中配置:

        Xml代码 复制代码  收藏代码
          <!-- freemarker相关的配置 -->
          <bean id="freemarkerConfig"		class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
          	<property name="defaultEncoding" value="UTF-8" />
          	<property name="templateLoaderPath" value="/WEB-INF/freemarker/" />
          </bean>
          
          <!—freemarker视图解析器 -->
          <bean id="fmViewResolver"		class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
          	<property name="contentType" value="text/html;charset=utf-8" />
          	<property name="cache" value="true" />
          	<property name="prefix" value="" />
          	<property name="suffix" value=".ftl" />
          </bean>
          
          <bean id="fmControl" class="com.asm.FreeMarkerController"></bean>

           

          并在映射处理器中配置映射路径为:<prop key="/freeMarker.do">fmControl</prop>
          步骤三:通过步骤二的配置,我们还需在WEB-INF/freemarker路径下编写base.ftl(base即后端控制器返回的视图名),主要代码如下:
          <body>
           欢迎来到:FreeMarker模板页面<br/>
           welcome ${username}<br/>
           当前时间:${time} 
          </body>
          步骤四:启动服务器,输入…/freemarker.do完成测试。

           

          3.小结视图技术
          (1)ModelAndView所表示的视图名很关键,视图解析链会依此名来选择一个正确的视图。
          (2)不同的视图解析器解析视图规则不相同,但是他们实质都是实现了ViewResolver接口,并会依赖于配置View对象来处理请求的准备工作。
          (3)spring 内置了多种视图解析器,列表如下:

           

          ViewResolver

          描述

          AbstractCachingViewResolver

          抽象视图解析器实现了对视图的缓存。在视图被使用之前,通常需要进行一些准备工作。 从它继承的视图解析器将对要解析的视图进行缓存。

          XmlViewResolver

          XmlViewResolver 实现ViewResolver ,支持XML 格式的配置文件。 该配置文件必须采用与Spring XML Bean Factory 相同的DTD 。默认的配置文件是 /WEB-INF/views.xml

          ResourceBundleViewResolver

          ResourceBundleViewResolver 实现ViewResolver , 在一个ResourceBundle 中寻找所需bean 的定义。 这个bundle 通常定义在一个位于classpath 中的属性文件中。默认的属性文件是views.properties

          UrlBasedViewResolver

          UrlBasedViewResolver 实现ViewResolver , 将视图名直接解析成对应的URL ,不需要显式的映射定义。 如果你的视图名和视图资源的名字是一致的,就可使用该解析器,而无需进行映射。

          InternalResourceViewResolver

          作为UrlBasedViewResolver 的子类, 它支持InternalResourceView (对ServletJSP 的包装), 以及其子类JstlViewTilesView 。 通过setViewClass 方法,可以指定用于该解析器生成视图使用的视图类。 更多信息请参考UrlBasedViewResolverJavadoc

          VelocityViewResolver / FreeMarkerViewResolver

          作为UrlBasedViewResolver 的子类, 它能支持VelocityView (对Velocity 模版的包装)和FreeMarkerView 以及它们的子类。

          (4)Spring支持多个视图解析器一起使用,即视图解析链。 视图解析链包含一系列视图解析器,更方便开发人员处理某些特殊请求,比如在特定情况下重新定义某些视图(为某个视图解析器使用order,可以改变此视图解析器在整个视图解析链中的解析顺序:order值越大,它在整个视图解析链中的顺序越靠前,即它越会被优先选作为视图解析器)。


          4.视图解析链
          通过前面的两个实例,在spmvc-servlet.xml配置文件便具备了两个视图解析器,它们共同构成了视图解析链。下面我们将再增加一个视图解析器来解析jsp视图,并编写一个后端控制器来负责调用特定的请求。
          步骤一:编写后端控制器.java,主要代码如下:

          Java代码 复制代码  收藏代码
            package com.asm;
            //...省略导入的相关类
            public class SelectViewController implements Controller {
            	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
            		String param = request.getParameter("op");
            		ModelAndView mav = new ModelAndView("display");
            		if ("fm".equals(param)) {
            			// mav = new ModelAndView(new RedirectView("freeMarker.do"));
            			// mav =new ModelAndView("redirect:freeMarker.do");
            			mav = new ModelAndView("forward:freeMarker.do");
            			return mav;
            		} else if ("excel".equals(param)) {
            			mav = new ModelAndView(new RedirectView("getExcel.do"));
            			return mav;
            		} else {
            			return mav;
            		}
            	}
            }

             简析:如果请求参数op为fm,则调用freemarker.do,如果op为excel,则调用getExcel.do,否则显示display.jsp视图。调用freemarker.do和getExcel.do我们可以使用重定向技术和直接使用forward跳转:使用forward跳转,forward:视图名;使用重定向,redirect:视图名(也可以RedirectView对象实现)。
            步骤二:在spmvc-servlet.xml中增加jsp视图解析器(它与前面定义的两个视图解析器共同构成了视图解析链),并配置后端处理器及映射路径。

             

            Xml代码 复制代码  收藏代码
              <bean id="irViewResolver"		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
              	<property name="prefix" value="/WEB-INF/page/" />
              	<property name="suffix" value=".jsp" />
              </bean>
              
              <bean id="simpleUrlHandlerMapping"
              	class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
              		<property name="mappings">
              			<props>
              				<prop key="/getExcel.do">excelControl</prop>
              				<prop key="/freeMarker.do">fmControl</prop>
              				<prop key="/sv.do">svControl</prop>
              			</props>
              		</property>
              </bean>
              <bean id="svControl" class="com.asm.SelectViewController"></bean>

               

              说明:irViewResolver视图解析器应放在前面两个视图解析器后面,理解视图解析顺序,可以把irViewResolver视图解析器放在视图解析链的最前面试下执行效果,当然也可以为视图解析器定义order值来进一步理解视图解析顺序。
              步骤三:在WEB-INF/page目录下编写display.jsp, 主要代码如下:
              <body>
               欢迎来到display页面,你可以选择如下操作:<br/>
              <a href="<%=request.getContextPath()%>/sv.do?op=excel">Excel页面</a>
              <a href="<%=request.getContextPath()%>/sv.do?op=fm">freeMarker页面</a>
              <a href="<%=request.getContextPath()%>/sv.do">jsp页面</a>
              </body>
              步骤四:index.jsp页面主要代码如下:
              <body>
              <a href="<%=request.getContextPath()%>/sv.do?op=excel">Excel页面</a>
              <a href="<%=request.getContextPath()%>/sv.do?op=fm">freeMarker页面</a>
              <a href="<%=request.getContextPath()%>/sv.do">jsp页面</a>
              </body>
              步骤五:启动服务器,访问首面测试。

               

               

               

               

              文章评论

              Java 与 .NET 的平台发展之争
              Java 与 .NET 的平台发展之争
              那些性感的让人尖叫的程序员
              那些性感的让人尖叫的程序员
              程序员的鄙视链
              程序员的鄙视链
              当下全球最炙手可热的八位少年创业者
              当下全球最炙手可热的八位少年创业者
              每天工作4小时的程序员
              每天工作4小时的程序员
              老美怎么看待阿里赴美上市
              老美怎么看待阿里赴美上市
              鲜为人知的编程真相
              鲜为人知的编程真相
              60个开发者不容错过的免费资源库
              60个开发者不容错过的免费资源库
              代码女神横空出世
              代码女神横空出世
              科技史上最臭名昭著的13大罪犯
              科技史上最臭名昭著的13大罪犯
              2013年中国软件开发者薪资调查报告
              2013年中国软件开发者薪资调查报告
              我是如何打败拖延症的
              我是如何打败拖延症的
              漫画:程序员的工作
              漫画:程序员的工作
              亲爱的项目经理,我恨你
              亲爱的项目经理,我恨你
              5款最佳正则表达式编辑调试器
              5款最佳正则表达式编辑调试器
              十大编程算法助程序员走上高手之路
              十大编程算法助程序员走上高手之路
              为啥Android手机总会越用越慢?
              为啥Android手机总会越用越慢?
              看13位CEO、创始人和高管如何提高工作效率
              看13位CEO、创始人和高管如何提高工作效率
              编程语言是女人
              编程语言是女人
              10个调试和排错的小建议
              10个调试和排错的小建议
              程序员都该阅读的书
              程序员都该阅读的书
              我的丈夫是个程序员
              我的丈夫是个程序员
              2013年美国开发者薪资调查报告
              2013年美国开发者薪资调查报告
              要嫁就嫁程序猿—钱多话少死的早
              要嫁就嫁程序猿—钱多话少死的早
              程序员周末都喜欢做什么?
              程序员周末都喜欢做什么?
              程序员应该关注的一些事儿
              程序员应该关注的一些事儿
              初级 vs 高级开发者 哪个性价比更高?
              初级 vs 高级开发者 哪个性价比更高?
              程序员必看的十大电影
              程序员必看的十大电影
              “肮脏的”IT工作排行榜
              “肮脏的”IT工作排行榜
              程序猿的崛起——Growth Hacker
              程序猿的崛起——Growth Hacker
              做程序猿的老婆应该注意的一些事情
              做程序猿的老婆应该注意的一些事情
              Google伦敦新总部 犹如星级庄园
              Google伦敦新总部 犹如星级庄园
              总结2014中国互联网十大段子
              总结2014中国互联网十大段子
              旅行,写作,编程
              旅行,写作,编程
              10个帮程序员减压放松的网站
              10个帮程序员减压放松的网站
               程序员的样子
              程序员的样子
              Web开发者需具备的8个好习惯
              Web开发者需具备的8个好习惯
              “懒”出效率是程序员的美德
              “懒”出效率是程序员的美德
              我跳槽是因为他们的显示器更大
              我跳槽是因为他们的显示器更大
              程序员的一天:一寸光阴一寸金
              程序员的一天:一寸光阴一寸金
              那些争议最大的编程观点
              那些争议最大的编程观点
              Java程序员必看电影
              Java程序员必看电影
              程序员眼里IE浏览器是什么样的
              程序员眼里IE浏览器是什么样的
              什么才是优秀的用户界面设计
              什么才是优秀的用户界面设计
              为什么程序员都是夜猫子
              为什么程序员都是夜猫子
              程序员和编码员之间的区别
              程序员和编码员之间的区别
              Web开发人员为什么越来越懒了?
              Web开发人员为什么越来越懒了?
              如何区分一个程序员是“老手“还是“新手“?
              如何区分一个程序员是“老手“还是“新手“?
              中美印日四国程序员比较
              中美印日四国程序员比较
              软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有