Velocity 的应用示例
关键字:Java, JSP, Servlet, template, 模板, Apache, Jakarta, Velocity
读者要求:了解 Java Servlet 基本概念
Velocity 是一个基于 Java 的通用模板工具,来自于 jakarta.apache.org 。
Velocity 的介绍请参考 Velocity -- Java Web 开发新技术。这里是它的一个应用示例。
这个例子参照了 PHP-Nuke 的结构, 即所有 HTTP 请求都以 http://www.some.com/xxx/Modules?name=xxx&arg1=xxx&bbb=xxx 的形式进行处理。例子中所有文件都是 .java 和 .html , 没有其他特殊的文件格式。除了 Modules.java 是 Java Servlet, 其余的 .java 文件都是普通的 Java Class.
所有 HTTP 请求都通过 Modules.java 处理。Modules.java 通过 Velocity 加载 Modules.htm。 Modules.htm 有页头,页脚,页左导航链接,页中内容几个部分。其中页头广告、页中内容是变化部分。页头广告由 Modules.java 处理,页中内容部分由 Modules.java dispatch 到子页面类处理。
1) Modules.java
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.velocity.*;
import org.apache.velocity.context.*;
import org.apache.velocity.exception.*;
import org.apache.velocity.servlet.*;
import commontools.*;
public class Modules
extends VelocityServlet {
public Template handleRequest(HttpServletRequest request,
HttpServletResponse response,
Context context) {
//init
response.setContentType("text/html; charset=UTF-8");
response.setCharacterEncoding("utf-8");
//prepare function page
ProcessSubPage page = null;
ProcessSubPage mainPage = new HomeSubPage();
String requestFunctionName = (String) request.getParameter("name");
boolean logined = false;
String loginaccount = (String) request.getSession(true).getAttribute(
"loginaccount");
if (loginaccount != null) {
logined = true;
}
//default page is mainpage
page = mainPage;
if (requestFunctionName == null||requestFunctionName.equalsIgnoreCase("home")) {
page = mainPage;
}
//no login , can use these page
else if (requestFunctionName.equalsIgnoreCase("login")) {
page = new LoginProcessSubPage();
}
else if (requestFunctionName.equalsIgnoreCase("ChangePassword")) {
page = new ChangePasswordSubPage();
}
else if (requestFunctionName.equalsIgnoreCase("ForgetPassword")) {
page = new ForgetPassword();
}
else if (requestFunctionName.equalsIgnoreCase("about")) {
page = new AboutSubPage();
}
else if (requestFunctionName.equalsIgnoreCase("contact")) {
page = new ContactSubPage();
}
//for other page, need login first
else if (logined == false) {
page = new LoginProcessSubPage();
}
else if (requestFunctionName.equalsIgnoreCase("listProgram")) {
page = new ListTransactionProgramSubPage();
}
else if (requestFunctionName.equalsIgnoreCase(
"ViewProgramItem")) {
page = new ViewTransactionProgramItemSubPage();
}
else if (requestFunctionName.equalsIgnoreCase(
"UpdateProgramObjStatus")) {
page = new UpdateTransactionProgramObjStatusSubPage();
}
else if (requestFunctionName.equalsIgnoreCase(
"Search")) {
page = new SearchSubPage();
}
//check if this is administrator
else if (Utilities.isAdministratorLogined(request)) {
//Utilities.debugPrintln("isAdministratorLogined : true");
if (requestFunctionName.equalsIgnoreCase("usermanagement")) {
page = new UserManagementSubPage();
}
else if (requestFunctionName.equalsIgnoreCase(
"UploadFiles")) {
page = new UploadFilesSubPage();
}
else if (requestFunctionName.equalsIgnoreCase(
"DownloadFile")) {
page = new DownloadFileSubPage();
}
else if (requestFunctionName.equalsIgnoreCase(
"Report")) {
page = new ReportSubPage();
}
}
else {
//no right to access.
//Utilities.debugPrintln("isAdministratorLogined : false");
page = null;
}
//Utilities.debugPrintln("page : " + page.getClass().getName());
if(page != null){
context.put("function_page",
page.getHtml(this, request, response, context));
}else{
String msg = "Sorry, this module is for administrator only.You are not administrator.";
context.put("function_page",msg);
}
context.put("page_header",getPageHeaderHTML());
context.put("page_footer",getPageFooterHTML());
Template template = null;
try {
template = getTemplate("/templates/Modules.htm"); //good
}
catch (ResourceNotFoundException rnfe) {
Utilities.debugPrintln("ResourceNotFoundException 2");
rnfe.printStackTrace();
}
catch (ParseErrorException pee) {
Utilities.debugPrintln("ParseErrorException2 " + pee.getMessage());
}
catch (Exception e) {
Utilities.debugPrintln("Exception2 " + e.getMessage());
}
return template;
}
/**
* Loads the configuration information and returns that information as a Properties, e
* which will be used to initializ the Velocity runtime.
*/
protected java.util.Properties loadConfiguration(ServletConfig config) throws
java.io.IOException, java.io.FileNotFoundException {
return Utilities.initServletEnvironment(this);
}
}
2) ProcessSubPage.java , 比较简单,只定义了一个函数接口 getHtml
import javax.servlet.http.*;
import org.apache.velocity.context.*;
import org.apache.velocity.servlet.*;
import commontools.*;
public abstract class ProcessSubPage implements java.io.Serializable {
public ProcessSubPage() {
}
public String getHtml(VelocityServlet servlet, HttpServletRequest request,
HttpServletResponse response,
Context context) {
Utilities.debugPrintln(
"you need to override this method in sub class of ProcessSubPage:"
+ this.getClass().getName());
return "Sorry, this module not finish yet.";
}
}
他的 .java 文件基本上是 ProcessSubPage 的子类和一些工具类。 ProcessSubPage 的子类基本上都是一样的流程, 用类似
context.put("page_footer",getPageFooterHTML());
的写法置换 .html 中的可变部分即可。如果没有可变部分,完全是静态网页,比如 AboutSubPage, 就更简单。
3) AboutSubPage.java
import org.apache.velocity.servlet.VelocityServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.velocity.context.Context;
public class AboutSubPage extends ProcessSubPage {
public AboutSubPage() {
}
public String getHtml(VelocityServlet servlet, HttpServletRequest request,
HttpServletResponse response, Context context) {
//prepare data
//context.put("xxx","xxxx");
Template template = null;
String fileName = "About.htm";
try {
template = servlet.getTemplate(fileName);
StringWriter sw = new StringWriter();
template.merge(context, sw);
return sw.toString();
}
catch (Exception ex) {
return "error get template " + fileName + " " + ex.getMessage();
}
}
}
其他 ProcessSubPage 的子类如上面基本类似,只不过会多了一些 context.put("xxx","xxxx") 的语句。
通过以上的例子,我们可以看到,使用 Velocity + Servlet , 所有的代码为: 1 个 java serverlet + m 个 java class + n 个 Html 文件。
这里是用了集中处理,然后分发(dispatch)的机制。不用担心用户在没有登陆的情况下访问某些页面。用户验证,页眉页脚包含都只写一次,易于编写、修改和维护。代码比较简洁,并且很容易加上自己的页面缓冲功能。可以随意将某个页面的 html 在内存中保存起来,缓存几分钟,实现页面缓冲功能。成功、出错页面也可以用同样的代码封装成函数,通过参数将 Message/Title 传入即可。
因为 Java 代码与 Html 代码完全在不同的文件中,美工与java代码人员可以很好的分工,每个人修改自己熟悉的文件,基本上不需要花时间做协调工作。而用 JSP, 美工与java代码人员共同修改维护 .jsp 文件,麻烦多多,噩梦多多。而且这里没有用 xml ,说实话,懂 xml/xls 之类的人只占懂 Java 程序员中的几分之一,人员不好找。
因为所有 java 代码人员写的都是标准 Java 程序,可以用任何 Java 编辑器,调试器,因此开发速度也会大大提高。美工写的是标准 Html 文件,没有 xml, 对于他们也很熟悉,速度也很快。并且,当需要网站改版的时候,只要美工把 html 文件重新修饰排版即可,完全不用改动一句 java 代码。
爽死了!!
4) 工具类 Utilities.java
import java.io.*;
import java.sql.*;
import java.text.*;
import java.util.*;
import java.util.Date;
import javax.naming.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.velocity.*;
import org.apache.velocity.app.*;
import org.apache.velocity.context.Context;
import org.apache.velocity.servlet.*;
public class Utilities {
private static Properties m_servletConfig = null;
private Utilities() {
}
static {
initJavaMail();
}
public static void debugPrintln(Object o) {
String msg = "proj debug message at " + getNowTimeString() +
" ------------- ";
System.err.println(msg + o);
}
public static Properties initServletEnvironment(VelocityServlet v) {
// init only once
if (m_servletConfig != null) {
return m_servletConfig;
}
//debugPrintln("initServletEnvironment....");
try {
/*
* call the overridable method to allow the
* derived classes a shot at altering the configuration
* before initializing Runtime
*/
Properties p = new Properties();
ServletConfig config = v.getServletConfig();
// Set the Velocity.FILE_RESOURCE_LOADED_PATH property
// to the root directory of the context.
String path = config.getServletContext().getRealPath("/");
//debugPrintln("real path of / is : " + path);
p.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, path);
// Set the Velocity.RUNTIME_LOG property to be the file
// velocity.log relative to the root directory
// of the context.
p.setProperty(Velocity.RUNTIME_LOG, path +
"velocity.log");
// Return the Properties object.
//return p;
Velocity.init(p);
m_servletConfig = p;
return p;
}
catch (Exception e) {
debugPrintln(e.getMessage());
//throw new ServletException("Error initializing Velocity: " + e);
}
return null;
//this.getServletContext().getRealPath("/");
}
private static void initJavaMail() {
}
public static Connection getDatabaseConnection() {
Connection con = null;
try {
InitialContext initCtx = new InitialContext();
javax.naming.Context context = (javax.naming.Context) initCtx.
lookup("java:comp/env");
javax.sql.DataSource ds = (javax.sql.DataSource) context.lookup(
"jdbc/TestDB");
//Utilities.debugPrintln("ds = " + ds);
con = ds.getConnection();
}
catch (Exception e) {
Utilities.debugPrintln("Exception = " + e.getMessage());
return null;
}
//Utilities.debugPrintln("con = " + con);
return con;
}
public static java.sql.ResultSet excuteDbQuery(Connection con, String sql,
Object[] parameters) {
//Exception err = null;
//Utilities.debugPrintln("excuteDbQuery" + parameters[0] + " ,sql=" + sql);
try {
java.sql.PreparedStatement ps = con.prepareStatement(sql);
for (int i = 0; i < parameters.length; i++) {
processParameter(ps, i + 1, parameters[i]);
}
return ps.executeQuery();
}
catch (Exception e) {
//Utilities.debugPrintln(e.getMessage());
e.printStackTrace();
}
return null;
}
public static void excuteDbUpdate(String sql, Object[] parameters) {
Connection con = Utilities.getDatabaseConnection();
excuteDbUpdate(con, sql, parameters);
closeDbConnection(con);
}
public static void excuteDbUpdate(Connection con, String sql,
Object[] parameters) {
Exception err = null;
try {
java.sql.PreparedStatement ps = con.prepareStatement(sql);
for (int i = 0; i < parameters.length; i++) {
processParameter(ps, i + 1, parameters[i]);
}
ps.execute();
}
catch (Exception e) {
err = e;
//Utilities.debugPrintln(err.getMessage());
e.printStackTrace();
}
}
private static void processParameter(java.sql.PreparedStatement ps,
int index, Object parameter) {
try {
if (parameter instanceof String) {
ps.setString(index, (String) parameter);
}
else {
ps.setObject(index, parameter);
}
}
catch (Exception e) {
//Utilities.debugPrintln(e.getMessage());
e.printStackTrace();
}
}
public static void closeDbConnection(java.sql.Connection con) {
try {
con.close();
}
catch (Exception e) {
Utilities.debugPrintln(e.getMessage());
}
}
public static String getResultPage(
String title, String message, String jumpLink,
VelocityServlet servlet, HttpServletRequest request,
HttpServletResponse response, Context context) {
Template template = null;
context.put("MessageTitle", title);
context.put("ResultMessage", message);
context.put("JumpLink", jumpLink);
try {
template = servlet.getTemplate(
"/templates/Message.htm");
StringWriter sw = new StringWriter();
template.merge(context, sw);
return sw.toString();
}
catch (Exception ex) {
return "error get template Message.htm " + ex.getMessage();
}
}
public static String mergeTemplate(String fileName, VelocityServlet servlet,
Context context) {
Template template = null;
try {
template = servlet.getTemplate(fileName);
StringWriter sw = new StringWriter();
template.merge(context, sw);
return sw.toString();
}
catch (Exception ex) {
return "error get template " + fileName + " " + ex.getMessage();
}
}
}
关键字:Java, JSP, Servlet, template, 模板, Apache, Jakarta, Velocity
读者要求:了解 Java Servlet 基本概念
Velocity 是一个基于 Java 的通用模板工具,来自于 jakarta.apache.org 。
Velocity 的介绍请参考 Velocity -- Java Web 开发新技术。这里是它的一个应用示例。
这个例子参照了 PHP-Nuke 的结构, 即所有 HTTP 请求都以 http://www.some.com/xxx/Modules?name=xxx&arg1=xxx&bbb=xxx 的形式进行处理。例子中所有文件都是 .java 和 .html , 没有其他特殊的文件格式。除了 Modules.java 是 Java Servlet, 其余的 .java 文件都是普通的 Java Class.
所有 HTTP 请求都通过 Modules.java 处理。Modules.java 通过 Velocity 加载 Modules.htm。 Modules.htm 有页头,页脚,页左导航链接,页中内容几个部分。其中页头广告、页中内容是变化部分。页头广告由 Modules.java 处理,页中内容部分由 Modules.java dispatch 到子页面类处理。
1) Modules.java
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.velocity.*;
import org.apache.velocity.context.*;
import org.apache.velocity.exception.*;
import org.apache.velocity.servlet.*;
import commontools.*;
public class Modules
extends VelocityServlet {
public Template handleRequest(HttpServletRequest request,
HttpServletResponse response,
Context context) {
//init
response.setContentType("text/html; charset=UTF-8");
response.setCharacterEncoding("utf-8");
//prepare function page
ProcessSubPage page = null;
ProcessSubPage mainPage = new HomeSubPage();
String requestFunctionName = (String) request.getParameter("name");
boolean logined = false;
String loginaccount = (String) request.getSession(true).getAttribute(
"loginaccount");
if (loginaccount != null) {
logined = true;
}
//default page is mainpage
page = mainPage;
if (requestFunctionName == null||requestFunctionName.equalsIgnoreCase("home")) {
page = mainPage;
}
//no login , can use these page
else if (requestFunctionName.equalsIgnoreCase("login")) {
page = new LoginProcessSubPage();
}
else if (requestFunctionName.equalsIgnoreCase("ChangePassword")) {
page = new ChangePasswordSubPage();
}
else if (requestFunctionName.equalsIgnoreCase("ForgetPassword")) {
page = new ForgetPassword();
}
else if (requestFunctionName.equalsIgnoreCase("about")) {
page = new AboutSubPage();
}
else if (requestFunctionName.equalsIgnoreCase("contact")) {
page = new ContactSubPage();
}
//for other page, need login first
else if (logined == false) {
page = new LoginProcessSubPage();
}
else if (requestFunctionName.equalsIgnoreCase("listProgram")) {
page = new ListTransactionProgramSubPage();
}
else if (requestFunctionName.equalsIgnoreCase(
"ViewProgramItem")) {
page = new ViewTransactionProgramItemSubPage();
}
else if (requestFunctionName.equalsIgnoreCase(
"UpdateProgramObjStatus")) {
page = new UpdateTransactionProgramObjStatusSubPage();
}
else if (requestFunctionName.equalsIgnoreCase(
"Search")) {
page = new SearchSubPage();
}
//check if this is administrator
else if (Utilities.isAdministratorLogined(request)) {
//Utilities.debugPrintln("isAdministratorLogined : true");
if (requestFunctionName.equalsIgnoreCase("usermanagement")) {
page = new UserManagementSubPage();
}
else if (requestFunctionName.equalsIgnoreCase(
"UploadFiles")) {
page = new UploadFilesSubPage();
}
else if (requestFunctionName.equalsIgnoreCase(
"DownloadFile")) {
page = new DownloadFileSubPage();
}
else if (requestFunctionName.equalsIgnoreCase(
"Report")) {
page = new ReportSubPage();
}
}
else {
//no right to access.
//Utilities.debugPrintln("isAdministratorLogined : false");
page = null;
}
//Utilities.debugPrintln("page : " + page.getClass().getName());
if(page != null){
context.put("function_page",
page.getHtml(this, request, response, context));
}else{
String msg = "Sorry, this module is for administrator only.You are not administrator.";
context.put("function_page",msg);
}
context.put("page_header",getPageHeaderHTML());
context.put("page_footer",getPageFooterHTML());
Template template = null;
try {
template = getTemplate("/templates/Modules.htm"); //good
}
catch (ResourceNotFoundException rnfe) {
Utilities.debugPrintln("ResourceNotFoundException 2");
rnfe.printStackTrace();
}
catch (ParseErrorException pee) {
Utilities.debugPrintln("ParseErrorException2 " + pee.getMessage());
}
catch (Exception e) {
Utilities.debugPrintln("Exception2 " + e.getMessage());
}
return template;
}
/**
* Loads the configuration information and returns that information as a Properties, e
* which will be used to initializ the Velocity runtime.
*/
protected java.util.Properties loadConfiguration(ServletConfig config) throws
java.io.IOException, java.io.FileNotFoundException {
return Utilities.initServletEnvironment(this);
}
}
2) ProcessSubPage.java , 比较简单,只定义了一个函数接口 getHtml
import javax.servlet.http.*;
import org.apache.velocity.context.*;
import org.apache.velocity.servlet.*;
import commontools.*;
public abstract class ProcessSubPage implements java.io.Serializable {
public ProcessSubPage() {
}
public String getHtml(VelocityServlet servlet, HttpServletRequest request,
HttpServletResponse response,
Context context) {
Utilities.debugPrintln(
"you need to override this method in sub class of ProcessSubPage:"
+ this.getClass().getName());
return "Sorry, this module not finish yet.";
}
}
他的 .java 文件基本上是 ProcessSubPage 的子类和一些工具类。 ProcessSubPage 的子类基本上都是一样的流程, 用类似
context.put("page_footer",getPageFooterHTML());
的写法置换 .html 中的可变部分即可。如果没有可变部分,完全是静态网页,比如 AboutSubPage, 就更简单。
3) AboutSubPage.java
import org.apache.velocity.servlet.VelocityServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.velocity.context.Context;
public class AboutSubPage extends ProcessSubPage {
public AboutSubPage() {
}
public String getHtml(VelocityServlet servlet, HttpServletRequest request,
HttpServletResponse response, Context context) {
//prepare data
//context.put("xxx","xxxx");
Template template = null;
String fileName = "About.htm";
try {
template = servlet.getTemplate(fileName);
StringWriter sw = new StringWriter();
template.merge(context, sw);
return sw.toString();
}
catch (Exception ex) {
return "error get template " + fileName + " " + ex.getMessage();
}
}
}
其他 ProcessSubPage 的子类如上面基本类似,只不过会多了一些 context.put("xxx","xxxx") 的语句。
通过以上的例子,我们可以看到,使用 Velocity + Servlet , 所有的代码为: 1 个 java serverlet + m 个 java class + n 个 Html 文件。
这里是用了集中处理,然后分发(dispatch)的机制。不用担心用户在没有登陆的情况下访问某些页面。用户验证,页眉页脚包含都只写一次,易于编写、修改和维护。代码比较简洁,并且很容易加上自己的页面缓冲功能。可以随意将某个页面的 html 在内存中保存起来,缓存几分钟,实现页面缓冲功能。成功、出错页面也可以用同样的代码封装成函数,通过参数将 Message/Title 传入即可。
因为 Java 代码与 Html 代码完全在不同的文件中,美工与java代码人员可以很好的分工,每个人修改自己熟悉的文件,基本上不需要花时间做协调工作。而用 JSP, 美工与java代码人员共同修改维护 .jsp 文件,麻烦多多,噩梦多多。而且这里没有用 xml ,说实话,懂 xml/xls 之类的人只占懂 Java 程序员中的几分之一,人员不好找。
因为所有 java 代码人员写的都是标准 Java 程序,可以用任何 Java 编辑器,调试器,因此开发速度也会大大提高。美工写的是标准 Html 文件,没有 xml, 对于他们也很熟悉,速度也很快。并且,当需要网站改版的时候,只要美工把 html 文件重新修饰排版即可,完全不用改动一句 java 代码。
爽死了!!
4) 工具类 Utilities.java
import java.io.*;
import java.sql.*;
import java.text.*;
import java.util.*;
import java.util.Date;
import javax.naming.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.velocity.*;
import org.apache.velocity.app.*;
import org.apache.velocity.context.Context;
import org.apache.velocity.servlet.*;
public class Utilities {
private static Properties m_servletConfig = null;
private Utilities() {
}
static {
initJavaMail();
}
public static void debugPrintln(Object o) {
String msg = "proj debug message at " + getNowTimeString() +
" ------------- ";
System.err.println(msg + o);
}
public static Properties initServletEnvironment(VelocityServlet v) {
// init only once
if (m_servletConfig != null) {
return m_servletConfig;
}
//debugPrintln("initServletEnvironment....");
try {
/*
* call the overridable method to allow the
* derived classes a shot at altering the configuration
* before initializing Runtime
*/
Properties p = new Properties();
ServletConfig config = v.getServletConfig();
// Set the Velocity.FILE_RESOURCE_LOADED_PATH property
// to the root directory of the context.
String path = config.getServletContext().getRealPath("/");
//debugPrintln("real path of / is : " + path);
p.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, path);
// Set the Velocity.RUNTIME_LOG property to be the file
// velocity.log relative to the root directory
// of the context.
p.setProperty(Velocity.RUNTIME_LOG, path +
"velocity.log");
// Return the Properties object.
//return p;
Velocity.init(p);
m_servletConfig = p;
return p;
}
catch (Exception e) {
debugPrintln(e.getMessage());
//throw new ServletException("Error initializing Velocity: " + e);
}
return null;
//this.getServletContext().getRealPath("/");
}
private static void initJavaMail() {
}
public static Connection getDatabaseConnection() {
Connection con = null;
try {
InitialContext initCtx = new InitialContext();
javax.naming.Context context = (javax.naming.Context) initCtx.
lookup("java:comp/env");
javax.sql.DataSource ds = (javax.sql.DataSource) context.lookup(
"jdbc/TestDB");
//Utilities.debugPrintln("ds = " + ds);
con = ds.getConnection();
}
catch (Exception e) {
Utilities.debugPrintln("Exception = " + e.getMessage());
return null;
}
//Utilities.debugPrintln("con = " + con);
return con;
}
public static java.sql.ResultSet excuteDbQuery(Connection con, String sql,
Object[] parameters) {
//Exception err = null;
//Utilities.debugPrintln("excuteDbQuery" + parameters[0] + " ,sql=" + sql);
try {
java.sql.PreparedStatement ps = con.prepareStatement(sql);
for (int i = 0; i < parameters.length; i++) {
processParameter(ps, i + 1, parameters[i]);
}
return ps.executeQuery();
}
catch (Exception e) {
//Utilities.debugPrintln(e.getMessage());
e.printStackTrace();
}
return null;
}
public static void excuteDbUpdate(String sql, Object[] parameters) {
Connection con = Utilities.getDatabaseConnection();
excuteDbUpdate(con, sql, parameters);
closeDbConnection(con);
}
public static void excuteDbUpdate(Connection con, String sql,
Object[] parameters) {
Exception err = null;
try {
java.sql.PreparedStatement ps = con.prepareStatement(sql);
for (int i = 0; i < parameters.length; i++) {
processParameter(ps, i + 1, parameters[i]);
}
ps.execute();
}
catch (Exception e) {
err = e;
//Utilities.debugPrintln(err.getMessage());
e.printStackTrace();
}
}
private static void processParameter(java.sql.PreparedStatement ps,
int index, Object parameter) {
try {
if (parameter instanceof String) {
ps.setString(index, (String) parameter);
}
else {
ps.setObject(index, parameter);
}
}
catch (Exception e) {
//Utilities.debugPrintln(e.getMessage());
e.printStackTrace();
}
}
public static void closeDbConnection(java.sql.Connection con) {
try {
con.close();
}
catch (Exception e) {
Utilities.debugPrintln(e.getMessage());
}
}
public static String getResultPage(
String title, String message, String jumpLink,
VelocityServlet servlet, HttpServletRequest request,
HttpServletResponse response, Context context) {
Template template = null;
context.put("MessageTitle", title);
context.put("ResultMessage", message);
context.put("JumpLink", jumpLink);
try {
template = servlet.getTemplate(
"/templates/Message.htm");
StringWriter sw = new StringWriter();
template.merge(context, sw);
return sw.toString();
}
catch (Exception ex) {
return "error get template Message.htm " + ex.getMessage();
}
}
public static String mergeTemplate(String fileName, VelocityServlet servlet,
Context context) {
Template template = null;
try {
template = servlet.getTemplate(fileName);
StringWriter sw = new StringWriter();
template.merge(context, sw);
return sw.toString();
}
catch (Exception ex) {
return "error get template " + fileName + " " + ex.getMessage();
}
}
}
发表评论
-
log位置
2008-03-15 02:21 1015log4j.appender.logfile.File=${w ... -
log4j中配置日志文件相对路径方法分析
2008-03-15 02:19 10579方法一、 解决的办法自然是用相对路径代替绝对路径,其实log4 ... -
log4j配置文件详解
2008-03-15 02:17 4094一:log4j配置文件基本含义说明 log4j.proper ... -
Log4j/common log和各种服务器集成的问题
2008-03-15 02:16 1804目前的很多商业和非 ... -
PDF中文报表
2008-03-05 18:03 1334<%@ page import="java. ... -
iText中文问题
2008-02-29 11:03 2327为了解决中文的输出问题,需要多下载一个名为iTextAsian ... -
jbpm3教程
2008-02-24 16:10 1830jbpm3教程 http://www.iteye.com/s ... -
用五个步骤轻松替代 JSP Struts 与 Velocity 的集成
2007-06-30 20:18 1227searchwebservices.techtarget.co ... -
Velocity用户手册---中文版
2007-06-30 20:02 1030www.ijsp.net/2/2003-9/27/000043 ... -
FreeMarker模板引擎系列文章
2007-06-30 19:51 1361blog.csdn.net/ITFLY8/archive/20 ... -
FreeMarker一篇通2
2007-06-30 19:44 1914[代码8] 运行得到输出文件类似这样: class ... -
FreeMarker一篇通1
2007-06-30 19:35 1470大家看文章标题就应该知道,我想用一篇文章,把大家从对freem ...
相关推荐
以上就是关于 "Velocity 应用示例" 的详细介绍。通过 Velocity,我们可以轻松地将动态数据插入到静态模板中,生成定制化的输出,从而提高开发效率和代码的可维护性。在实际项目中,Velocity 还可以与其他框架如 ...
Struts2和Velocity是两种广泛应用于Java Web开发的技术。Struts2是一个强大的MVC框架,它为构建基于Java EE的Web应用程序提供了结构化的框架支持,而Velocity则是一种模板引擎,用于将HTML或者其他格式的模板与Java...
- 可能还包含了配置文件和测试用例,帮助理解如何设置和测试Velocity应用。 6. **最佳实践** - 分离视图和控制器:确保模板仅包含展示逻辑,业务逻辑应保留在Java代码中。 - 使用合适的命名约定:避免使用保留字...
** Velocity简介 ** Velocity是Apache软件基金会开发的一个开源模板引擎,它允许开发者将HTML与Java代码分离,...这只是一个基础的起点,随着深入学习,你会发现Velocity可以应用于更复杂的Web应用和文档生成等场景。
总结来说,Velocity小例子主要展示了如何在Java应用中使用Velocity模板引擎生成动态内容。通过学习和实践这个例子,你可以掌握如何定义变量、使用指令和宏,以及如何通过上下文传递数据,从而更好地理解和应用...
### Velocity Web应用开发知识点详解 #### 一、Velocity概述及应用场景 Velocity 是一款基于 Java 的模板引擎,主要用于生成动态内容,特别是在 Web 开发领域。它能够帮助开发者快速地构建出可读性强、易于维护的 ...
"VelocityTest"可能是一个示例代码或测试文件,用于演示如何在实际项目中使用Velocity。这通常包括创建VelocityContext对象(用于存储数据),加载模板文件,以及合并上下文数据和模板以生成最终输出。在学习和实践...
##### 2.3 Rigidbody2D.velocity应用示例 假设我们需要创建一个简单的跳跃游戏,其中玩家需要控制一个小人跳跃过障碍物。这里我们可以使用`Rigidbody2D.velocity`属性来实现小人的跳跃动作: ```csharp public ...
在Web开发领域,Velocity是一个非常重要的模板引擎,它被广泛应用于生成动态网页内容。Velocity由Apache软件基金会开发并维护,是Apache Jakarta项目的一部分。其设计目标是提供一个简单易用但功能强大的工具,用于...
Velocity是Apache软件基金会的一个开源项目,它是一款强大的模板引擎,常用于Java应用程序中的视图层。Velocity通过将逻辑与表示分离,使得开发者可以专注于业务逻辑,而设计师则可以专心于页面设计。本篇文章将深入...
4. **velocity(1).rar** 和 **velocity.rar**:这两个RAR文件可能是Velocity的源码或相关示例项目的压缩包,供开发者下载研究。 **总结** Velocity作为一款强大的模板引擎,为Java开发提供了灵活的内容生成解决...
** Velocity模板应用详解 ** Velocity是一款强大的Java模板引擎,它为开发者提供了一种与呈现逻辑分离的方式,使得HTML、XML或者其他格式的文档可以更清晰地与业务逻辑代码分开。Velocity被广泛应用于Web应用开发,...
- **《VTL语法参考指南中文版》**:提供关于Velocity模板语言(VTL)的详尽语法说明和示例。 - **《DB4O中文系列之起步篇》**:虽然与Velocity关系不大,但提供了关于DB4O数据库的入门知识。 以上内容涵盖了从...
3. **examples** 文件夹:提供了使用 Velocity 的示例代码,这些示例可以帮助初学者快速上手,理解如何在实际项目中应用 Velocity。 4. **src** 文件夹:包含 Velocity 源代码,对于开发者来说,这是一个宝贵的学习...
Velocity是Apache软件基金会下的一个开源项目,它是一个基于Java的模板引擎,主要用在Web应用中生成动态内容。Velocity通过简单的语法,将业务逻辑与表现层分离,使得开发者可以专注于业务逻辑的编写,而不用关心...
Velocity的主要目标是将呈现逻辑从应用逻辑中分离出来,使得开发者可以专注于业务逻辑的实现,而设计人员则可以专注于页面的布局和设计。这个官方工具包不仅包含了Velocity的核心库,还提供了丰富的示例,帮助用户...
- **初始化 Velocity**:在 JVM 或 Web 应用中仅存在一个 Velocity 引擎实例,所有应用共享该实例。通过 `org.apache.velocity.app.Velocity` 类来获取这个单例。 - **示例代码**: ```java Velocity.set...