Как получить доступ к ресурсам из JAR?

1

У меня есть библиотека jar, которая содержит изображения, css и т.д. Эта банка основана на проекте maven. Все файлы размещаются в каталоге src/main/resources/web.

Ящик размещен в shared/lib Tomcat 5.5, чтобы быть доступным для всех веб-приложений.

Теперь, в стандартном веб-приложении, как получить доступ к css (например) в ссылку стилей страницы JSP?

Спасибо.

nota: с базой Zk мы можем получить доступ с помощью простой ссылки, то есть "~./web/css/header.css", но она не работает с JSP :(

Теги:
jsp
servlets
jar
tomcat5.5

2 ответа

2
Лучший ответ

Вы можете, но вам нужно какое-то ручное кодирование, поскольку сервлет по умолчанию (часть контейнера /tomcat/, который обслуживает статические ресурсы) ничего не знает о ваших баночках. Тебе нужно

  1. реализовать собственный сервлет, который может читать данные из пути к классам
  2. сопоставьте его с URL-адресом
  3. использовать URL-адрес в JSP с некоторым параметром/путем идентификации запрашиваемого файла

Я реализовал простой прототип, он обрабатывает только файлы CSS, и он не охватывает никаких угловых случаев. Но он работает, и вы можете продлить его по мере необходимости:

Сервлет просто, он просто принимает участие или 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-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"/>

Я скопировал файл layout.css под стилями каталога в одной банке, которая является частью моей войны. Легко, не так ли?

  • 0
    Я не совсем понимаю код вашей ссылки.
  • 0
    ок, попробую сам написать
Показать ещё 5 комментариев
0

Проблема заключалась в том, что я слишком далеко продвинулся в вызове метода анализа XMLReader. Метод parse принимает InputSource, поэтому нет причин даже использовать FileReader. Изменение последней строки кода выше на

xr.parse( new InputSource( filename ));

нажмите эту ссылку

Еще один пример кода: Иногда полезно распространять приложение в файле jar через Java Web Start или любым другим способом. Таким образом, вам нужно будет прочитать некоторый ресурс (изображения или файл свойств) изнутри банки. Как вы можете это сделать? Его очень простой, вот пример, чтобы получить изображение:

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

В общем, вы можете получить InputStream следующим образом:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню