SpringMVC多视图配置

来源:互联网 发布:mac book air 换电池 编辑:程序博客网 时间:2024/06/06 11:40

最近在springmvc上集成velocity,磕磕绊绊,总算是有所收获,在此记录一下。

   Velocity是一种易用的模板语言。Velocity将Java代码从Web 页面中分离出来,使用Web站点从长远看更容易维护,并且提供了一种可行的JavaServer Pages替代解决方案。除了JSP,Velocity可能是用于Web应用的最流行的模板语言之一。很多web系统也都采用Velocity作为视图层技术,Spring对Velocity作为视图模板语言提供了很好的支持。 

 

怎么配置,来,一步步走:

 

1、首先,在Web.xml进行配置,DispatcherServlet配置的映射为所有请求类型,这样以后如果要集成其他如Freemaker等只需要加入其配置就可以了。

  

 

Xml代码  收藏代码
  1. <servlet>  
  2.     <servlet-name>springmvc</servlet-name>  
  3.     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  4.     <init-param>  
  5.         <param-name>contextConfigLocation</param-name>  
  6.         <param-value>classpath:spring-mvc.xml</param-value>  
  7.     </init-param>  
  8.     <load-on-startup>1</load-on-startup>  
  9. </servlet>  
  10. <servlet-mapping>  
  11.     <servlet-name>springmvc</servlet-name>  
  12.     <url-pattern>/</url-pattern>  
  13. </servlet-mapping>  

 

 

2、配置spring-mvc.xml

 

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
  4.     xmlns:mvc="http://www.springframework.org/schema/mvc"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd  
  6.         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd  
  7.         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">  
  8.   
  9.     <!-- 自动扫描且只扫描@Controller -->  
  10.     <context:component-scan base-package="com.per.action"  
  11.         use-default-filters="false">  
  12.         <context:include-filter type="annotation"  
  13.             expression="org.springframework.stereotype.Controller" />  
  14.     </context:component-scan>  
  15.   
  16.     <mvc:annotation-driven />  
  17.   
  18.     <mvc:default-servlet-handler />  
  19.   
  20.         <!-- 定义JSP视图解析器-->  
  21.     <bean id="jspViewResolver"   
  22.         class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  23.         <property name="prefix" value="/WEB-INF/views/" />  
  24.         <property name="suffix" value=".jsp" />  
  25.         <property name="contentType" value="text/html;charset=UTF-8" />  
  26.     </bean>  
  27.    
  28.    
  29.      <!-- velocity视图解析器 -->  
  30.   
  31.      <!-- velocity环境配置 -->  
  32.     <bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">  
  33.         <!-- velocity配置文件路径 -->  
  34.         <property name="configLocation" value="classpath:velocity.properties"/>  
  35.         <!-- velocity模板路径 -->  
  36.         <property name="resourceLoaderPath" value="/WEB-INF/velocity/"/>  
  37.     </bean>  
  38.       
  39.      <bean id="velocityViewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">  
  40.         <property name="cache" value="false"/>  
  41.         <property name="prefix" value=""/>  
  42.         <property name="suffix" value=".vm"/>  
  43.         <property name="contentType" value="text/html;charset=UTF-8" />  
  44.         <!-- 多ViewResovler配置 -->   
  45.         <property name="order" value="1" />  
  46.     </bean>  
  47.       
  48.   
  49. </beans>  

 注意,“order”属性是必须加的,为什么呢,可以查看我前一篇内容

 

SpringMVC ViewResolver查找序列

 

velocity.properties配置文件,位置要与spring-mvc.xml中配置的一样。

Properties代码  收藏代码
  1. #encoding  
  2. input.encoding=UTF-8  
  3. output.encoding=UTF-8  
  4. contentType=text/html;charset=UTF-8  
  5.   
  6. #autoreload when vm changed  
  7. file.resource.loader.cache=false  
  8. file.resource.loader.modificationCheckInterval=1  
  9. velocimacro.library.autoreload=true  
  10.   
  11. runtime.log=velocity.log  
  12. #runtime.log.logsystem.class=org.springframework.ui.velocity.CommonsLoggingLogSystem  
  13. runtime.log.logsystem.class=org.apache.velocity.runtime.log.NullLogSystem  
  14. #runtime.log.logsystem.class=org.springframework.ui.velocity.NullLogSystem  
  15. runtime.log.error.stacktrace=false  
  16. runtime.log.warn.stacktrace=false  
  17. runtime.log.info.stacktrace=false  
  18. runtime.log.invalid.reference=false  

 

当然这里面的jspViewResover和velocityViewResover是可以单独运行的,合并也是可以运行的,不过我集成时,运行一个JSP,页面是正常的,但日志总是会提示“[Error]Resource Not Found :xxxx.vm”,查了资料都说这个可以ignore,可是怎么设置呢,这个很头疼,试着去掉velocity.jar包中日志配置也不行,可日志不能老让报error啊,求解

当然还有方法,就是打开ResourceBundleViewResover这个配置,设置view.properties,在里面加入视图的路径配置,这样就不会报异常了,也是可以正常运行的。可是新的问题来了,一个是页面会有乱码,到我写这篇文字的时候也没能解决,高人指点下啊;另外一个是你的controller的每个view路径都要在view.properties中配置,这也比较麻烦,毕竟一个项目那么多view呢

 

修改后,加入ResourceBundleViewResover配置:

 

Xml代码  收藏代码
  1. <!-- ResourceBundleViewResolver用于多个视图集成,是通过解析资源文件来解析请求输出文件的。 <property name="basename"   
  2.     value="views"></property>,即表示在/WEB-INF/classes路径下有一个 views.properties文件  -->  
  3. <bean class="org.springframework.web.servlet.view.ResourceBundleViewResolver">  
  4.     <property name="basename" value="views"/>  
  5.     <property name="order" value="0" />  
  6. </bean>  
  7.   
  8. <!-- 定义JSP视图解析器-->  
  9. <bean id="jspViewResolver"   
  10.     class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  11.     <property name="prefix" value="/WEB-INF/views/" />  
  12.     <property name="suffix" value=".jsp" />  
  13.     <property name="contentType" value="text/html;charset=UTF-8" />  
  14. </bean>  
  15.   
  16.   
  17.  <!-- velocity视图解析器 -->  
  18.   
  19.   
  20.  <!-- velocity环境配置 -->  
  21.    <bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">  
  22.        <!-- velocity配置文件路径 -->  
  23.        <property name="configLocation" value="classpath:velocity.properties"/>  
  24.        <!-- velocity模板路径 -->  
  25.        <property name="resourceLoaderPath" value="/WEB-INF/velocity/"/>  
  26.    </bean>  
  27.      
  28.    <bean id="velocityViewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">  
  29.        <property name="cache" value="false"/>  
  30.        <property name="prefix" value=""/>  
  31.        <property name="suffix" value=".vm"/>  
  32.        <property name="contentType" value="text/html;charset=UTF-8" />  
  33.          <!--  多ViewResovler配置  
  34.        <property name="order" value="1" /> -->  
  35.    </bean>  

 

view.properties配置文件

Properties代码  收藏代码
  1. #welcome为modelAndView.setViewName("welcome");中的welcome   .(class)固定写法  
  2. welcome.(class)=org.springframework.web.servlet.view.velocity.VelocityView  
  3. #welcome.url 路径 welcome.vm模板名称  
  4. welcome.url=welcome.vm  
  5.   
  6. #IndexController路径  
  7. velocity_main.(class)=org.springframework.web.servlet.view.velocity.VelocityView  
  8. velocity_main.url=velocity_main.vm  

  

 

无奈,看来,只有自己写个ViewResover来处理多视图了,google了一下,还真有人也是这么做的,看来不只是我一个人这么想啊,手懒了些,直接抄了http://blog.csdn.net/rommel1/article/details/7673325的代码,好了,来看看配置吧:

 

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <beans xmlns="http://www.springframework.org/schema/beans"  
  4.  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.  xmlns:p="http://www.springframework.org/schema/p"  
  6.  xmlns:context="http://www.springframework.org/schema/context"  
  7.  xsi:schemaLocation="  
  8.  http://www.springframework.org/schema/beans  
  9.  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  10.  http://www.springframework.org/schema/context  
  11.  http://www.springframework.org/schema/context/spring-context-3.0.xsd ">  
  12.     <context:component-scan  
  13.      base-package="com.spring.action"/>  
  14.     <!--  
  15.     org.springframework.web.servlet.view.ResourceBundleViewResolver  
  16.     用于多个视图集成时,ResourceBundleViewResolver是通过解析资源文件来解析请求输出文件的。  
  17.     <property name="basename" value="views"></property>,即表示在/WEB-INF/classes路径下有一个  
  18.     views.properties文件,本例中views.properties的内容为  
  19.     welcome.(class)=org.springframework.web.servlet.view.velocity.VelocityView  
  20.     welcomewelcome.url=welcome.vm  
  21.     freemarker.(class)=org.springframework.web.servlet.view.freemarker.FreeMarkerView  
  22.     freemarkerfreemarker.url=freemarker.ftl  
  23.     -->  
  24.     <bean class="org.springframework.web.servlet.view.ResourceBundleViewResolver">  
  25.         <property name="basename" value="views">  
  26.         </property>  
  27.         <!-- 
  28.         <property name="order" value="0"></property> 
  29.         -->  
  30.     </bean>  
  31.     <!-- FreeMarker环境配置 -->  
  32.     <bean id="freemarkerConfig"  
  33.       
  34.      class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">  
  35.         <!-- freemarker模板位置 -->  
  36.         <property name="templateLoaderPath" value="/WEB-INF/freemarker/"/>  
  37.     </bean>  
  38.     <!-- velocity环境配置 -->  
  39.     <bean id="velocityConfig"   
  40.   
  41.      class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">  
  42.         <!-- velocity配置文件路径 -->  
  43.         <property name="configLocation" value="/WEB-INF/velocity.properties"/>  
  44.         <!-- velocity模板路径 -->  
  45.         <property name="resourceLoaderPath" value="/WEB-INF/velocity/"/>  
  46.     </bean>  
  47.     <bean id="viewResolver"  
  48.      class="com.spring.action.MultiViewResover">  
  49.         <property name="resolvers">  
  50.             <map>  
  51.                 <entry key="jsp">  
  52.                     <bean  
  53.                      class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  54.                         <property name="viewClass"  
  55.                          value="org.springframework.web.servlet.view.JstlView"/>  
  56.                         <property name="prefix" value="/WEB-INF/jsp/"/>  
  57.                         <property name="suffix" value=".jsp"/>  
  58.                     </bean>  
  59.                 </entry>  
  60.                 <entry key="ftl">  
  61.                     <bean  
  62.                      class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">  
  63.                         <property name="cache" value="true"/>  
  64.                         <property name="prefix" value="/"/>  
  65.                         <property name="suffix" value=".ftl"/>    
  66.                     </bean>  
  67.                 </entry>  
  68.                 <entry key="vm">  
  69.                     <bean  
  70.                      class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">  
  71.                         <property name="cache" value="true"/>  
  72.                         <property name="prefix" value="/"/>  
  73.                         <property name="suffix" value=".vm"/>  
  74.                     </bean>  
  75.                 </entry>  
  76.             </map>  
  77.         </property>  
  78.     </bean>  
  79.       
  80. </beans>  

 

MultiViewResover代码,这里我默认的是使用jsp视图解析,如果你没有默认的可以去掉

 

Java代码  收藏代码
  1. public class MultiViewResover implements ViewResolver {  
  2.   
  3.     private Map<String, ViewResolver> resolvers;  
  4.   
  5.     @Override  
  6.     public View resolveViewName(String viewName, Locale locale) throws Exception {  
  7.         int n = viewName.lastIndexOf("."); // 获取  
  8.                                             // viewName(modelAndView中的名字)看其有没有下划线  
  9.         String suffix = "";  
  10.   
  11.         // 没有默认使用“jsp“方式 解析,有的话截取下划线后面的字符串 这里一般是jsp,ftl,vm与配置文件中的<entry  
  12.         // key="ftl">的key匹配  
  13.         if (n == (-1)) {  
  14.             suffix = "jsp";  
  15.         }  
  16.         else {  
  17.             suffix = viewName.substring(n + 1);  
  18.             // 取下划线前面的部分 那时真正的资源名.比如我们要使用hello.jsp 那viewName就应该是hello_jsp  
  19.             viewName = viewName.substring(0, n);  
  20.         }  
  21.   
  22.         // 根据下划线后面的字符串去获取托管的视图解析类对象  
  23.         ViewResolver resolver = resolvers.get(suffix);  
  24.   
  25.         if (resolver != null) {  
  26.             return resolver.resolveViewName(viewName, locale);  
  27.         }  
  28.         else {  
  29.             return null;  
  30.         }  
  31.     }  
  32.   
  33.     public Map<String, ViewResolver> getResolvers() {  
  34.         return resolvers;  
  35.     }  
  36.   
  37.     public void setResolvers(Map<String, ViewResolver> resolvers) {  
  38.         this.resolvers = resolvers;  
  39.     }  
  40. }  

 

好了,第二步这个配置总算完成了,真累 啊,继续看下面。

 

3、编写controller代码,注意,你的view名字中,要加上".vm",".jsp",".ftl"这些后缀哦,要不默认都使用jsp的解析器了

 

Java代码  收藏代码
  1. @Controller  
  2. public class IndexController{  
  3.   
  4.     @RequestMapping(value="/index")  
  5.     public ModelAndView handleRequest(HttpServletRequest request,  
  6.             HttpServletResponse response) throws Exception {  
  7.         ModelAndView mav = new ModelAndView("velocity_main.vm");  
  8.           
  9.         Person p1 = new Person();  
  10.         p1.setId(1);  
  11.         p1.setName("胡楠");  
  12.         p1.setPassword("123456");  
  13.         p1.setAge(24);  
  14.         p1.setBirthday(new Date());  
  15.           
  16.         List<Person> list = new ArrayList<Person>();  
  17.         for(int i=0;i<10;i++){  
  18.             Person p = new Person();  
  19.             p.setId(1000+i);  
  20.             p.setName("胡楠"+i);  
  21.             p.setPassword("123456"+i);  
  22.             p.setAge(24+i);  
  23.             p.setBirthday(new Date());  
  24.             list.add(p);  
  25.         }  
  26.         //集合  
  27.         mav.addObject("persons", list);  
  28.         //对象  
  29.         mav.addObject("person",p1);  
  30.         //request范围数据  
  31.         request.setAttribute("requestData""hunan");  
  32.         //session范围数据  
  33.         request.getSession().setAttribute("sessionData""123456");  
  34.         return mav;  
  35.     }  
  36.   
  37.       
  38.     @RequestMapping(value="/welcome")  
  39.     public ModelAndView helloVm(){  
  40.         ModelAndView modelAndView=new ModelAndView();  
  41.         modelAndView.setViewName("welcome.vm");  
  42.         modelAndView.addObject("message""Hello,Velocity");  
  43.         return modelAndView;  
  44.     }  
  45. }  

 4、编写velocity模板代码,以下是velocity_main.vm代码

Velocity代码  收藏代码
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  2. <html>  
  3. <head>  
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  5. <title>Insert title here</title>  
  6. </head>  
  7. <body>  
  8. 显示对象的属性<br>  
  9. $person.id<br>  
  10. $person.name<br>  
  11. $person.password<br>  
  12. $person.age<br>  
  13. if语句<br>  
  14. #if($person.id <2)  
  15. id大于2  
  16. #else  
  17. id小于2  
  18. #end  
  19. #if($person.password=="123456")  
  20. 密码等于123456  
  21. #end  
  22. <hr>  
  23. foreach语句<br>  
  24. #foreach($p in $persons)  
  25.     $p.id<br>  
  26.    $p.name<br>  
  27.    $!p.email<br>  
  28.    $dateTool.format("yyyy-MM-dd HH:mm:ss", $p.birthday)<br>  
  29. #end  
  30. <hr>  
  31. request范围数据<br>  
  32. $requestData<br>  
  33. session范围数据<br>  
  34. $sessionData<br>  
  35. </body>  
  36. </html>  

 呼~~写完了终于,把tomcat发动起来,看一下效果吧。

0 0
原创粉丝点击