Velocity笔记下
Velocity与struts结合应用:
具体通过一个实际的例子来解释,例子选择以传统的注册模块为主(主要是joseph的书上就这么写的)
首先,web.xml文件配置情况struts部分就不讲了,velocity的配置如下所示:
<servlet>
<servlet-name>velocity</servlet-name>
<servlet-class>org.apache.velocity.tools.view.servlet.
VelocityViewServlet</servlet-class>
<init-param>
<param-name>toolbox</param-name>
<param-value>/WEB-INF/toolbox.xml</param-value>
</init-param>
<load-on-startup>10</load-on-startup>
</servlet>
<!-- Action Servlet Mapping -->
<servlet-mapping>
<servlet-name>velocity</servlet-name>
<url-pattern>*.vm</url-pattern>
</servlet-mapping>
其中velocity的servlet配置中的初始参数传入了toolbox.xml,该文件的具体内容如下:
<?xml version="1.0"?>
<toolbox>
<tool>
<key>toolLoader</key>
<class>org.apache.velocity.tools.tools.ToolLoader</class>
</tool>
<tool>
<key>link</key>
<class>org.apache.velocity.tools.struts.LinkTool</class>
</tool>
<tool>
<key>msg</key>
<class>org.apache.velocity.tools.struts.MessageTool</class>
</tool>
<tool>
<key>errors</key>
<class>org.apache.velocity.tools.struts.ErrorsTool</class>
</tool>
<tool>
<key>form</key>
<class>org.apache.velocity.tools.struts.FormTool</class>
</tool>
</toolbox>
这个xml文件的意义就在于定义了很多类,来串联整个struts和velocity还有javabean等各个元素。
接着就开始配置struts了,首先考虑到这个应用,struts的第一步就是要写form了。首先构建一个RegisterForm。代码如下,这个javabean用来当做model定义数据。
package app;
import org.apache.struts.action.*;
publicclass RegisterForm extends ActionForm {
protected String username;
protected String password;
protected String password2;
public String getUsername() { returnthis.username; }
public String getPassword() { returnthis.password; }
public String getPassword2() { returnthis.password2; }
publicvoid setUsername(String username) { this.username = username; };
publicvoid setPassword(String password) { this.password = password; };
publicvoid setPassword2(String password) { this.password2 = password; };
}
该javabean有3个field属性,分别是username用户名,password密码和password2验证密码。
接着写控制处理逻辑RegisterAction。代码如下:
package app;
import org.apache.struts.action.*;
import javax.servlet.http.*;
import java.io.*;
publicclass RegisterAction extends Action {
public ActionForward perform(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
RegisterForm rf = (RegisterForm) form;
String username = rf.getUsername();
String password = rf.getPassword();
String password2 = rf.getPassword2();
if (password.equals(password2)) {
return mapping.findForward("success");
}
return mapping.findForward("failure");
}
}
通过form表单读入数据,如果密码和验证密码相同,那么就跳到success,否则是failure,这个逻辑非常简单。Struts中也看不出任何的velocity相关(那当然,这就叫低耦合,各干各的,分层处理)
然后该配置熟悉的struts-config.xml了。核心代码如下:
<struts-config>
<form-beans>
<form-bean name="registerForm" type="RegisterForm"/>
</form-beans>
<action-mappings>
<action path="/struts"
type="RegisterAction"
name="registerForm">
<forward name="success" path="/success.vm"/>
<forward name="failure" path="/failure.vm"/>
</action>
</action-mappings>
</struts-config>
配置文件与传统的struts出奇的一致,唯一变化的就是在forward里的path写成了vm文件,而不是我们传统的jsp。
好了,写到现在,MVC中的M和C都完成了,该是velocity上场了——View层。
注册页面register.vm的核心代码:
<form action="struts.do" method="post">
username: <input type="text" name="username"/><BR>
password: <input type="text" name="password"/><BR>
again : <input type="text" name="password2"/><BR>
<input type="submit" name="submit" value="Register"/>
</form>
Success跳转页面success.vm:
<HTML>
<HEAD>
<TITLE>Success</TITLE>
</HEAD>
<BODY>
Registration Success!
Thanks for logging in $!registerForm.username
<P><A href="register.vm">Try Another?</A></P>
</BODY>
</HTML>
其中只用到了一个$!registerForm.username。整个代码完成了,压根没用到什么context之类的东西。
源代码来自http://www.wiley.com//legacy/compbooks/gradecki/apache/index.html
下载ch17.zip即可。
另http://www.ibm.com/developerworks/cn/java/j-sr1.html里George Franciscus讲的也很详细。