Servlets和jsp(SUN企業級應用的首選)開發原則(下)
(標准化越來越近了):namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
- 不要“重新發明輪子”,不要一切從頭開始: 通過定制組件可以提高復用性,不過定制組件仍然需要編寫、測試和調試程序。問題是這個事情別人可能已經實現了,而且你的實現方式並不一定比人家做得更好。這就是jsp(SUN企業級應用的首選)標准標記庫(JavaServer Pages Standard Tag Library, JSTL)要做的事情(JSTL請參考JSTL官方網站)。JSTL提供了循環、讀屬性、遍歷各種數據結構、條件表達式求值等各種標記。它也提供了一些復雜的標記,甚至像解析xml(標准化越來越近了)文檔的標記它都有。所以如果你要用到一個標記的話,最好先看看有沒有別人已經實現的可以使用,而不要次次從頭開始,自己搞一套。
- 使用JSTL表達使語言(JSTL Expression Language): 傳遞給jsp(SUN企業級應用的首選)頁面的數據一般通過jsp(SUN企業級應用的首選)作用域屬性或者請求參數來進行。專門為網頁開發者設計的表達式語言(Expression Language, EL)把使用作用域屬性傳遞信息作為從業務邏輯向jsp(SUN企業級應用的首選)頁面傳遞信息的標准方式。這裡要注意的是,EL只是jsp(SUN企業級應用的首選)技術中關鍵的一個方面,並不是一種通用的程序設計語言。相反,它只是一種數據訪問語言,它可以簡化應用程序的數據的訪問,不用Scriptlet和請求時表達式求值就可以訪問數據。
在jsp(SUN企業級應用的首選)中,網頁設計師要使用表達式語法<%= name %>或JavaBean組件來取得某些變量或屬性的值,例如:
<tagLib:tag attribute="<%=
pageContext.getAttribute("name") %>">
或
<%= aCustomerBean.getAddress().getCountry() %>
表達使語言讓網頁設計師可以使用簡化的語法來訪問信息。如果你只是要訪問一個簡單的變量,你可以使用這樣的語法:
<tagLib:tag attribute="${name}">
如果你要訪問一個嵌套JavaBean的屬性,你可以這樣:
<tagLib:tag attribute ="${
aCustomerBean.address.country}">
表達式語言(EL)借用了JavaScript 的語法,所以如果你對JavaScript 很熟悉的話,你就會覺得巨爽。
- 使用過濾器(filter): 過濾器是一個對象,可以傳輸請求或修改響應。它可以在請求到達Servlet/jsp(SUN企業級應用的首選)之前對其進行預處理,而且能夠在響應離開Servlet/jsp(SUN企業級應用的首選)之後對其進行後處理。所以如果你有幾個Servlet/jsp(SUN企業級應用的首選)需要執行同樣的數據轉換或頁面處理的話,你就可以寫一個過濾器類,然後在部署描述文件(web.xml(標准化越來越近了))中把該過濾器與對應的Servlet/jsp(SUN企業級應用的首選)聯系起來。
創建過濾器其實很容易,你只須實現javax.servlet.Filter接口及它的三個方法:
public void init(FilterConfig config)
public void doFilter(ServletRequest req, ServletResponse rep,
FilterChain chain)
public void destroy()
這樣,你就可以完成你的過濾器。
- 使用可移植的安全模型: 大部分的應用服務器都提供了安全模型,不過一般它們都是針對某一個服務器或某一個廠商專有的。如果你的應用需要移植的話,那麼你的應用最好使用可以移植的安全模型。如果你的應用有一些預先定義的固定用戶的話,那麼你可以使用FROM驗證和BASIC驗證。可是如果你要動態生成客戶的話(一般都是這種情況),你可能就需要使用服務器特定的API來創建和管理用戶。這樣當你的應用移植到另外一個服務器時,你可能就會碰到API不兼容的問題。這種情況下,最好的解決方法是使用適配器(Adapter)模式(如果你對設計模式不熟悉的話,請參看GoF的《設計模式》一書)。
- 用數據庫來保存持久性數據: Servlet/jsp(SUN企業級應用的首選)中可以使用HttpSession對象也就是會話對象來保存用戶的臨時數據。不過如果你想保存持久性數據的時候,你應該使用數據庫,數據保存數據會更安全,而且對客戶所用的浏覽器沒有什麼要求。這樣即使你的應用服務器由於某種原因崩潰了,你的數據依然良好。