Ссылка на ресурс, помещенный в папку WEB-INF в файле JSP, возвращает HTTP 404 на ресурс

У меня есть динамический веб-проект под названием 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, и он показывает сообщение об ошибке.

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

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

3 ответа

Файлы в /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>,

Смотрите также:

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

/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>

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

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

...

И в MYCLASS я создал публичную статическую строку String 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;
    }

}
Другие вопросы по тегам