同一Java包中Javascript的图像src

同一Java包中Javascript的图像src,java,javascript,html,image,Java,Javascript,Html,Image,我已经在Java包中放置了一个.js文件以及一个.css文件和所需的图像。目录结构为: info.release.wicket.custom.ajax.link AjaxLoadingLink.java AjaxLoadingLink.css AjaxLoadingLink.js indicator.gif 现在从.css文件中,indicator.gif可以作为background image:url(indicator.gif)访问。但是在.js文件spinner.innerHTML

我已经在Java包中放置了一个.js文件以及一个.css文件和所需的图像。目录结构为:

  • info.release.wicket.custom.ajax.link
    • AjaxLoadingLink.java
    • AjaxLoadingLink.css
    • AjaxLoadingLink.js
    • indicator.gif
现在从.css文件中,indicator.gif可以作为
background image:url(indicator.gif)访问。但是在.js文件
spinner.innerHTML=“”不工作

在这种情况下,Javascript中的图像路径是什么

如果我将图像放在WAR的resources文件夹中,并以
spinner.innerHTML=“”的身份访问它它正在工作。但我需要通过上述方式来实现这一点,即放入包中


谢谢和问候

indicator.gif的路径将相对于调用js文件的实际HTML文档。如果.gif与html文档位于同一文件夹中(或者在您的情况下是.java文件?),那么您可以从那里调用它。

指向indicator.gif的路径将与调用js文件的实际html文档相对应。如果.gif与html文档(或者我猜您的例子中是.java文件?)在同一个文件夹中,那么您可以从那里调用它。

为什么要将JS放在java包中?如果您将所有文件放在一个目录中,例如/ajaxloading/应该可以工作。包中的Java资源放在WEB-INF\类中,您不能从那里通过相关url寻址资源

另一种可能是编写一个servlet,将所有文件服务于一个包,然后将该servlet映射到web.xml中的url和servlet映射

我也在一个项目中使用它。以下是消息来源:

public class StyleProviderServlet extends HttpServlet {

    private static final long serialVersionUID = 7156462313946659366L;

    /**
     * read buffer.
     */
    private static final int BUFFER_SIZE = 102400;

    private final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(StyleProviderServlet.class);

    /**
     * Package
     */
    private static final String PACKAGE = "com/mycompany/mypackage/style";

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    this.handleRequest(req, resp);
    }

    protected void handleRequest(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    String pathInfo = req.getPathInfo();
    logger.debug("pathInfo = {}", pathInfo);

    StringBuilder resourcePathBuilder = new StringBuilder(100);
    resourcePathBuilder.append("/");
    resourcePathBuilder.append(PACKAGE);
    resourcePathBuilder.append(pathInfo);
    String resourcePath = resourcePathBuilder.toString();
    logger.debug("resourcePath: {}", resourcePath);

    InputStream inputStream = this.getClass().getResourceAsStream(resourcePath);

    if (inputStream != null) {
        String mimeType = getMimeType(pathInfo);
        if (mimeType != null) {
        resp.setContentType(mimeType);
        }

        BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
        try {
        logger.debug("at least {} bytes are ready to be read", bufferedInputStream.available());
        ServletOutputStream outputStream = resp.getOutputStream();
        int index = -1;
        byte[] buffer = new byte[BUFFER_SIZE];
        while ((index = bufferedInputStream.read(buffer)) != (-1)) {
            outputStream.write(buffer, 0, index);
        }

        } finally {
        bufferedInputStream.close();
        }
    } else {
        logger.debug("no resource found for resourcePath '{}'", resourcePath);
    }
    }

    protected String getMimeType(String pathinfo) {
    if (pathinfo != null) {
        ServletContext servletContext = getServletContext();
        String mimeType = servletContext.getMimeType(pathinfo);
        logger.debug("pathInfo :{}, mimeType={}", pathinfo, mimeType);
        return mimeType;
    } else {
        return null;
    }
    }

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    this.handleRequest(req, resp);
    }
}
下面是web.xml中的映射:

<servlet-mapping>
    <servlet-name>StyleProviderServlet</servlet-name>
    <url-pattern>/style/*</url-pattern>
  </servlet-mapping>

StyleProviderServlet
/风格/*
现在,您可以通过url/style/e.g./style/AjaxLoadingLink.css访问com/mycompany/mypackage/style包中的所有文件


您还可以通过这种方式将所有文件放在一个JAR中,并将这个JAR放入WEB-INF/lib

为什么要将JS放在java包中?如果您将所有文件放在一个目录中,例如/ajaxloading/应该可以工作。包中的Java资源放在WEB-INF\类中,您不能从那里通过相关url寻址资源

另一种可能是编写一个servlet,将所有文件服务于一个包,然后将该servlet映射到web.xml中的url和servlet映射

我也在一个项目中使用它。以下是消息来源:

public class StyleProviderServlet extends HttpServlet {

    private static final long serialVersionUID = 7156462313946659366L;

    /**
     * read buffer.
     */
    private static final int BUFFER_SIZE = 102400;

    private final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(StyleProviderServlet.class);

    /**
     * Package
     */
    private static final String PACKAGE = "com/mycompany/mypackage/style";

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    this.handleRequest(req, resp);
    }

    protected void handleRequest(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    String pathInfo = req.getPathInfo();
    logger.debug("pathInfo = {}", pathInfo);

    StringBuilder resourcePathBuilder = new StringBuilder(100);
    resourcePathBuilder.append("/");
    resourcePathBuilder.append(PACKAGE);
    resourcePathBuilder.append(pathInfo);
    String resourcePath = resourcePathBuilder.toString();
    logger.debug("resourcePath: {}", resourcePath);

    InputStream inputStream = this.getClass().getResourceAsStream(resourcePath);

    if (inputStream != null) {
        String mimeType = getMimeType(pathInfo);
        if (mimeType != null) {
        resp.setContentType(mimeType);
        }

        BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
        try {
        logger.debug("at least {} bytes are ready to be read", bufferedInputStream.available());
        ServletOutputStream outputStream = resp.getOutputStream();
        int index = -1;
        byte[] buffer = new byte[BUFFER_SIZE];
        while ((index = bufferedInputStream.read(buffer)) != (-1)) {
            outputStream.write(buffer, 0, index);
        }

        } finally {
        bufferedInputStream.close();
        }
    } else {
        logger.debug("no resource found for resourcePath '{}'", resourcePath);
    }
    }

    protected String getMimeType(String pathinfo) {
    if (pathinfo != null) {
        ServletContext servletContext = getServletContext();
        String mimeType = servletContext.getMimeType(pathinfo);
        logger.debug("pathInfo :{}, mimeType={}", pathinfo, mimeType);
        return mimeType;
    } else {
        return null;
    }
    }

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    this.handleRequest(req, resp);
    }
}
下面是web.xml中的映射:

<servlet-mapping>
    <servlet-name>StyleProviderServlet</servlet-name>
    <url-pattern>/style/*</url-pattern>
  </servlet-mapping>

StyleProviderServlet
/风格/*
现在,您可以通过url/style/e.g./style/AjaxLoadingLink.css访问com/mycompany/mypackage/style包中的所有文件


您也可以这样将所有文件放在一个JAR中,并将此JAR放入WEB-INF/lib

Java与此有什么关系?也用html重新标记此文件。Java与此有什么关系?也用html重新标记此文件。谢谢。但是在这个场景中,我不需要调用.java文件中的映像。js的方法是从.java调用的,因此应该从该.js访问该图像。当您在中加载该javascript时,其中的任何路径都将与您加载到的内容相关,因此无论是HTML文件还是.java文件,您的路径都必须与包含该文件的内容相关。Javascript从来不会自己运行……它的内容被下载到容器环境中并内联运行。使用src调用它与内联编写它没有什么不同,因此所有的路径引用都是相对于容器环境的。谢谢。但是在这个场景中,我不需要调用.java文件中的映像。js的方法是从.java调用的,因此应该从该.js访问该图像。当您在中加载该javascript时,其中的任何路径都将与您加载到的内容相关,因此无论是HTML文件还是.java文件,您的路径都必须与包含该文件的内容相关。Javascript从来不会自己运行……它的内容被下载到容器环境中并内联运行。使用src调用它与内联编写它没有什么不同,因此所有的路径引用都是相对于容器环境的。