在 Spring mvc3.0 rest风格 Spring mvc 入门(一)已经讲过了怎样打造一个简单的rest风格的请求方式
下面将会接着讲怎样在spring mvc3中支持velocity模板
在(一)中,我配置的viewResolver是 org.springframework.web.servlet.view.JstlView这个是普通的Jstl形式的视图
我们要将
<bean id="viewResolver" class="org.springframework.web.servlet.view.JstlView"> <property name="prefix" value=""/> <property name="suffix" value=".vm"/> </bean>
改为
<bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver"> <property name="cache" value="true"/> <property name="prefix" value=""/> <property name="suffix" value=".vm"/> <property name="contentType"><value>text/html;charset=UTF-8</value></property> </bean><!-- prefix先暂时置为空,因为velocity还有另外一个配置。把.jsp修改位.vm模板格式,然后必须加入contentType这一项
来设置编码,要不然在引用模板的时候页面很容易就出现乱码的情况-->
另外velocity还需要另外一个 配置就是告诉spring velocity存放模板的地方
<bean id="velocityConfigurer" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"> <property name="resourceLoaderPath" value="/WEB-INF/velo/"/> <property name= "velocityProperties"> <props> <prop key="input.encoding">utf-8</prop> <prop key="output.encoding">utf-8</prop> </props> </property> </bean>
在上面的xml里面最好也配置上编码格式,注意resourceLoaderPath这个属性,我配置的是 /WEB-INF/velo/ 所以他默认就去这个目录下面去找*.vm格式的文件了,之所以在viewResolver那里的prefix的原因就是因为在这里已经配置过了,如果你
在viewResovler里面再次配置 WEB-INF/velo/那么,在请求的时候将会抛出在/WEB-INF/veloc/目录下无法找到welcome.vm文件
在经过上面配置之后
我写个测试类
@Controller public class Welcome { @RequestMapping(value ="/welcome/user") public ModelAndView welcome(HttpServletRequest request,HttpServletResponse response, ModelMap modelMap) { return new ModelAndView("welcome",modelMap); //普通转向 } @RequestMapping(value ="/welcome/ordinary") public ModelAndView ordinary(HttpServletRequest request,HttpServletResponse response, ModelMap modelMap) { //velocity测试 List<String> strlist = new ArrayList<String>(); for(int i=0;i<10;i++) { strlist.add("list字符"+i); } modelMap.put("strlist", strlist); Map<String,String> map = new HashMap<String,String>(); for(int i=0;i<10;i++) { map.put("zifu"+i, "map字符"+i); } map.put(null, "哦"); modelMap.put("map", map); List<User> objlist = new Stack<User>(); for(int i=0;i<10;i++) { objlist.add(new User("name"+i,"nick"+i)); } modelMap.put("uselist", objlist); return new ModelAndView("ordinary",modelMap); } public class User { private String username; private String nickname; public User(String username, String nickname) { this.username = username; this.nickname = nickname; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } } }
上面是一个controller
下面是一个velocity模板,简单的循环的例子:
<html> <head> <title>Oridnary</title> </head> <body> #include("style/headtitle.vm") <div> 这是一个普通的页面 <img alt="微笑" src="../im/xiao.gif"> </div> <div> <div style="border:1px dashed black;width:300px;float:left;margin-left:10px;padding-left:10px;"> strlist: <div> <ul> #foreach($str in $strlist) <li>${str}</li> #end </ul> </div> </div> <div style="border:1px dashed black;width:300px;float:left;margin-left:10px;padding-left:10px;"> map: <div> <ul> #foreach($ma in $map.entrySet()) <li>$!{ma.key}-${ma.value}</li> #end </ul> </div> </div> <div style="border:1px dashed black;width:300px;float:left;margin-left:10px;padding-left:10px;"> object: <div> <ul> #foreach($user in $uselist) <li>${user.username}-${user.nickname}</li> #end </ul> </div> </div> </div> </body> </html>
下面是 headtitle.vm 仅仅只是个例子,比较简单,各位莫见笑
<div> 这是一个头 </div>
保存,然后启动服务器
输入:http://localhost:8080/Proj/welcome/ordinary 这样就会看到一个完整的html模板了
如下图见附件