繁体   English   中英

如何从JAR访问资源?

[英]How to access to resources from a JAR?

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

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

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

谢谢。

nota:使用Zk框架,我们可以使用简单的linke访问,即“〜。/ web / css / header.css”,但它不能与JSP一起使用:(

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

  1. 实现自己的servlet,可以从类路径中读取数据
  2. 将其映射到某个URL
  3. 在JSP中使用URL,并使用一些标识所请求文件的参数/路径

我实现了简单的原型,它只处理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,这是我的战争的一部分。 容易,不是吗?

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

xr.parse( new InputSource( filename ));

点击此链接

另一个示例代码:有时通过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");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM