在JAR包中內嵌頁面資源

壹頁書發表於2014-01-02
有時候使用JAVA寫一些功能,封裝為一個JAR包,提供給專案使用,這些專案最終釋出為WAR包。
但是有的時候,我提供的功能需要少許的頁面,如JSP,JS,HTML和圖片等。
但是又不能侵入到專案的程式碼。
當然,使用Servlet3.0可以實現在JAR中內嵌檢視資源的功能。
但是如果不使用Servlet3.0,可以寫一個過濾器實現這個功能。


過濾器攔截URL中以"/Web/virtual/"開頭的請求,並將JAR包中resource下的同名資源返回。
程式碼如下:

  1. import java.io.IOException;
  2. import java.io.InputStream;

  3. import javax.servlet.Filter;
  4. import javax.servlet.FilterChain;
  5. import javax.servlet.FilterConfig;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.ServletRequest;
  8. import javax.servlet.ServletResponse;
  9. import javax.servlet.annotation.WebFilter;
  10. import javax.servlet.http.HttpServletRequest;

  11. import org.apache.commons.io.IOUtils;

  12. /**
  13.  * Servlet Filter implementation class ResourceFilter
  14.  */
  15. @WebFilter(urlPatterns = "*")
  16. public class ResourceFilter implements Filter {

  17.     @Override
  18.     public void destroy() {
  19.     }

  20.     @Override
  21.     public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException {
  22.         HttpServletRequest request = (HttpServletRequest) arg0;
  23.         String url = request.getRequestURI();
  24.         if (url.startsWith("/Web/virtual/")) {
  25.             InputStream in = this.getClass().getClassLoader().getResourceAsStream("/resource/" + url.substring("/Web/virtual/".length()));
  26.             try {
  27.                 IOUtils.copy(in, arg1.getOutputStream());
  28.             } finally {
  29.                 IOUtils.closeQuietly(in);
  30.             }
  31.         } else {
  32.             arg2.doFilter(arg0, arg1);
  33.         }
  34.     }

  35.     @Override
  36.     public void init(FilterConfig arg0) throws ServletException {
  37.     }

  38. }
resource中的index.html程式碼如下

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  5. <title></title>
  6. </head>
  7. <body>
  8.     <img src="pic.jpg" width="200px" height="150px" />
  9. </body>
  10. </html>

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1066649/,如需轉載,請註明出處,否則將追究法律責任。

相關文章