我预先建立一个WEB项目Hiservlet3,作为主项目。下面再建立一个Web Fragment项目作为主项目的从属:
 
 建立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;     
            }      
        }      
    }      
}
运行效果如图:    
 
 注意在Eclipse下,可在Web Fragment项目上点击运行,即可正常运行主项目,见下图:   
 
 当然也可以在主项目上点击运行,依然可以运行。 
关于多个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简单一些。