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

我有一个名为BookShopWeb的dynamicWeb项目,我在eclipse中创build,具有以下目录结构

/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的信息。我检查与萤火虫元素,它显示一个错误报告

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

任何想法为什么发生这种情况? 谢谢马克

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

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

或者更dynamic一点,以便每当更改上下文path时不需要每次更改JSP

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

JSP文件可以保存在/WEB-INF ,但是这样它们只能通过调度servlet来访问,或者通过扩展HttpServlet或者由servlet容器(如<welcome-file>隐式地访问。

也可以看看:

  • 当调用转发给JSP的Servlet时,浏览器无法访问/查找CSS,图像和链接等相关资源
  • / WEB-INF中的JSP返回“HTTP状态404请求的资源不可用”

你的目录结构应该是

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

我有同样的问题; 我试了一切,最后我用mysealf做了:我在所有的JSP中写了…

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

而在MYCLASS我创build了公共静态stringgetCSS(){…}; 在IDE(Eclipse)中,我创build了一个文件夹EXTENDING D:中的一个文件夹。 在这个函数中,JSP执行这个函数,它用一个给定的path读取CSS(放置CSS,比如D:/PROJECT/css/SOMETHING.css)并返回它。 所以JSP写入MYCLASS.getCSS()的值 。 转发的JSP包含他的样式标签中的CSS

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

使用BufferedReader读取CSS文件,很明显。 !!和!! 服务器必须读取一次; 在函数结束时,将读取的CSS保存在一个variables中,所以每次有人访问你的页面时都不需要读取它;)

码:

 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; } }