在JSP文件中引用放置在WEB-INF文件夹中的资源会在资源上返回HTTP 404

时间:2011-04-22 04:19:07

标签: jsp resources web-inf

我有一个名为BookShopWeb的动态Web项目,我在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 个答案:

答案 0 :(得分:22)

/WEB-INF文件夹中的文件无法公开访问。将CSS文件放在WebContent文件夹中一级,并确保可以通过在浏览器地址栏中直接输入URL来访问它们。此外,您在<link href>中指定的URL必须相对于请求URL(在打开JSP时在浏览器地址栏中看到),而不是它在服务器磁盘文件系统上的位置。最好的方法是通过正斜杠/开始使其成为域相关的。

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

或者更动态一点,这样每次更改上下文路径时都不需要每次都更改JSP

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

JSP文件可以保存在/WEB-INF中,但这样它们只能通过调度servlet访问,可以通过扩展HttpServlet本地生成,也可以由servletcontainer隐式调用,例如<welcome-file>

另见:

答案 1 :(得分:6)

您的目录结构应为

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

答案 2 :(得分:-1)

我有同样的问题;我尝试了一切,最终我是通过mysealf做到的: 我在所有JSP中写道 ...

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

...

在MYCLASS中,我创建了公共静态字符串getCSS(){...}; 从IDE(Eclipse)我创建了一个文件夹EXTENDING D:/ ...中的文件夹,我放置了css。在函数中,JSP执行函数,该函数使用给定路径读取CSS(其中u放置了css,如D:/PROJECT/css/SOMETHING.css)并返回它。 因此,JSP在 中写入MYCLASS.getCSS()的值。转发的JSP在其样式标记中包含CSS:)

这不是最好的方法,但它是唯一对我有用的东西。 我希望我帮助过你。

使用BufferedReader读取CSS文件,很明显。 !!和!!服务器必须读取它ONCE;在函数结束时,将读取的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;
    }

}