搭建SSH,从零开始(第N天)—在Struts2中集成Velocity

一,Velocity是什麽?

具体概念在百度中都能找到,不赘述。可以参见http://airport.iteye.com/blog/23634

简单点说,Velocity与JSP类似。就是一个模板技术,通过后台JAVA程序进行变量的计算和赋值,前端模板vm文件使用后台计算的变量排版表示。优点是

1,可以不使用JSP的Taglib,容易扩展
2,完全的界面design和后台分离。互不影响
3,与jsp相比,效率更高

二,Struts2与Velocity的集成方法

参考资料:https://struts.apache.org/docs/velocity.html

1,依赖Jar包导入

最新的Struts2中已经提供了集成Velocity时所需的依赖jar包,集成时需要导入以下Jar包(struts-2.3.20-all\struts-2.3.20\lib)。
・velocity-tools-1.3.jar
・velocity-1.6.4.jar
・commons-collections-3.1.jar
・commons-lang-2.4.jar

2,配置文件Check

检查 struts-default.xml文件中 Velocity Result是否已配置。
struts-default.xml路径:struts2-core-2.3.20.jar/ struts-default.xml
 

3,在Struts2中使用Velocity

1的依赖和2的配置都OK的话,可以直接使用Velocity模板。配置如下,在Result中声明type为velocity并跳转到vm模板
		<action name="testLogin" class="gravehistory.test.struts.LoginAction">
			<result name="fail">/test/login.jsp</result>
			<result name="input">/test/login.jsp</result>
			<result name="success" type="velocity">/test/test-success.vm</result>
		</action>
test-success.vm
<html>
<head>
    <title>Hello</title>
</head>
<body>
 
Hello, $userName
 
</body>
以上userName在LoginAction做为属性被定义
<pre name="code" class="java">public class LoginAction extends ActionSupport {
	private String userName;
	private String passWord;

	public void validate() {
		 //省略
	}

	public String execute() {
		//useraname的赋值等
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getPassWord() {
		return passWord;
	}

	public void setPassWord(String passWord) {
		this.passWord = passWord;
	}
}

</html>
 
   

4,显示效果:

提交后
 

三,Velocity中自定义Macro的使用和配置

如果Velocity提供的标签不能满足需求,可以基于现有的标签创建新的macro对其进行扩展。macro是可嵌套的。
所谓的macro,可以理解为vm中的一个函数,传入参数,获取处理后的html片段,支持html标签。

1,创建macro文件,定义新的macro

创建文件WEB-INF\vm\macro.vm
#macro(test $msg)
<h1>*****$!{msg}*****<h1>
#end

2,配置velocity,使其可以使用自定义的macro

velocity的配置文件为velocity.properties,路径为WEB-INF\velocity.properties
配置内容
velocimacro.library = WEB-INF/vm/macro.vm

3,vm中使用方法

修改后的test-success.vm
<html>
<head>
    <title>Hello</title>
</head>
<body>
 
Hello, #test($userName)
 
</body>
</html>

4,显示效果

四,其它问题说明

按照之前的的配置和部署在Local环境下,可正常运行。在远程服务器上发现有如下问题:
问题1:提示/test/test-success.vm 找不到
解决方法1:将/test/test-success.vm放在resources目录下,编译至classpath
 
问题2:/test/test-success.vm可以访问,但是自定义macro不起作用
解决方法:之前放在/WEB-INFO下的velocity.properties未被找到,所以将velocity.properties也放在resources目录下
 
问题3:velocity.properties可以被访问,但使用自定macro时,velocity.properties中配置的macro库找不到
解决方法:将macro库放到resources目录下,并修改velocity.properties
修改后的目录结构如下

猜你喜欢

转载自tpglzu2015.iteye.com/blog/2202917