Velocity 的介紹請參考 Velocity -- Java Web 開(kāi)發(fā)新技術(shù)。這里是它的一個(gè)應用示例。 這個(gè)例子參照了 PHP-Nuke 的結構, 即所有 HTTP 請求都以 http://www.some.com/xxx/Modules?name=xxx& arg1=xxx& bbb=xxx 的形式進(jìn)行處理。例子中所有文件都是 .java 和 .html , 沒(méi)有其他特殊的文件格式。除了 Modules.java 是 Java Servlet, 其余的 .java 文件都是普通的 Java Class. 所有 HTTP 請求都通過(guò) Modules.java 處理。Modules.java 通過(guò) Velocity 加載 Modules.htm。 Modules.htm 有頁(yè)頭,頁(yè)腳,頁(yè)左導航鏈接,頁(yè)中內容幾個(gè)部分。其中頁(yè)頭廣告、頁(yè)中內容是變化部分。頁(yè)頭廣告由 Modules.java 處理,頁(yè)中內容部分由 Modules.java dispatch 到子頁(yè)面類(lèi)處理。 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 Modulesextends VelocityServlet { public Template handleRequest(HttpServletRequest request,HttpServletResponse response,Context context) { //initresponse.setContentType("text/html; charset=UTF-8"); response.setCharacterEncoding("utf-8"); //prepare function pageProcessSubPage 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 mainpagepage = mainPage; if (requestFunctionName == null||requestFunctionName.equalsIgnoreCase("home")) { page = mainPage; } //no login , can use these pageelse 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 firstelse 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 administratorelse 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) throwsjava.io.IOException, java.io.FileNotFoundException { return Utilities.initServletEnvironment(this); } } 2) ProcessSubPage.java , 比較簡(jiǎn)單,只定義了一個(gè)函數接口 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 的子類(lèi)和一些工具類(lèi)。 ProcessSubPage 的子類(lèi)基本上都是一樣的流程, 用類(lèi)似 context.put("page_footer",getPageFooterHTML()); 的寫(xiě)法置換 .html 中的可變部分即可。如果沒(méi)有可變部分,完全是靜態(tài)網(wǎng)頁(yè),比如 AboutSubPage, 就更簡(jiǎn)單。 3) AboutSubPage.java import org.apache.velocity.servlet.VelocityServlet; import j |
聯(lián)系客服