Ссылка на ресурс, помещенный в папку WEB-INF в файле JSP, возвращает HTTP 404 на ресурс - PullRequest
14 голосов
/ 22 апреля 2011

У меня есть динамический веб-проект под названием BookShopWeb, который я создал в eclipse, со следующей структурой каталогов

/BookShopWeb/|
  |--src
  |---WebContent
                | 
                |---META-INF
                |----WEB-INF---web.xml
                            |
                            |--css--styles.css
                            |--jsp---index.jsp 

В файле web.xml я установил стартовую страницу как

<welcome-file-list>

<welcome-file>/WEB-INF/jsp/index.jsp</welcome-file>

В index.jsp я включаю css как

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

Страница индекса при загрузке, однако, не показывает информацию о css. Я проверил элемент с помощью firebug, и он показывает ошибкуreport

Apache Tomcat/6.0.29 - Error report..
The requested resource (/css/styles.css) is not available.

Есть идеи, почему это происходит? Как я могу это исправить?знак благодарности

Ответы [ 3 ]

22 голосов
/ 22 апреля 2011

Файлы в папке /WEB-INF не являются общедоступными.Разместите CSS-файлы на один уровень выше, в папке WebContent, и убедитесь, что они доступны, введя их URL-адрес прямо в адресной строке браузера.Кроме того, URL-адрес, который вы указываете в <link href>, должен относиться к URL-адресу запроса (который вы видите в адресной строке браузера при открытии JSP), а не к его расположению в файловой системе диска сервера.Наилучший подход - сделать его относительным к домену, начав с косой черты /.

<link rel="stylesheet" href="/BookShopWeb/css/styles.css" />

или чуть более динамично, чтобы вам не приходилось каждый раз менять JSP при каждом изменениипуть к контексту

<link rel="stylesheet" href="${pageContext.request.contextPath}/css/styles.css" />

Файлы JSP могут храниться в /WEB-INF, но в этом случае они доступны только через диспетчерский сервлет, либо самодостаточно расширенный HttpServlet, либо неявно с помощью контейнера сервлетов, такого как <welcome-file>.

См. Также:

6 голосов
/ 22 апреля 2011

Ваша структура каталогов должна быть

/BookShopWeb/|
  |--src
  |---WebContent
                | 
                |---META-INF
                |----WEB-INF---web.xml
  |
  |--css--styles.css
  |--jsp---index.jsp 

Также Вы назвали свой css как styles.jsp, что не является правильным способом объявления файла css.

В вашем web.xml:

<welcome-file-list>

<welcome-file>index.jsp</welcome-file>

В вашем файле JSP:

<head>
<link rel="stylesheet" type="text/css" href="./css/styles.css" />
</head>
0 голосов
/ 22 февраля 2015

У меня была такая же проблема;Я попробовал все, и в конце концов я сделал это моей половиной: я написал во всех JSP ...

<head>
<style type="test/css">
<%= MYCLASS.getCSS() %>
</style>
</head>

...

И в MYCLASS я создал публичную статическую строку getCSS() {...}; Из IDE (Eclipse) я создал папку, расширяющую папку в D: / ..., где я разместил css.В функции JSP выполняет функцию, которая читает CSS с заданным путем (где вы поместили CSS, например, D: /PROJECT/css/SOMETHING.css) и возвращает его.Таким образом, JSP записывает значение MYCLASS.getCSS () в .Перенаправленный JSP содержит CSS в своих тегах стиля:)

Это не лучший способ сделать это, но это единственное, что сработало для меня.Я надеюсь, что помог вам.

Используйте BufferedReader для чтения файла CSS, это очевидно.!!А также!!сервер должен прочитать его ОДИН РАЗ;в конце функции сохраните CSS для чтения в переменной, чтобы вам не приходилось читать его каждый раз, когда кто-то посещает вашу страницу;)

Код:

static String css = ""; // CSS FILE, ACCESSIBLE FROM ALL THE CLASS.
...
@SuppressWarnings("resource")
public static String getCSS(ENUM e) {
    BufferedReader br;  // BR

    String s = ""; // FINAL STRING
    File f; // THE CSS FILE

    if(css == "") { // READ ONLY IF String CSS (declared first) IS EMPTY
    try
    {

            f = new File(UR_PATH);  // IF DESKTOP
            if(!f.exists()) // IF f DOESN'T EXISTS
                throw new FileNotFoundException("CSS NOT FOUND!");
        }

        br = new BufferedReader(new FileReader(f)); // INIT BR

        System.out.println("READING CSS...");

        //then; useless comment

        try {

            while(true) {
                String cur = br.readLine(); //current line


                if(cur == null) // if cur is null, stop the BR
                    throw new IOException("ENDED CSS! YUPPIE!");

                else // else add cur (current) to s
                    s += cur;
            }
        }
        catch (IOException e1) { // IO IOException (end of CSS)
            System.out.println("CSS READ!");
            try {
                br.close(); // close br
            } catch (IOException e2) { // if CAN'T CLOSE BR... Error
                // TODO Auto-generated catch block
                e2.printStackTrace();
            }
            System.out.println("\n------------------\nThe server read a CSS; Content:\n"+s+"\n------------------\n");
            css = s;
        }


    }
    catch (FileNotFoundException fnfe)
    {
        System.err.println("\n----------\nFATAL ERROR IN \"Property.java\": WRONG CSS PATH");
        System.exit(-1);

    }

    return s;
    }
    // WATCH THE BEGIN. There was if(css == ""); this part of code will be executed if the program already stored the CSS in the String css.
    else {  // IF ALREADY DECLARED, RETURN CSS
        System.out.println("\n--------------------\nRETURNED CSS; ALREADY READ\n----------------------");
        return css;
    }

}
...