Servlet 3.0筆記之體驗(yàn)可插拔特性,以及在實(shí)際中可能的應(yīng)用范圍
我預(yù)先建立一個(gè)WEB項(xiàng)目Hiservlet3,作為主項(xiàng)目。下面再建立一個(gè)Web Fragment項(xiàng)目作為主項(xiàng)目的從屬:
建立Servlet,F(xiàn)ilter,Listener等,沒(méi)有什么區(qū)別。
使用Web Fragment,較為麻煩的是頁(yè)面文件的存放,其它到?jīng)]有多大區(qū)別。但有以下兩個(gè)方法解決:
1. 使用ANT編寫(xiě) build.xml 文件,自動(dòng)打成JAR包,假如有HTML文件的話,可以把HTML等頁(yè)面文件部署到主項(xiàng)目的部署設(shè)定目錄下
比如,我們?cè)O(shè)置轉(zhuǎn)向到oneuser.html文件:
request.getRequestDispatcher("/oneuser.html").forward(request, response);
就需要在發(fā)布時(shí)把oneuser.html文件放在主項(xiàng)目的部署根目錄下,其它路徑,以此類推。
建議編寫(xiě)ANT腳本搞定。
2. 把頁(yè)面文件也打進(jìn)JAR包,使用Freemarker硬編碼實(shí)現(xiàn)頁(yè)面渲染。這種方式有些硬,另一方面移植性好,一個(gè)JAR包直接包含了Servlet 和頁(yè)面文件,但會(huì)帶來(lái)修改頁(yè)面文件的麻煩。
下面為演示如何使用Freemarker實(shí)現(xiàn)硬編碼:
運(yùn)行效果如圖:
注意在Eclipse下,可在Web Fragment項(xiàng)目上點(diǎn)擊運(yùn)行,即可正常運(yùn)行主項(xiàng)目,見(jiàn)下圖:
當(dāng)然也可以在主項(xiàng)目上點(diǎn)擊運(yùn)行,依然可以運(yùn)行。
關(guān)于多個(gè)Web Fragment之間順序加載問(wèn)題,可以參閱如下文章:
http://blogs.sun.com/swchan/entry/servlet_3_0_web_fragment
獲得更多認(rèn)知。
小結(jié)一下Servlet Web Fragment 可能在以下情況下很受用:
1. 作為用戶攔截、日志記錄,實(shí)現(xiàn)項(xiàng)目之間的解耦。
2. 提供RSS訂閱模塊
3. 后臺(tái)管理
4. 項(xiàng)目檢測(cè)等
5. 不需要頁(yè)面的模塊
......
最后附加上一個(gè)JAR文件,里面包含了源代碼和要發(fā)布的文件:
本次項(xiàng)目演示,依賴JAR:
commons-io-1.4.jar
freemarker-2.3.13.jar
commons-lang-2.3.jar
本次項(xiàng)目JAR文件:
下載
下次寫(xiě)些什么呢,不如實(shí)現(xiàn)更加友好的URL,也來(lái)一把REST,讓URL簡(jiǎn)單一些。

建立Servlet,F(xiàn)ilter,Listener等,沒(méi)有什么區(qū)別。
使用Web Fragment,較為麻煩的是頁(yè)面文件的存放,其它到?jīng)]有多大區(qū)別。但有以下兩個(gè)方法解決:
1. 使用ANT編寫(xiě) build.xml 文件,自動(dòng)打成JAR包,假如有HTML文件的話,可以把HTML等頁(yè)面文件部署到主項(xiàng)目的部署設(shè)定目錄下
比如,我們?cè)O(shè)置轉(zhuǎn)向到oneuser.html文件:
request.getRequestDispatcher("/oneuser.html").forward(request, response);
就需要在發(fā)布時(shí)把oneuser.html文件放在主項(xiàng)目的部署根目錄下,其它路徑,以此類推。
建議編寫(xiě)ANT腳本搞定。
2. 把頁(yè)面文件也打進(jìn)JAR包,使用Freemarker硬編碼實(shí)現(xiàn)頁(yè)面渲染。這種方式有些硬,另一方面移植性好,一個(gè)JAR包直接包含了Servlet 和頁(yè)面文件,但會(huì)帶來(lái)修改頁(yè)面文件的麻煩。
下面為演示如何使用Freemarker實(shí)現(xiàn)硬編碼:
/**
* 這次,我們把模板文件放在JAR文件包中
*
* @author xiaomin
*
*/
@WebServlet("/some/")
public class ViewSomethingAction extends HttpServlet {
private static final long serialVersionUID = 65464645L;
private static final String DEFAULT_ENCODING = "UTF-8";
private static final String TEMPLATE_NAME = "some";
private String templateString;
private Configuration configuration;
public void init() throws ServletException {
configuration = new Configuration();
configuration.setDefaultEncoding(DEFAULT_ENCODING);
configuration.setEncoding(Locale.CHINA, DEFAULT_ENCODING);
// 初始化模板
templateString = getTemplateString("pages/something.html");
}
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 構(gòu)造要傳遞到模板的屬性值
Map<String, Object> map = new HashMap<String, Object>();
map.put("userName", "小敏");
response.setContentType("text/html; charset=" + DEFAULT_ENCODING);
printResponsesString(response, map);
}
/**
* 輸出請(qǐng)求內(nèi)容
* @param response
* @param map
* @throws IOException
*/
private void printResponsesString(HttpServletResponse response,
Map<String, Object> map) throws IOException {
Template template = new Template(TEMPLATE_NAME, new StringReader(
templateString), configuration, DEFAULT_ENCODING);
Writer out = response.getWriter();
try {
template.process(map, out);
} catch (TemplateException e) {
e.printStackTrace();
} finally {
out.flush();
template = null;
}
}
/**
* 獲取JAR包內(nèi)的HTML模板文件內(nèi)容
* @param jarHtmlPath eg: pages/something.html
* @return
*/
private String getTemplateString(String jarHtmlPath) {
ClassLoader myCL = this.getClass().getClassLoader();
InputStream is = myCL.getResourceAsStream(jarHtmlPath);
if (is == null) {
return null;
} else {
try {
return templateString = IOUtils.toString(is, DEFAULT_ENCODING);
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}
}
運(yùn)行效果如圖:

注意在Eclipse下,可在Web Fragment項(xiàng)目上點(diǎn)擊運(yùn)行,即可正常運(yùn)行主項(xiàng)目,見(jiàn)下圖:

當(dāng)然也可以在主項(xiàng)目上點(diǎn)擊運(yùn)行,依然可以運(yùn)行。
關(guān)于多個(gè)Web Fragment之間順序加載問(wèn)題,可以參閱如下文章:
http://blogs.sun.com/swchan/entry/servlet_3_0_web_fragment
獲得更多認(rèn)知。
小結(jié)一下Servlet Web Fragment 可能在以下情況下很受用:
1. 作為用戶攔截、日志記錄,實(shí)現(xiàn)項(xiàng)目之間的解耦。
2. 提供RSS訂閱模塊
3. 后臺(tái)管理
4. 項(xiàng)目檢測(cè)等
5. 不需要頁(yè)面的模塊
......
最后附加上一個(gè)JAR文件,里面包含了源代碼和要發(fā)布的文件:
本次項(xiàng)目演示,依賴JAR:
commons-io-1.4.jar
freemarker-2.3.13.jar
commons-lang-2.3.jar
本次項(xiàng)目JAR文件:
下載
下次寫(xiě)些什么呢,不如實(shí)現(xiàn)更加友好的URL,也來(lái)一把REST,讓URL簡(jiǎn)單一些。
posted on 2010-07-05 22:08 nieyong 閱讀(570) 評(píng)論(0) 編輯 收藏 所屬分類: Servlet3