spring mvc+velocity+maven
在之前实习单位实习的时候,并不是用jsp,而是用的velocity,现在换了一个单位,一时用jsp不习惯,感觉velocity比jsp好用,就学起来吧~
一、构建maven项目
这个不赘述了,之前的博客有写过,大同小异,下面附链接:
项目结构:
二、配置文件
1.pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.xiaomi</groupId> <artifactId>spring-mvc-volecity</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>spring-mvc-volecity Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <!--Spring相关--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.3.10.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.3.10.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.10.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.3.10.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.3.10.RELEASE</version> </dependency> <!--一定要引用commons-io哦!--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-io</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.10.RELEASE</version> </dependency> <!--velocity相关--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.3.10.RELEASE</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity</artifactId> <version>1.7</version> </dependency> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-tools</artifactId> <version>2.0</version> </dependency> </dependencies> <build> <finalName>spring-mvc-velocity</finalName> </build> </project>
2.velocity配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <mvc:annotation-driven/><!--**@controller模式--> <context:component-scan base-package="controllers"/>
<!--配置VelocityConfigurer,负责在Spring中设置Velocity引擎,通过属性resourceLoaderPath告诉Velocity去哪里寻找它的模板。 通常将模板放在WEB-INT的某个子目录下,可以保证这些模板不被直接访问--> <!--方法一:通过properties配置文件配置--> <!--<bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">--> <!--<property name="resourceLoaderPath" value="/WEB-INF/views/"/>--> <!--<property name="configLocation" value="classpath:/common/velocity.properties"/>--> <!--</bean>--> <!--方法二:直接通过属性配置--> <bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"><property name="resourceLoaderPath" value="/WEB-INF/views"/> <property name="velocityProperties"> <props> <prop key="directive.foreach.counter.name">loopCounter</prop> <prop key="directive.foreach.counter.initial.value">0</prop> <prop key="input.encoding">UTF-8</prop> <prop key="output.encoding">UTF-8</prop> </props> </property> </bean>
<!--配置视图--> <bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityLayoutViewResolver"><property name="cache" value="true"/> <property name="prefix" value="/"/> <property name="suffix" value=".vm"/> <property name="order" value="1"/><!--多ViewResovler配置--> <property name="requestContextAttribute" value="rc"/><!--request属性引用名称--> <!--解决中文乱码问题--> <property name="contentType"> <value> text/html;charset=UTF-8 </value> </property> <property name="layoutUrl" value="layout/layout.vm"/> </bean></beans> 注意:在配置视图时,如果不需要使用layout布局,那么class="org.springframework.web.servlet.view.velocity.VelocityViewReselver",但是如果使用layout布局,class就要使用org.springframework.web.servlet.view.velocity.VelocityLayoutViewReselver.
3.web.xml
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>Archetype Created Web Application</display-name> <!--非maven项目中默认会去/WEB-INF/目录下寻找applicationContext.xml配置文件,如果在maven项目下,该文件放在resources下 如果有指定特定的配置文件,需要在<context-param>节点下重写,否则会报错,且这段配置应该尽量靠前--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:velocity-servlet.xml</param-value> </context-param> <listener> <description>spring</description> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:velocity-servlet.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
三、vm
velocity的文件后缀是.vm,这里我用了layout布局,所以在WEB-INF/views/layout下创建layout.vm,一般来说,layout.vm格式如下:
<html> <head> <title>$!page_title</title> </head> <body> <div class="content"> #parse("/common/header.vm") <div class="content-info"> #parse("/common/leftMenu.vm") <div class="content-main"> $screen_content ## 视图页嵌套的内容就在$screen_content中渲染 </div> </div> #parse("/common/footer.vm") <div> </body> </html>
注:视图页嵌套的内容就在$screen_content中渲染,具体原理大概就是velocity引擎渲染请求所返回的页面,作为一个string类型的参数传递给layout,参数名称就是screen_content,然后再次调用velocity引擎渲染。如果你想要使用其他的layout,只需要写一个$screen_content就行,这个layout并没有header、footer等,只有一行$screen_content,然后通过#Set($layout="/yourLayout.vm")强制使用。默认的header等是我们上面这个layout.vm中的哦!
2./commons/header.vm
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="Cache-Control" content="no-store"/> <meta http-equiv="Pragma" content="no-cache"/> <meta http-equiv="Expires" content="3600"/> <meta content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no" name="viewport"> <div> <h1>header</h1> <hr> </div>
3./common/leftMenu.vm
<div> leftMenu </div>
4./common/footer.vm
<div> footer </div>
5.welcome.vm
#set($layout="/layout/layout.vm") <h3>test</h3><br/> #foreach($city in $cityList) <p>${city}</p> #end
四、controller
@Controller public class testvelocity { @RequestMapping("/welcome") public ModelAndView printWelcome(HttpServletRequest req){ ModelAndView mv=new ModelAndView(); List<String> list=new ArrayList<String>(); list.add("北京"); list.add("上海"); list.add("广州"); list.add("深圳"); mv.addObject("cityList",list); mv.setViewName("welcome"); return mv; } }
五、测试
注:这里我没有进行布局,所以看起来比较乱