在JSP文件中引用放置在WEB-INF文件夹中的资源会导致返回HTTP 404错误。

14

我有一个动态Web项目叫做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.
任何想法为什么会发生这种情况?我该如何纠正这个问题? 谢谢 马克
2个回答

22

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

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

或者更加动态一些,这样你就不需要每次更改上下文路径时都要更改你的JSP。

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

JSP文件可以保存在/WEB-INF目录中,但是这样它们只能通过派遣Servlet来访问,可以通过自定义扩展HttpServlet或由Servlet容器隐式提供,例如<welcome-file>

另请参见:


如果JSP文件存储在/WEB-INF目录下,我应该如何编写href中的字段? - shirley
@shirley:只需指定调度servlet的URL即可。如果您完全不了解servlet,请阅读http://stackoverflow.com/tags/servlets/info。 - BalusC
1
我有同样的问题。我将css文件夹放在webapp中,而我的jsp文件位于WEB-INF中...但我仍然无法让引用起作用。是否需要在web.xml中进行一些配置以使servlet dispatcher也能正常工作? - Jason Krs

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>

CSS文件名为styles.css。我在输入问题时犯了一个错误。 - markjason72
好的。但是你的目录结构应该与我的答案一致。 - Harry Joy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接