如何从JAR访问资源?

时间:2014-03-14 11:32:49

标签: java jsp servlets jar tomcat5.5

我有一个包含图像,css等的jar库。 这个罐子基于maven项目。所有文件都放在src / main / resources / web目录中。

将jar放在Tomcat 5.5的shared / lib中,以便与所有Web应用程序共享。

现在,在标准的Web应用程序中,如何访问css(例如)到JSP页面的样式表链接?

谢谢。

nota:使用Zk框架,我们可以使用简单的linke访问,即"〜。/ web / css / header.css"但它不适用于JSP:(

2 个答案:

答案 0 :(得分:3)

您可以但需要一些手动编码,因为默认的servlet(容器/ tomcat /提供静态资源的一部分)对您的jar知之甚少。你需要

  1. 实现您自己的可以从类路径
  2. 读取数据的servlet
  3. 将其映射到某个网址
  4. 在JSP中使用URL,并使用一些标识所请求文件的参数/路径
  5. 我实现了简单的原型,它只处理CSS文件,并没有涵盖任何极端情况。但它可以工作,你可以根据需要扩展它:

    Servlet很简单,它只是在其映射后面部分或URL并从类路径加载资源(例如jar):

    package cz.literak.demo;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.PrintWriter;
    
    public class JarServlet extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            String path = request.getPathInfo();
            setContentType(path, response);
    
            InputStream streamIn = null;
            try {
                streamIn = getClass().getResourceAsStream(path);
                PrintWriter writer = response.getWriter();
                int c;
                while ((c = streamIn.read()) != -1) {
                    writer.write(c);
                }
            } catch (IOException e) {
                streamIn.close();
            }
        }
    
        private void setContentType(String path, HttpServletResponse response) {
            if (path.toLowerCase().endsWith(".css")) {
                response.setContentType("text/css");
            }
            // TODO other mime types
        }
    }
    

    您需要注册servlet及其映射:

    <servlet>
        <servlet-name>JarDefault</servlet-name>
        <servlet-class>cz.literak.demo.JarServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>JarDefault</servlet-name>
        <url-pattern>/jar/*</url-pattern>
    </servlet-mapping>
    

    你可以这样使用它:

    <link rel="stylesheet" type="text/css" href="jar/styles/layout.css"/>
    

    我在一个jar中复制了目录样式下的文件layout.css,这是我的战争的一部分。容易,不是吗?

答案 1 :(得分:0)

问题是我在调用XMLReader的parse方法方面走得太远了。 parse方法接受一个I​​nputSource,因此没有理由使用FileReader。将上面代码的最后一行更改为

xr.parse( new InputSource( filename ));

click this link

另一个示例代码:有时通过Java Web Start或任何其他方式将应用程序分发到jar文件中很有用。因此,您可能必须从jar中读取一些资源(图像或属性文件)。你怎么能这样做 ?这很简单,这是一个检索图像的例子:

ImageIcon image = (new ImageIcon(getClass().getResource("yourpackage/mypackage/image.gif")));

通常,您可以通过以下方式检索InputStream:

InputStream is = this.getClass().getClassLoader().getResourceAsStream("yourpackage/mypackage/myfile.xml");
相关问题