在 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模板了
如下图见附件