首頁>技術>

軟體專案實訓及課程設計指導——如何利用MyEclipse開發工具開發基於Velocity模板的Web應用

1、在MyEclipse開發工具中新建一個名稱為WebVelocity的Web專案

在名稱為WebVelocity的J2EE Web應用專案中的lib目錄下新增Velocity模板所需要JAR包檔案velocity-1.6.1-dep.jar,請見下圖所示的最終操作的結果截圖。

2、在該Web專案中新增一個檔名稱為userLogin.jsp的JSP頁面

在該userLogin.jsp的JSP頁面中新增一個實現應用系統的使用者登陸功能的Web表單,並且嚮應用系統後臺的Servlet元件傳送Web請求。該userLogin.jsp的JSP頁面的內容標籤請見如下示例中所示的內容—— 名稱為userLogin.jsp的JSP頁面內容。

<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>      <head>      			<title>My JSP 'userLogin.jsp' starting page</title>      </head>      <body>            <form action="/WebVelocity/userloginservlet" method="POST">                  請輸入使用者名稱稱:<input type="text" name="userName"><br>                  請輸入使用者密碼:<input type="password" name="userPassword"><br>                  <input type="submit" value="提交">                  <input type="reset" value="重來">            </form>      </body></html>

該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("<html>");          oneStringBuffer.append("<head><meta http-equiv=\"Content-Type\"          content=\"text/html; charset=gb2312\">");          oneStringBuffer.append("<title>錯誤資訊顯示頁面</title>");          oneStringBuffer.append("</head><body>"+ errorText+"<br>錯誤出現的位置:<br>");          StringWriter oneStringWriter = new StringWriter();          cause.printStackTrace(new PrintWriter(oneStringWriter));          oneStringBuffer.append(oneStringWriter.toString());          oneStringBuffer.append("</body></html>");          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類的部分程式碼。

<servlet>      <servlet-name>UserLoginServlet</servlet-name>      <servlet-class>com.px1987.webvelocity.servlet.UserLoginServlet</servlet-class>      <init-param>            <param-name>properties</param-name>            <param-value>/velocityConf/velocity.properties</param-value>      </init-param></servlet><servlet-mapping>      <servlet-name>UserLoginServlet</servlet-name>      <url-pattern>/userloginservlet</url-pattern></servlet-mapping>

4、在Web專案的velocityConf目錄中新增Velocity的屬性配置檔案

在本Web專案中新增一個屬性配置檔案所在的檔案目錄,目錄的名稱為velocityConf,並在該velocityConf目錄下,再新增一個檔名稱為velocity.properties檔案。設定該檔案中的內容,請見如下程式碼中的示例——Velocity模板引擎(Template Engine)的velocity.properties屬性配置檔案的示例

file.resource.loader.path = /runtime.log = /velocity.log

該檔案為Velocity模版引擎的初始化引數檔案,Web應用系統的開發人員可以在其中設定相關的工作引數,這些工作引數主要是Velocity模板引擎的配置、編碼、快取、日誌等檔案的工作引數的定義等。

當然,在Velocity模版引擎中也預設了一些預設的配置屬性,從而避免開發人員出現錯誤的配置專案。Web應用系統的開發人員透過配置velocity.properties檔案,可以自定義vm檔案載入方式,指定編碼等。

當然,也可以不配置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 等標準格式型別的文字檔案。因此,模板檔案的副檔名可以是*.vm、*.html和*.xml等型別。在模板檔案中一般都會包括有:

1)照原樣合併的靜態部分

2)將被要合併的資料替代的佔位符

3)指令碼語言中的指示符和指令

因此,在Web專案中新增一個HTML頁面檔案,它是檔名稱為webVelocityApp.html的模板檔案,在該模板檔案中新增如下程式碼示例所示的HTML標籤內容——webVelocityApp.html模板檔案中的HTML標籤內容,讀者注意其中黑體標識的語句。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html>      <head>            <meta http-equiv="Content-Type" content="text/html; charset=gb2312">            <title>一個簡單的VelocityWeb應用頁面</title>      </head>      <body>            <center> <h2>下面為Servlet處理後的結果</h2></center>            <table cellspacing="0" cellpadding="5" width="200" align="center">                  <tr>                  				<td >使用者名稱稱</td><td >使用者密碼</td>                  </tr>                  <tr>                  				<td>$userName</td><td>$userPassword</td>                  </tr>            </table>      </body></html>

由於上面的這個模板檔案是一個完整的 HTML 檔案,因此可以使用任何Web頁面設計工具或者文字編輯器來建立和編輯該HTML頁面檔案;在模板檔案中訪問儲存在上下文物件中的屬性:

比如,可以使用 $userName指令來引用前面儲存到上下文物件中的屬性。注意:在Velocity模板檔案中,變數的定義都是使用"$"字元開頭的,"$"字元作為Velocity模板檔案中的識別符號。

由於Velocity模板引擎系統採用簡單而強大的模板語言VTL實現對Web頁面的渲染,因此能保證在Dreamwaver之類的Web頁面視覺化編輯器中都能夠正常顯示;另外,模板檔案可以是任意的副檔名,採用*.vm、*.html或者*.xml都是可以的(本示例採用*.html副檔名),這樣就能直接在Web瀏覽器中看到Web頁面的預覽的效果。

6、執行該Web應用並測試Velocity模板的功能效果

讀者可以直接在瀏覽器中輸入如下形式的URL地址字串,直接瀏覽使用者登入頁面http://127.0.0.1:8080/WebVelocity/userLogin.jsp的請求URL地址後將會出現如下示圖所示的實現使用者登陸功能的頁面。

讀者在上圖中所示的Web表單框中輸入使用者名稱稱和密碼,然後點選其中的"提交"按鈕後,Web表單頁面將向Web應用系統後臺的Servlet元件提交Web請求,最後將出現如下示圖所示的執行結果狀態——本示例為了驗證應用Velocity模版引擎的正確性,在響應頁面中獲得使用者登入的賬戶和密碼等資訊,然後在頁面中顯示以比對是否正確地獲得了相關的資料。

從執行結果和最終在Web瀏覽器中響應輸出的資訊來看,本示例的功能是正確的,對Velocity模版引擎的應用也是合情合理和正確的。

當然,在實際的Web應用系統中的業務處理邏輯中,並不會簡單直接地顯示出使用者敏感的登入資訊,而是透過訪問系統後臺的物理資料庫系統中的資料庫表中的資料,比對使用者提交的登入資訊是否合法和有效。

另外,webVelocityApp.html頁面為靜態的HTML頁面而不是動態的伺服器端的JSP頁面,如果在本Web示例中不應用Velocity模版引擎系統,是很難實現在靜態的HTML頁面中獲得伺服器端返回的業務處理結果的引數。

因此Web頁面的響應速度將會大大地提高,從而應用Velocity 模板技術的Web頁面可以是非JSP型別的Web頁面——達到"動態內容靜態化"的應用效果。

29
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • docker小知識:網路模型