聂永的博客

记录工作/学习的点点滴滴。

Servlet 3.0笔记之包含在JAR文件中可直接访问的资源文件特性(资源绑定)

这次标题够长的,在Servlet3协议规范中,包含在JAR文件/META-INFO/resources/路径下的资源可以直接访问了。这么说一说,可能感觉不到到底有什么好处,以往的JSP或者HTML页面只能存在站点的目录下,或者在WEB-INF目录下(只是不能直接访问)。
规范说,${jar}/META-INF/resources/被视为根目录,假设home.jsp被放在${jar}/META-INF/resources/home.jsp,用户可以直接通过 http://域名/home.jsp 访问了。
呈现一个常见的代码片段:
/**
* 简单示范
* @author yongboy
* @date 2011-1-16
* @version 1.0
*/
@WebServlet("/jarHome")
public class HelloJarServlet extends HttpServlet {
private static final long serialVersionUID = 6177346686921106540L;

protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("date", new Date());
request.getRequestDispatcher("/jarpage/jarhome.jsp").forward(request, response);
}
}
而jarhome.jsp文件路径则位于 ${jar}/META-INF/resources/jarpage/jarhome.jsp
当然jarhome.jsp文件则没有什么特别之处:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" href="css/style.css" type="text/css" />
<title>Welcome to jar home</title>
</head>
<body>
<img alt="j2ee" src="img/j2ee.png" /><br/>
<br/>
now date : <%=((java.util.Date)request.getAttribute("date")).toString()%>
</body>
</html>
jarhome.jsp文件所引用css/style.css和img/j2ee.png等文件分别位于 ${jar}/META-INF/resources/css/style.css${jar}/META-INF/resources/img/j2ee.png目录下。
把生成的jar文件存放在 WEB-INF/lib/ 中,下面为一个运行示范图:

样式和图片等都可以正常访问。
有时候可能需要使用路径信息等,再看一个示范吧:
/**
* 演示jarDemo
*
* @author yongboy
* @date 2011-1-16
* @version 1.0
*/
@WebServlet("/jarDemo")
public class DemoWebINFPagesServlet extends HttpServlet {
private static final long serialVersionUID = -1040850432869481349L;
private static final Log log = LogFactory
.getLog(DemoWebINFPagesServlet.class);

@SuppressWarnings("deprecation")
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
log.info("the /jarDemo is accessed now!");

log.info("getRealPath : " + request.getRealPath("/"));
log.info("ServletContext : getRealPath : "
+ getServletContext().getRealPath("/"));
log.info("getPathTranslated : " + request.getPathTranslated());

log.info("get jar's resource:");

InputStream is = getServletContext().getResourceAsStream(
"/jarfile/demo.txt");
log.info("the JAR/META-INF/resources/jarfile/demo.txt's content is :\n"
+ IOUtils.toString(is));

request.getRequestDispatcher("/WEB-INF/pages/notaccess.jsp");
}
}
输入命令行信息为:
[framework] 2011-01-03 11:45:16,664 - com.learn.servlet3.jardync.DemoWebINFPagesServlet -798292 [http-8080-exec-6] INFO  com.learn.servlet3.jardync.DemoWebINFPagesServlet  - the /jarDemo is accessed now!
[framework] 2011-01-03 11:45:16,664 - com.learn.servlet3.jardync.DemoWebINFPagesServlet -798292 [http-8080-exec-6] INFO  com.learn.servlet3.jardync.DemoWebINFPagesServlet  - getRealPath : /home/yongboy/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/d/
[framework] 2011-01-03 11:45:16,664 - com.learn.servlet3.jardync.DemoWebINFPagesServlet -798292 [http-8080-exec-6] INFO  com.learn.servlet3.jardync.DemoWebINFPagesServlet  - ServletContext : getRealPath : /home/yongboy/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/d/
[framework] 2011-01-03 11:45:16,665 - com.learn.servlet3.jardync.DemoWebINFPagesServlet -798293 [http-8080-exec-6] INFO  com.learn.servlet3.jardync.DemoWebINFPagesServlet  - getPathTranslated : null
[framework] 2011-01-03 11:45:16,665 - com.learn.servlet3.jardync.DemoWebINFPagesServlet -798293 [http-8080-exec-6] INFO  com.learn.servlet3.jardync.DemoWebINFPagesServlet  - get jar's resource:
[framework] 2011-01-03 11:45:16,665 - com.learn.servlet3.jardync.DemoWebINFPagesServlet -798293 [http-8080-exec-6] INFO  com.learn.servlet3.jardync.DemoWebINFPagesServlet  - the ${JAR}/META-INF/resources/jarfile/demo.txt's content is :
haha,the demo.s's content!
haha,haha,haha!
可以看到getRealPath("/")得到的是项目的根路径(可以参照JAR解压后的路径)。而request.getPathTranslated则因为是包含在jar文件中(规范中说包含在远程主机、数据库、JAR存档文件中,getPathTranslated都会返回null),则返回null。
包含在jar中的资源文件,一样可以使用getResourceAsStream获取到。
再来看看jar文件META-INF/resources目录下文件结构:
  • css/style.css
  • img/j2ee.png
  • jarfile/demo.txt
  • jarpage/jarhome.jsp
  • jsp/h.jsp
  • jsp/helloWorld.jsp
很显然,就是一个小型站点目录结构。
每一个模块,建立一个WEB站点应用,使用ANT脚本自动打包成jar文件,拷贝到真正站点WEB-INF/lib下。
假设一个JAR文件包含一个具体的模块,那么模块的部署与装载将是十分方便的。

posted on 2011-01-03 12:20 nieyong 阅读(7009) 评论(2)  编辑  收藏 所属分类: Servlet3

评论

# re: Servlet 3.0笔记之包含在JAR文件中可直接访问的资源文件特性(资源绑定)[未登录] 2012-08-01 11:24 lixor

这样做最大的好处就是可以做产品定制化项目。
例如有一个产品P,此产品的绝大多数功能都是不需要做客户化的,只有个别模块需要客户化定制。
如果按照以前的做法需要为每个客户创建一个项目并进行一些修改,这样源码管理的控制就比会较混乱。
如果采用jar包封装那个需要客户化的模块的话,这样就不需要修改产品主体,每次只要在实施时把客户化的jar放进去就行了。  回复  更多评论   

# re: Servlet 3.0笔记之包含在JAR文件中可直接访问的资源文件特性(资源绑定)[未登录] 2015-06-19 22:41 tom

@lixor
的确是这样,做过客户化开发的深有体会,这样做有两点好处  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 

公告

所有文章皆为原创,若转载请标明出处,谢谢~

新浪微博,欢迎关注:

导航

<2011年1月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
303112345

统计

常用链接

留言簿(58)

随笔分类(130)

随笔档案(151)

个人收藏

最新随笔

搜索

最新评论

阅读排行榜

评论排行榜