`
yongboy
  • 浏览: 105840 次
  • 来自: ...
博客专栏
E16f1064-1c93-305c-9ed5-2118b09bada4
Servlet 3.0 学...
浏览量:0
社区版块
存档分类

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简单一些。

 

 

0
1
分享到:
评论
1 楼 cevencheng 2012-07-30  
看了这个之后我才恍然大悟,原来将 Velocity 或者 Freemarker 取代JSP作为视图层模板最大的用途貌似就是在 Servlet3.0 里面分模块 !! 由于 Fragment 里面没法放 jsp,所以导致很多需要前端页面的模块不能很纯粹的独立出去 。。。  这下问题全无了

相关推荐

    tomcat-servlet-3.0-api-7.0.76-15.el7.noarch.rpm

    官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装

    servlet-api-3.0.zip

    这个"Servlet-API-3.0.zip"压缩包包含的是Servlet 3.0规范的API jar文件,该文件是开发和运行基于Java的Web应用程序所必需的库。以下是对Servlet API 3.0的详细讲解: 1. **Servlet 3.0引入的新特性**: - **注解...

    servlet 3.0 jar 包综合下载

    在Servlet 3.0规范中,引入了许多新特性,旨在提高开发效率、简化编程模型以及增强可扩展性。下面将详细阐述Servlet 3.0的主要知识点。 1. **注解驱动的配置**:Servlet 3.0引入了注解(Annotation)来替代XML配置...

    jboss-servlet-3.0-api-1.0.1-9.el7.noarch.rpm

    官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装

    servlet-api-3.0-alpha-1.jar

    在本文中,我们将深入探讨Servlet API 3.0的主要特性,以及如何利用它们来提升Web应用的性能和可维护性。 1. **依赖注入 (Dependency Injection, DI)** Servlet 3.0引入了对JSR 330(依赖注入)的支持,允许开发者...

    servlet-api-3.0.jar包

    Servlet-api-3.0.jar是Java Servlet API的第三版实现,它是开发Web应用程序的重要组成部分,特别是在基于Java的服务器端编程中。这个库包含了用于创建和管理HTTP服务端点的接口和类,允许开发者构建动态、交互式的...

    tomcat-servlet-3.0-api-7.0.76-16.el7_9.noarch.rpm

    官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装

    servlet3.0.jar下载

    Servlet 3.0是Java Servlet规范的一个重要版本,它带来了许多新特性和改进,极大地提升了Web应用程序的开发效率和灵活性。...在实际项目中,使用"javax.servlet-api-3.0.1.jar"可以享受到这些改进带来的益处。

    Servlet3.0参考手册

    Servlet3.0是Java Web开发中的一个重要里程碑,它在Servlet2.5的基础上引入了许多新特性,极大地提高了开发效率和灵活性。这份"Servlet3.0参考手册"无疑为开发者提供了全面的API参考和实用指南。 首先,Servlet3.0...

    jboss-servlet-3.0-api-javadoc-1.0.1-9.el7.noarch.rpm

    官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装

    servlet3.0-demo

    Servlet 3.0是Java EE 6规范的一部分,它带来了许多增强的功能,使得Web应用程序的开发更为便捷和灵活。在这个名为“servlet3.0-demo...通过学习这个示例,开发者可以更好地理解和利用Servlet 3.0在实际项目中的优势。

    Servlet3.0 新特性

    Servlet3.0是Java Servlet API的一个重要版本更新,它带来了许多新特性和改进,极大地提升了Web应用程序的开发效率和灵活性。以下将详细讲解Servlet3.0的关键特性。 1. **注解驱动的配置**: 在Servlet3.0之前,...

    servlet-api-3.0-7.0.0pre1-sources.jar

    servlet-api-3.0-7.0.0pre1-sources.jar

    servlet3.0.zip

    - **注解驱动的配置**:在Servlet 3.0中,可以通过在类或方法上使用注解(如`@WebServlet`,`@WebFilter`,`@WebListener`)来代替XML配置文件,简化部署描述符(web.xml)。 - **异步处理**:Servlet 3.0引入了...

    Servlet 3.0 API - Apache Tomcat 7.0.41

    Servlet 3.0 API是Java Web开发中的一个重要组成部分,它为服务器端的动态网页...Apache Tomcat 7.0.41提供的这个API文档是一个很好的起点,可以帮助开发者理解Servlet 3.0规范的细节,并在实际项目中应用这些知识。

    servlet3.0 jar \ doc \pdf 相关文档资料

    Servlet 3.0是Java服务器页面(JSP)和Servlet技术的一个重要版本,它在2009年由Java Community Process(JCP)发布,作为Java EE 6的一部分。...在实际项目中,结合这些文档和实践,将有助于提高开发效率和代码质量。

    Servlet3.0特性详解

    在Servlet3.0中,我们可以使用注解(@WebServlet、@WebFilter、@WebListener)来替代web.xml中的XML配置,使得部署更简洁。例如,`@WebServlet("/example")`可以直接在Servlet类上声明URL映射。 2. **异步处理**:...

    servlet 3.0新增功能详解

    Servlet 3.0 版本是 Java EE 6 的一部分,它在原有基础上增加了一些重要的新特性,旨在进一步简化 Web 应用的开发和部署过程。本文将详细介绍 Servlet 3.0 的关键新特性,包括异步处理、新增的注解支持以及可插性...

    Servlet3.0新特性解析

    而在Servlet3.0中,我们可以通过`@WebFilter`注解来直接定义过滤器,指定其过滤的URL模式、DispatcherType等。这样,过滤器的配置就更加灵活和直观。 下面是一个使用注解声明的过滤器示例: ```java @WebFilter...

Global site tag (gtag.js) - Google Analytics