Spring 集成Velocity,代替JSP输出自定义页面
摘要:介绍如何配置Spring和velocity的集成,并有完整的例子,要求读者掌握spring和Velocity的一般用法,并了解java web应用的配置和规范。
Ø 为什么要代替JSP?
JSP是 动态网页,它这web服务器中会编译生成html页面显示到终端用户的浏览器上,但是在很多情况下,我们并不需要html页面,我们的终端用户不支持html浏览,例如恒生电子的“投资赢家”,“泉友通”等客户端,它们显示的页面是HSML规范的页面,这种情况下,JSP是不可行的。
因此web服务端必须能够提供一种机制,既要像JSP那样动态的加载数据,又要输出我们自定义的页面格式(这里是HSML页面为例,我们公司自己定义的一种标识语言,类似于html,用了多年不肯放弃)。
动态生成需要一个模版生成器,广泛使用而且备受好评的是velocity和freemarker,并且都是开源,可以集成到商业产品中。利用spring集成Velocity的完美结合,可以完全代替JSP,实现自定义页面的输出。下面创建一个应用来实现。
Ø Java web应用实现
1. 准备
spring3.0.2
velocity1.5.0
velocity-tool-view1.4
关于springframwork的jar包与其依赖请注意版本搭配(之前用过spring2.5.6搭配几个版本的ibatis都不能成功加载Dao),有些jar是可以兼容其它版本的,有些却不行,这里spring3.0.2只用velocity1.5.0和velocity-tool-view1.4,其它版本未经过测试。
springframwork的各个jar之间的关系很微妙,有些jar未必用得到,这里将常用的包都加到classpath中了。把这些jar放在java web应用的WEB-INF/lib目录下。
2. 配置WEB-INF/web.xml添加spring-web支持:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
3. WEB-INF/web.xml中配置hsml servlet:
<servlet>
<servlet-name>hsml</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>hsml</servlet-name>
<url-pattern>/hsml/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>/hsml/init</welcome-file>
</welcome-file-list>
Spring会根据配置的servlet name“hsml”来读取对应的“WEB-INF/hsml-servlet.xml”文件,在这个文件中配置VelocityViewResolver,即当spring收到/hsml/*的请求时,会调用这个viewResolver。
<bean id="velocityConfigurer"
class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
<property name="resourceLoaderPath" value="/WEB-INF/views/" />
</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=".hsml" />
</bean>
4. 编写页面
在/WEB-INF/views/目录下新增一个init.hsml文件:
<hsml>
<body>
Hello World!
</body>
</hsml>
5. 编写Controller
新增一个类为com.hundsun.velocity.tools.view.InitController.java:
package com.hundsun.velocity.tools.view;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class InitController {
@RequestMapping("/init")
public String init(Model model) {
return "init";
}
}
并且将它注册到WEB-INF/hsml-servlet.xml文件中
<bean id="initController" class="com.hundsun.velocity.tools.view.InitController" />
完成后将其部署到tomcat上,用自定义浏览器打开连接,或者你可以用http抓包工具查看。
6. 加载javabean:
后面将会示范如果利用spring的强大功能,管理javabean,把javabean的字段值显示出来。
新增一个类User
package com.hundsun.wap.data.output;
public class User {
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
注册到spring配置中WEB-INF/applicationContext.xml:
<bean id="user" class="com.hundsun.wap.data.output.User">
<property name="username" ref="Hundsun"/>
</bean>
并对InitController修改:
@Controller
public class InitController {
private final User user;
@RequestMapping("/init")
public String init(Model model) {
model.addAttribute("user", this.user);
return "init";
}
@Autowired
public InitController(User user){
this.user= user;
}
}
修改页面init.hsml
<hsml>
<body>
Hello ${user.username}!
</body>
</hsml>
完成后将其重新部署到tomcat上,用自定义浏览器打开连接。
可以根据实际开发需要在Controller中添加Dao,即可实现数据库支持。