spring-mvc入门(四):视图与视图解析器(下)_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 4004 | 回复: 0   主题: spring-mvc入门(四):视图与视图解析器(下)        下一篇 
tk
注册用户
等级:中士
经验:207
发帖:80
精华:0
注册:2011-10-19
状态:离线
发送短消息息给tk 加好友    发送短消息息给tk 发消息
发表于: IP:您无权察看 2011-10-19 16:13:20 | [全部帖] [楼主帖] 楼主

2.使用FreeMarker作为视图
步骤一:建立后端控制器FreeMarkerController.java,主要代码如下:

Java代码

  1. package com.asm; 
  2. //...省略导入的相关类 
  3. @SuppressWarnings("deprecation") 
  4. publicclass FreeMarkerController extends AbstractCommandController { 
  5.       @Override
  6.       protected ModelAndView handleRequestInternal(HttpServletRequest reqeust, HttpServletResponse response) 
  7.       throws Exception { 
  8.              ModelAndView mav = new ModelAndView("base"); 
  9.              mav.addObject("username", "张三"); 
  10.              mav.addObject("time", new Date().toString()); 
  11.             return mav; 
  12.        } 
  13.       
  14.       @Override
  15.       protected ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object command, 
  16.        BindException errors) throws Exception { 
  17.             returnnull; 
  18.        } 
  19. } &格&式&0&


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

Xml代码

  1. <!-- freemarker相关的配置 -->
  2. <beanid="freemarkerConfig"class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
  3. <propertyname="defaultEncoding"value="UTF-8"/>
  4. <propertyname="templateLoaderPath"value="/WEB-INF/freemarker/"/>
  5. </bean>
  6. <!—freemarker视图解析器 -->
  7. <beanid="fmViewResolver"class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
  8. <propertyname="contentType"value="text/html;charset=utf-8"/>
  9. <propertyname="cache"value="true"/>
  10. <propertyname="prefix"value=""/>
  11. <propertyname="suffix"value=".ftl"/>
  12. </bean>
  13. <beanid="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(对Servlet和JSP的包装), 以及其子类JstlView和TilesView。 通过setViewClass方法,可以指定用于该解析器生成视图使用的视图类。 更多信息请参考UrlBasedViewResolver的Javadoc。

VelocityViewResolver / FreeMarkerViewResolver


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

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

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

Java代码

  1. package com.asm; 
  2. //...省略导入的相关类 
  3. publicclass SelectViewController implements Controller { 
  4.       public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { 
  5.              String param = request.getParameter("op"); 
  6.              ModelAndView mav = new ModelAndView("display"); 
  7.             if ("fm".equals(param)) { 
  8.                   // mav = new ModelAndView(new RedirectView("freeMarker.do")); 
  9.                   // mav =new ModelAndView("redirect:freeMarker.do"); 
  10.                    mav = new ModelAndView("forward:freeMarker.do"); 
  11.                   return mav; 
  12.              } elseif ("excel".equals(param)) { 
  13.                    mav = new ModelAndView(new RedirectView("getExcel.do")); 
  14.                   return mav; 
  15.              } else { 
  16.             return mav; 
  17.        } 
  18.  } 


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

Xml代码

  1. <beanid="irViewResolver"class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  2. <propertyname="prefix"value="/WEB-INF/page/"/>
  3. <propertyname="suffix"value=".jsp"/>
  4. </bean>
  5. <beanid="simpleUrlHandlerMapping"
  6. class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  7. <propertyname="mappings">
  8. <props>
  9. <propkey="/getExcel.do">excelControl</prop>
  10. <propkey="/freeMarker.do">fmControl</prop>
  11. <propkey="/sv.do">svControl</prop>
  12. </props>
  13. </property>
  14. </bean>
  15. <beanid="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>


步骤五:启动服务器,访问首面测试。




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论