1、ViewResolver
UrlBasedViewResolver 这个东西是根据url 进行路由的。网上搜了

1、order 排序,同名出现各种问题

2、XmlViewResolver,BeanNameViewResolver,ResourceBundleViewResolver  这个

根据配置文件去找不同的view 乱码。。。莫名,而且配置的起来比较麻烦,好处么,就是一个配置文件基本搞定所有页面位置

乱码据说WebApplicationContext 中可以设置某弄过

3、自己写个ViewResolver ,这个比较推荐,也比较靠谱,网上找了2个,觉得还是集成AbstractCachingViewResolver

比较靠谱,下面是拷贝来的

  1. package com.cnynld.web.tpl;
  2.  
  3. import java.util.Iterator;
  4. import java.util.Locale;
  5. import java.util.Map;
  6.  
  7. import org.springframework.core.Ordered;
  8. import org.springframework.util.StringUtils;
  9. import org.springframework.web.servlet.View;
  10. import org.springframework.web.servlet.ViewResolver;
  11. import org.springframework.web.servlet.view.AbstractCachingViewResolver;
  12.  
  13. /**
  14. * @author loswing
  15. * spring mvc 多view 兼容的 通过后缀来过滤
  16. * FIXME 也可以通过 集成 ViewResolver 不过 AbstractCachingViewResolver是所有resolver的根更靠谱点
  17. */
  18. public class SpringMvcExtendViewResolver extends AbstractCachingViewResolver implements Ordered{
  19.  
  20. private int order = Integer.MIN_VALUE;
  21.  
  22. public int getOrder() {
  23. return order;
  24. }
  25.  
  26. public void setOrder(int order) {
  27. this.order = order;
  28. }
  29.  
  30. private Map<String, ViewResolver> resolvers;
  31.  
  32. public void setResolvers(Map<String, ViewResolver> resolvers) {
  33. this.resolvers = resolvers;
  34. }
  35. private String getViewResolverKey(String fileExtension){
  36. Iterator<String> keyIt = resolvers.keySet().iterator();
  37. while (keyIt.hasNext()) {
  38. String viewResolverKey = (String) keyIt.next();
  39. String[] arr = viewResolverKey.split(",");
  40. for (String subKey : arr) {
  41. if(subKey.equals(fileExtension)) return viewResolverKey;
  42. }
  43. }
  44. return null;
  45. }
  46.  
  47. @Override
  48. protected View loadView(String viewName, Locale locale) throws Exception {
  49. String fileExtension = StringUtils.getFilenameExtension(viewName);
  50. if (fileExtension == null) {
  51. return null;
  52. }
  53. String viewResolverKey = getViewResolverKey(fileExtension);
  54. ViewResolver resolver = resolvers.get(viewResolverKey);
  55.  
  56. return resolver == null ? null : resolver.resolveViewName(viewName,locale);
  57.  
  58. }
  59.  
  60. }
  1. <!--
  2. 把下面配置拷贝到spring-mvc.xml中就可以了。
  3. 在需要地方返货 以 vm 为后缀的页面就ok
  4. -->
  5.  
  6. <!-- 自定义多视图解析器,根据请求后缀调用相应的视图解析器 -->
  7. <bean id="LdMultipleViewResolver" class="com.cnynld.web.tpl.SpringMvcExtendViewResolver" p:order="">
  8. <property name="resolvers">
  9. <map>
  10. <entry key="vm">
  11. <bean class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
  12. <property name="cache" value="true"/>
  13. <property name="prefix" value=""/>
  14. <property name="suffix" value="" />
  15. <property name="contentType" value="text/html;charset=UTF-8" />
  16. </bean>
  17. </entry>
  18. </map>
  19. </property>
  20. </bean>
  21.  
  22. <bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
  23. <property name="resourceLoaderPath" value="classpath:/tpl"/>
  24. <!-- <property name="configLocation" value="/WEB-INF/velocity.properties"/> --> <!-- 用下面这个吧 -->
  25. <property name="velocityProperties">
  26. <props>
  27. <prop key="input.encoding">UTF-</prop>
  28. <prop key="output.encoding">UTF-</prop>
  29. <prop key="contentType">text/html;charset=UTF-</prop>
  30.  
  31. <prop key="file.resource.loader.cache">false</prop>
  32. <prop key="file.resource.loader.modificationCheckInterval"></prop>
  33. <prop key="velocimacro.library.autoreload">true</prop>
  34.  
  35. <!-- <prop key="velocimacro.library">macro.vm</prop> -->
  36.  
  37. <prop key="runtime.log.logsystem.class">org.apache.velocity.runtime.log.SimpleLog4JLogSystem</prop>
  38. <prop key="runtime.log">com.sa</prop>
  39. <prop key="runtime.log.error.stacktrace">true</prop>
  40. <prop key="runtime.log.warn.stacktrace">true</prop>
  41. <prop key="runtime.log.info.stacktrace">false</prop>
  42. <prop key="runtime.log.invalid.reference">true</prop>
  43. </props>
  44. </property>
  45. </bean>

下面记录点为了解决这个问题找的笔记

0、spring mvc 莫名
0.1Controller 的一些

  1. //所有Controller 都靠这个开始一切,
  2. public interface Controller {
  3. ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;
  4. }
  5. WebContentGenerator Controller的基本属性,设置浏览器相关的解析
  6. AbstractController 所有Controller的根,如果要继承,注意 Override这个 handleRequestInternal,不要去弄handleRequest
  7. 返回null 就不会触发视图的解析(各种Resolver)
  1. //spring 的注入的的各种
  2. BaseCommandController //Validator、 属性绑定 等等各种的入口,是conroller 类解析的逻辑所在,其他下面都是业务流
  3. AbstractCommandController 我理解为将request 解析类,可以帮助你解决requestobject各种问题
  4. setCommandClass 要转换的对象
  5. setCommandName 命令对象的名称
  1. //form相关的control ,理解为Override 这个后handleRequestInternal,根据个人爱好写了好多if else
  2. AbstractFormController 理解为处理form提交的各个过程
  3. formBackingObject 显示的时候form绑定的数据
  4. referenceData 一些其他显示要用的数据,
  1. //各种FormController 我是都没有用过(bpmn 2.0 看下这个吧)
  2. SimpleFormControllerCancellableFormController AbstractWizardFormController流程化的 form 提交具体可以其看classproperties
  3. 只要request 含名字为:_cancel CancellableFormController onCancel就会触发如url?xx=&_cancel=wc
  1. //FIXME 理解上有问题,spring mvc 多视图引擎的中 prefix, suffix 就在这里产生的
  2. AbstractUrlViewController ,UrlFilenameViewController
  3. url匹配按照url最长匹配优先,
  4. /long/long
  5. /long/**/abc
  6. /long/**
  7. /**
  8. 如请求为“/long/long” 将匹配第一个“/long/long”,但请求“/long/acd”
  9. 则将匹配 “/long/**”,如请求“/long/aa/abc”则匹配“/long/**/abc”,如请求“/abc”则将匹配“/**”
  1. MultiActionController 这个是mvc的核心吧,基本所有Resolver都来自这里 //FIXME 这里的Delegate 不是太明白
  2. public (ModelAndView | Map | String | void) actionName(HttpServletRequest request, HttpServletResponse response,
  3. [,HttpSession session] [,AnyObject]);
  4. 、返回值:即模型和视图部分;
  5.  
  6. ModelAndView:模型和视图部分 interface Controller 的标准
  7.  
  8. Map:只返回模型数据,逻辑视图名会根据RequestToViewNameTranslator实现类来计算,稍候讨论;
  9.  
  10. String:只返回逻辑视图名;
  11.  
  12. void:表示该功能方法直接写出response响应(如果其他返回值类型(如Map)返回null则和void进行相同的处理);
  13. 这个就是handleRequest 返回null造成viewresolver 不操作,你可以用response 返回各种莫名的东西,如文件流
  14.  
  15. actionName:功能方法名字;由methodNameResolver根据请求信息解析功能方法名,通过反射调用;
  16.  
  17. 、形参列表:顺序固定,“[]”表示可选,我们来看看几个示例吧:
  18.  
  19. //表示到新增页面
  20.  
  21. public ModelAndView toAdd(HttpServletRequest request, HttpServletResponse response);
  22.  
  23. //表示新增表单提交,在最后可以带着命令对象
  24.  
  25. public ModelAndView add(HttpServletRequest request, HttpServletResponse response, UserModel user);
  26.  
  27. //列表,但只返回模型数据,视图名会通过RequestToViewNameTranslator实现来计算
  28.  
  29. public Map list(HttpServletRequest request, HttpServletResponse response);
  30.  
  31. //文件下载,返回值类型为void,表示该功能方法直接写响应
  32.  
  33. public void fileDownload(HttpServletRequest request, HttpServletResponse response)
  34.  
  35. //第三个参数可以是session
  36.  
  37. public ModelAndView sessionWith(HttpServletRequest request, HttpServletResponse response, HttpSession session);
  38.  
  39. //如果第三个参数是session,那么第四个可以是命令对象,顺序必须是如下顺序
  40.  
  41. public void sessionAndCommandWith(HttpServletRequest request, HttpServletResponse response, HttpSession session, UserModel user)
  42.  
  43. 、异常处理方法,MultiActionController提供了简单的异常处理,即在请求的功能处理过程中遇到异常会交给异常处理方法进行处理,式如下所示:
  44.  
  45. public ModelAndView anyMeaningfulName(HttpServletRequest request, HttpServletResponse response, ExceptionClass exception)
  46.  
  47. MultiActionController会使用最接近的异常类型来匹配对应的异常处理方法,示例如下所示:
  48.  
  49. //处理PayException
  50.  
  51. public ModelAndView processPayException(HttpServletRequest request, HttpServletResponse response, PayException ex)
  52.  
  53. //处理Exception
  54.  
  55. public ModelAndView processException(HttpServletRequest request, HttpServletResponse response, Exception ex)
  1. .x 配置的一些莫名
  2. prefix suffix 这个东西 这个在返回的时候有用 视图路径=prefix+逻辑视图名+suffix

1、ViewResolver
UrlBasedViewResolver 这个东西是根据url 进行路由的。

  1. <bean
  2. class="org.springframework.web.servlet.view.UrlBasedViewResolver">
  3. <property name="prefix" value="/WEB-INF/" /> <!--安全考虑把模板放到url 访问不到的地方-->
  4. <property name="suffix" value=".jsp" /> <!--所有后缀为.jsp 用下面这个class来过滤 url-->
  5. <property name="viewClass" value="org.springframework.web.servlet.view.InternalResourceView"/> <!--如果不用这个,进行一次内部处理request是访问不到/WEB-INF/-->
  6. </bean>

1.1 url 视图的分发

InternalResourceViewResolver 是UrlBasedViewResolver的imp 而且会根据Controller类来找对应对象,并且根据请求将
对象啊各种放到HttpServletRequest中然后分发对应的视图上去
eg:url:/hello/test.do

//路由配置

  1. @Controller
  2. @RequestMapping(value="/hello")
  3. public class HelloController {
  4. @RequestMapping(value = "/test1", method = RequestMethod.GET)
  5. public ModelAndView getUser() {
  6. ModelAndView mv = new ModelAndView();
  7. mv.addObject("name", " test1 Hello World!!!");
  8. mv.setViewName("/hello");
  9. }
  10. @RequestMapping(value = "/test2")
  11. public String test3(HttpServletRequest request, ModelMap map) {
  12. map.put("name", "test2 hello world");
  13. return "/hello";
  14. }
  15. }

<!--spring-mvc 配置-->

  1. <bean id="JSPViewResolver"class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  2. <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /><!--如何解析视图-->
  3. <property name="contentType" value="text/html" /><!--客户端生成的页面类型-->
  4. <property name="prefix" value="/WEB-INF/" /><!--模板放在哪里-->
  5. <property name="suffix" value=".jsp" /><!--模板是啥结尾的-->
  6. <!--多视图的时候有用,效率问题,如果没有InternalResourceViewResolver会返回个null然后停滞,造成其他Resolver不执行,所以order要大,建议用ResourceBundleViewResolver-->
  7. <property name="order" value=""></property>
  8. </bean>

//在/WEB-INF/ 建个文件 hello.jsp
hello ${message}

//访问
http://localhost:8080/hello/test1.do
http://localhost:8080/hello/test2.do

2、XmlViewResolver根据配置文件分发页面,这个是我以前最恨的,每次svn都冲突,搞头昏
但是后来觉得这个实际更好用,代码里模板面嵌入模板路径,最后的结果是更加混乱(不过继续推荐ResourceBundleViewResolver)

  1. <!--spring-mvc-->
  2. <bean class="org.springframework.web.servlet.view.XmlViewResolver">
  3. <property name="location" value="/WEB-INF/views.xml"/> <!--配置文件在哪里-->
  4. <property name="order" value=""/>
  5. </bean>
  6. //views.xml
  7. <?xml version="1.0" encoding="UTF-8"?>
  8. <beans xmlns="http://www.springframework.org/schema/beans"
  9. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  10. xsi:schemaLocation="http://www.springframework.org/schema/beans
  11. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
  12. <bean id="myxml" class="org.springframework.web.servlet.view.InternalResourceView">
  13. <property name="url" value="/hello.jsp"/> <!--可以交给美工自己去弄-->
  14. </bean>
  15. </beans>
  1. //路由,上面路由添加
  2. @RequestMapping("/xml")
  3. public String testXmlViewResolver() {
  4. return "myxml"; //这样模板就交给前台配置,后台人员只要告诉前台基本
  5. }

3、ResourceBundleViewResolver和xml很像,不过他的配置文件必须是放在classpath路径下面
默认为views.properties 如果不使用默认值的话,则可以通过属性baseName或baseNames来指定。baseName只是指定一个基名称,
Spring会在指定的classpath根目录下寻找以指定的baseName开始的属性文件进行View解析,如指定的baseName是base,
那么base.properties、baseabc.properties等等以base开始的属性文件都会被Spring当做ResourceBundleViewResolver解析视图的资源文件。

  1. <bean class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
  2. <property name="basename" value="views"></property> <!--所有以views开头的文件都会被解析,建议一个模块一个views_moduleX.properties-->
  3. <property name="order"value=""></property> <!--如果你还配置了其他Resolver这个是非常必要的-->
  4. </bean>
  1. //views.properties
  2. resourceBundle.(class)=org.springframework.web.servlet.view.InternalResourceView
  3. resourceBundle.url=/hello.jsp
  4. //views_hello.properties
  5. hello.(class)=org.springframework.web.servlet.view.InternalResourceView
  6. hello.url=/hello.jsp
  1. //code
  2. @RequestMapping(value = "/test3")
  3. public String test3(HttpServletRequest request, ModelMap map) {
  4. map.put("name", "test3 hello world");
  5. return "hello";
  6. }

参考:
http://haohaoxuexi.iteye.com/blog/1770554 说明白了view的解析(其他博文也建议看下)
https://github.com/sxyx2008/maven-framework-project/ 很好的spring mvc 的demo
http://www.ibm.com/developerworks/cn/java/j-lo-springview/ 视图和视图解析器的相关概念 这个写的一般不过是中文的
http://blog.csdn.net/chichengit/article/details/12098111 写的比较全的,文中大量ctrl+c了其代码和文字
http://martinwuje.iteye.com/blog/1872952 velocity自己搞

spring mvc velocity多视图的更多相关文章

  1. Spring MVC + Velocity实现国际化配置

    国际化介绍 web开发中,国际化是需要考虑的一个问题,而且这个问题一般是越早敲定越好(不然等到系统大了,翻译是个问题).下面是结合实际项目(Spring MVC+Velocity)对实现国际化的一些总 ...

  2. spring mvc: 资源绑定视图解析器(不推荐)

    spring mvc: 资源绑定视图解析器(不推荐) 不适合单控制器多方法访问,有知道的兄弟能否告知. 访问地址: http://localhost:8080/guga2/hello/index 项目 ...

  3. spring mvc:内部资源视图解析器2(注解实现)@Controller/@RequestMapping

    spring mvc:内部资源视图解析器2(注解实现)  @Controller/@RequestMapping 访问地址: http://localhost:8080/guga2/hello/goo ...

  4. spring mvc:内部资源视图解析器(注解实现)@Controller/@RequestMapping

    spring mvc:内部资源视图解析器(注解实现)@Controller/@RequestMapping 项目访问地址: http://localhost:8080/guga2/hello/prin ...

  5. Spring MVC资源绑定视图解析器

    ResourceBundleViewResolver使用属性文件中定义的视图bean来解析视图名称. 以下示例显示如何使用Spring Web MVC框架中的ResourceBundleViewRes ...

  6. Spring MVC 数据模型与视图

      从控制器获取数据后,会装载数据到数据模型和视图中,然后将视图名称转发到视图解析器中,通过解析器解析后得到最终视图,最后将数据模型渲染到视图中,展示最终的结果给用户. 用ModelAndView来定 ...

  7. [Spring MVC] - JSP + Freemarker视图解释器整合

    Spring MVC中如果只使用JSP做视图,可以使用下面这段即可解决: <!-- 视图解释类 --> <bean class="org.springframework.w ...

  8. spring mvc + velocity 搭建实例程序maven版本并且使用的是tomcat容器而不是jetty(step by step)

    笔者最近在学习spring mvc 查了很多资料,但用jsp的居多,但项目中需要用velocity,所以说就学习了一下,现将所查资料以及搭建过程陈述如下,供需要的人参考 1.楼主用的是eclipse+ ...

  9. [Spring MVC] - JSP + Freemarker视图解释器整合(转)

    Spring MVC中如果只使用JSP做视图,可以使用下面这段即可解决: <!-- 视图解释类 --> <bean class="org.springframework.w ...

随机推荐

  1. C++程序原码

    直接插入排序基本算法 #include<iostream.h> #include<stdlib.h> #include<time.h> const int n=10 ...

  2. UVa1453或La4728 凸包+枚举(或旋转卡壳)

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  3. python 代码格式化工具:autopep8

    学习资料: https://github.com/hhatto/autopep8 背景 autopep8 会根据 PEP 8 样式文档来格式化 python 代码.它使用 pep8 来决定代码的哪部分 ...

  4. C# Eval在aspx页面中的用法及作用

    Eval( " ")和Bind( " ") 这两种一个单向绑定,一个双向绑定,bind是双向绑定,但需数据源支持 ASP.NET 2.0改善了模板中的数据绑定操 ...

  5. 【下载分】C语言for循环语句PK自我活动

    想了解自己C语言for语句的掌握程度吗?敢和自己PK较量一番吗?參加"C语言for循环语句PK自我活动",仅仅要成绩70分以上.就可赢得CSDN下载分. 12道题目题库动态读取,每 ...

  6. Android Rom修改

    最近项目里要实现修改开机动画 屏蔽系统桌面等一些涉及到修改底层的功能 一开始研究了一番 心想着看来这是要定制系统 做rom开发了 所以就牛逼哄哄的跑去下源码 研究rom开发 后来发现这将是一个庞大的工 ...

  7. [Android] Service和IntentService中显示Toast的区别

    1. 表象     Service中可以正常显示Toast,IntentService中不能正常显示Toast,在2.3系统上,不显示toast,在4.3系统上,toast显示,但是不会消失. 2. ...

  8. 将JSON数组显示前台Table中

    将JSON数组显示前台Table中 在最近的学习中遇到一个小问题,如何把JSON数组显示在前台的table中,经过一番借鉴和学习之后终于解决了这个问题.具体的代码如下: (前提:利用ajax获取过来的 ...

  9. 异步tcp通信——APM.Server 消息推送服务的实现

    消息推送服务 服务器推送目前流行就是私信.发布/订阅等模式,基本上都是基于会话映射,消息对列等技术实现的:高性能.分布式可以如下解决:会话映射可采用redis cluster等技术实现,消息对列可使用 ...

  10. List、Set、Map的使用

    1.List(接口) List接口的特点: a.List接口可以存放任意数据,且在接口中,数据可以重复. b.List中提供了高效的插入和移除多个元素的方法. List常用的子类 a.ArrayLis ...