软件项目培训及课程设计指导——如何使用MyEclipse开发工具开发基于Velocity模板的Web应用
1、在MyEclipse开发工具中新建一个名为WebVelocity的Web项目
在名为WebVelocity的J2EE Web应用项目的lib目录下添加Velocity模板所需的JAR包文件velocity-1.6.1-dep.jar,最终运行结果截图如右图所示。
由于Velocity模板的系统库在不断更新和升级,读者可以从Velocity官网下载Velocity的系统运行时包文件和技术参考文档等系统库和资料,然后解压系统库的运行时包文件。 请参阅右侧显示的下载页面。
2.在Web项目中添加一个文件名为userLogin.jsp的JSP页面
在userLogin.jsp的JSP页面中添加Web表单来实现应用系统的用户登录功能,并向应用系统后台的Servlet组件发送Web请求。 userLogin.jsp的JSP页面的内容标签,请参见以下示例所示的内容——名为userLogin.jsp的JSP页面的内容。
My JSP 'userLogin.jsp' starting page
请输入用户名称:
请输入用户密码:
userLogin.jsp 的 JSP 页面在 Web 浏览器中的执行结果如下面的示例图所示,其中包含一个用于收集用户登录信息的 Web 表单。
3. 在Web项目中添加另一个Servlet组件
Servlet类名为UserLoginServlet,包名为com.px1987.webvelocity.servlet,它继承自org.apache.velocity.servlet.VelocityServlet类,URL-Pattern为/userloginservlet。 Servlet类的代码内容请参见下面的代码示例中UserLoginServlet类的代码示例。
在新版本的Velocity模板系统库中,VelocityServlet类被升级并替换为VelocityViewServlet(org.apache.velocity.tools.view.VelocityViewServlet)类。 读者在开发时只需将VelocityServlet类改为VelocityViewServlet类即可。
(1)编写Servlet类的程序代码——UserLoginServlet类代码示例
package com.px1987.webvelocity.servlet;
import java.io.*;
import java.util.Properties;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.velocity.Template;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.context.Context;
import org.apache.velocity.exception.*;
import org.apache.velocity.servlet.VelocityServlet;
public class UserLoginServlet extends VelocityServlet{
protected Properties loadConfiguration(ServletConfig config ) throws
IOException,FileNotFoundException{
String propsFile = config.getInitParameter("properties");
if ( propsFile != null ){
String realPath = getServletContext().getRealPath(propsFile);
if ( realPath != null ) {
propsFile = realPath;
}
}
Properties onePropertiesObject = new Properties();
onePropertiesObject.load( new FileInputStream(propsFile) );
String propertiesFilePath = onePropertiesObject.getProperty("file.resource.loader.path");
if (propertiesFilePath!= null){
propertiesFilePath = getServletContext().getRealPath(path);
onePropertiesObject.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, path );
}
/** 设置模板的资源位置 */
propertiesFilePath = onePropertiesObject.getProperty("runtime.log");
if (propertiesFilePath!= null){
propertiesFilePath = getServletContext().getRealPath(path);
onePropertiesObject.setProperty("runtime.log", propertiesFilePath);
}
return onePropertiesObject;
}
public Template handleRequest(HttpServletRequest request,
HttpServletResponse response, Context context )
throws ServletException, IOException{
String userName =request.getParameter("userName");
String userPassword= request.getParameter("userPassword");
context.put("userName", userName);
context.put("userPassword", userPassword);
Template outTemplate = null;
try {
outTemplate =getTemplate("WebVelocityApp.html");
}
catch( ParseErrorException e ){
request.setAttribute("errorText","不能对模板进行解析" );
error(request,response,e);
}
catch( ResourceNotFoundException e ){
request.setAttribute("errorText","没有找到模板文件" );
error(request,response,e);
}
catch( Exception e ){
request.setAttribute("errorText","出现了其它方面的错误" );
error(request,response,e);
}
return outTemplate;
}
/** 异常处理也都交到error方法处理,可以覆盖基类中的error的处理办法,从而实现对异常的封装和包裹。*/
protected void error( HttpServletRequest request, HttpServletResponse response,
Exception cause ) throws ServletException, IOException{
String errorText = (String) request.getAttribute("errorText");
StringBuffer oneStringBuffer = new StringBuffer();
oneStringBuffer.append("");
oneStringBuffer.append("");
oneStringBuffer.append("错误信息显示页面 ");
oneStringBuffer.append(""+ errorText+"
错误出现的位置:
");
StringWriter oneStringWriter = new StringWriter();
cause.printStackTrace(new PrintWriter(oneStringWriter));
oneStringBuffer.append(oneStringWriter.toString());
oneStringBuffer.append("");
response.setContentType("text/html;charset=gb2312");
PrintWriter webOutPutStream=response.getWriter();
webOutPutStream.print(oneStringBuffer.toString());
}
}
(2)在Web项目的部署描述文件web.xml中部署并定义Servlet类
在部署Servlet类时,还需要为其提供一个名为properties的初始化参数,其值为Velocity模板的属性配置文件velocity.properties的路径信息(在程序UserLoginServlet类中动态获取)。 以下代码示例是用于在 web.xml 文件中部署 UserLoginServlet 类的代码的一部分。
UserLoginServlet
com.px1987.webvelocity.servlet.UserLoginServlet
properties
/velocityConf/velocity.properties
UserLoginServlet
/userloginservlet
4.在Web项目的velocityConf目录下添加Velocity的属性配置文件
在此Web项目中,添加属性配置文件所在的文件目录。 目录名称为velocityConf,在velocityConf目录下添加一个名为velocity.properties的文件。设置该文件的内容请参见下面代码示例——Velocity Template的velocity.properties属性配置文件示例引擎(模板引擎)
file.resource.loader.path = /
runtime.log = /velocity.log
该文件是Velocity模板引擎的初始化参数文件。 Web应用系统的开发人员可以在其中设置相关的工作参数。 这些工作参数主要是Velocity模板引擎配置、编码、缓存、日志等工作参数的定义。
当然,Velocity模板引擎中预设了一些默认配置属性,以防止开发人员错误配置项目。 通过配置velocity.properties文件,Web应用系统的开发人员可以自定义vm文件的加载形式、指定编码等。
当然个人网站web模板,你也可以使用默认值而不配置velocity.properties文件。 以下代码示例是velocity.properties 文件的更具代表性的配置示例。
## 设置Velocity模版引擎的模板文件加载器,webapp从应用根目录加载
resource.loader = webapp
webapp.resource.loader.class =
org.apache.velocity.tools.view.servlet.WebappLoader
## 定义Velocity模版引擎的模板文件路径为Web应用系统的根目录文件夹
webapp.resource.loader.path = /
## 设置Velocity模版引擎的编码方式
input.encoding = UTF-8
output.encoding = UTF-8
读者还可以根据Web应用项目的需要,将“input.encoding”和“output.encoding”设置为英文编码格式,例如GBK或GB2312。
5. 在Web项目中添加另一个webVelocityApp.html模板文件
Velocity模板文件可以是文本格式的文件,该模板文件不仅可以是*.vm模板文件,还可以是HTML或XML等标准格式的文本文件。 因此个人网站web模板,模板文件的文件扩展名可以为*.vm、*.html、*.xml等类型。 模板文件中通常包含以下内容:
1)静态部分原样合并
2) 将被要合并的数据替换的占位符
3) 脚本语言的指示器和指令
因此,在Web项目中添加一个新的HTML页面文件,该文件是一个名为webVelocityApp.html的模板文件,并在该模板文件中添加如下代码示例所示的HTML标签内容——webVelocityApp.html模板文件中的HTML标签内容读者注意宋代标注的词句。
一个简单的VelocityWeb应用页面
下面为Servlet处理后的结果
用户名称 用户密码
$userName $userPassword
由于里面的模板文件是一个完整的HTML文件,因此任何网页设计工具或文本编辑器都可以用来创建和编辑HTML页面文件; 访问模板文件中上下文对象中存储的属性:
例如,$userName 指令可用于引用保存到上面上下文对象的属性。 注意:在 Velocity 模板文件中,变量的定义以“#34;”字符开头,“#34;”则以“#34;”开头。 字符用作 Velocity 模板文件中的标识符。
由于Velocity模板引擎系统使用简单而强大的模板语言VTL来渲染网页,因此可以保证在Dreamwaver等网页可视化编辑器中正常显示; 另外,模板文件可以是任意文件扩展名,可以使用*.vm、*.html或*.xml(本例使用*.html文件扩展名),这样就可以直接看到预览的效果Web 浏览器中的网页。
6. 执行Web应用程序并测试Velocity模板的功能功效
读者可以直接在浏览器中输入以下URL地址字符串,直接浏览用户登录页面: 请求8080/WebVelocity/userLogin.jsp的URL地址后,会出现如下图所示的实现用户登录功能的页面。
读者在上图所示的Web表单框中输入用户名和密码,然后点击“提交”按钮,Web表单页面就会向Web应用系统后台的Servlet组件提交Web请求,最后会出现下图所示的执行结果状态——为了验证Velocity模板引擎应用的正确性,本示例在响应页面中获取用户的登录账号、密码等信息,然后显示在页面对比是否正确获取相关数据。
从执行结果和网页浏览器中最终响应输出信息来看,本示例的功能是正确的,Velocity模板引擎的应用也是合理正确的。
当然,在实际的Web应用系统的业务处理逻辑中,用户的敏感登录信息不会简单直接地显示出来,而是通过在系统后台访问数学数据库系统中的数据库表中的数据、比较用户提交的登录信息是否合法有效。
此外,webVelocityApp.html 页面是静态 HTML 页面,而不是动态服务器端 JSP 页面。 如果本Web示例中不使用Velocity模板引擎系统,则很难在静态HTML页面中获取服务器返回的业务处理。 结果的参数。
因此,网页的响应速度将大大增强,使得采用Velocity模板技术的网页可以是非JSP类型的网页——达到“内容动态静态”的应用效果。
如何在Web应用系统的表示层开发中应用Velocity模板技术
利用XML+XSLT技术分离Web应用表示层数据和样式的示例
如何应用“XML+XSLT”技术分离Web表现层数据和样式
如何正确应用Web MVC架构模式来分离表现层和模型层的耦合关系
如何应用CSS+Div分离Web表示层的数据处理逻辑和解释逻辑
发表评论