Servlet 3.0 开发手记之---体验可插拔特性,以及在实际中可能的应用范围

我预先建立一个WEB项目Hiservlet3,作为主项目。下面再建立一个Web Fragment项目作为主项目的从属:

webfragment

建立Servlet,Filter,Listener等,没有什么区别。

使用Web Fragment,较为麻烦的是页面文件的存放,其它到没有多大区别。但有以下两个方法解决:


1. 使用ANT编写 build.xml 文件,自动打成JAR包,假如有HTML文件的话,可以把HTML等页面文件部署到主项目的部署设定目录下
        比如,我们设置转向到oneuser.html文件:
       request.getRequestDispatcher("/oneuser.html").forward(request, response);


        就需要在发布时把oneuser.html文件放在主项目的部署根目录下,其它路径,以此类推。
        建议编写ANT脚本搞定。


2. 把页面文件也打进JAR包,使用Freemarker硬编码实现页面渲染。这种方式有些硬,另一方面移植性好,一个JAR包直接包含了Servlet 和页面文件,但会带来修改页面文件的麻烦。
下面为演示如何使用Freemarker实现硬编码:

/**
 * 这次,我们把模板文件放在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 {
		
		// 构造要传递到模板的属性值
		Map<String, Object> map = new HashMap<String, Object>();		
		map.put("userName", "小敏");

		response.setContentType("text/html; charset=" + DEFAULT_ENCODING);

		printResponsesString(response, map);
	}

	/**
	 * 输出请求内容
	 * @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包内的HTML模板文件内容
	 * @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;
			}
		}
	}
}
 


运行效果如图:
something

注意在Eclipse下,可在Web Fragment项目上点击运行,即可正常运行主项目,见下图:
web fragment startup

当然也可以在主项目上点击运行,依然可以运行。

关于多个Web Fragment之间顺序加载问题,可以参阅如下文章:
http://blogs.sun.com/swchan/entry/servlet_3_0_web_fragment
获得更多认知。

小结一下Servlet Web Fragment 可能在以下情况下很受用:
1. 作为用户拦截、日志记录,实现项目之间的解耦。
2. 提供RSS订阅模块
3. 后台管理
4. 项目检测等
5. 不需要页面的模块
......

最后附加上一个JAR文件,里面包含了源代码和要发布的文件:

 

本次项目演示,依赖JAR:
commons-io-1.4.jar
freemarker-2.3.13.jar
commons-lang-2.3.jar

 

本次项目JAR文件:

下载

 

下次写些什么呢,不如实现更加友好的URL,也来一把REST,让URL简单一些。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值