22

我在项目中添加了一个外部CSS样式表,并将其放在Eclipse中项目的WEB-CONTENTS文件夹中。当我在Tomcat上部署它时,没有应用样式表。当我在Chrome中调试并打开它时,它给了我找不到404文件错误。为什么会这样?如何修复?

代码如下:

<%@page language=“java”contentType=“text/html;charset=ISO-8859-1”pageEncoding=“ISO-8859-1”%><%@taglib前缀=“c”uri=“http://java.sun.com/jsp/jstl/core" %><!DOCTYPE html PUBLIC“-//W3C//DTD html 4.01过渡//EN”“”http://www.w3.org/TR/html4/loose.dtd"><html><头部><meta http-equiv=“Content-Type”Content=“text/html;charset=ISO-8859-1”><title>现已加入<link href=“globalCSS.css”rel=“stylesheet”type=“text/css”/></头><body><div>这在顶部<c:import url=“header.jsp”/><c:import url=“navigationBar.jsp”/><c:import url=“leftpane.jsp”/><c:import url=“mainContent.jsp”/><c:import url=“rightpane.jsp”/><c:import url=“footer.jsp”/></body></html>
4
  • 用于加载CSS文件的URL显然不正确。发布HTML代码并告诉我们用于显示HTML页面的URL。 评论 2013年1月27日15:44
  • 在工作区项目中,所有这些的路径是什么? 评论 2013年1月28日3:01
  • 1
    css与访问它的jsp页面位于同一文件夹中,即WEB-CONTENTS。所以我不认为这条路是问题所在。 评论 2013年1月28日9:53
  • 密切相关:stackoverflow.com/q/3655316 评论 2018年4月18日6:17

2个答案2

重置为默认值
39

你得到404找不到文件错误是,您的CSS路径作为href公司缺少属性上下文路径.

HTTP请求URL包含以下部分:

http://[host]:[port][request-path]?[查询字符串]

这个请求路径进一步由以下元素组成:

  • 上下文路径:正斜杠(/)与上下文servlet的web应用程序。例子:http://主机[:port]/context-root[/url模式]

  • Servlet路径:与组件对应的路径部分激活此请求的别名。此路径以前进开始斜线(/)。

  • 路径信息:请求路径中不属于上下文路径或servlet路径。

阅读更多信息在这里.


解决

您的问题有几种解决方案,以下是其中的一些:

1) 使用<c:url>JSTL中的标记

在我的Java web应用程序中,我通常使用<c:url>标签来自JSTL公司定义CSS/JavaScript/image和其他静态资源的路径时。通过这样做,您可以确保引用了这些资源始终相对于应用程序上下文(上下文路径)。

如果您说,您的CSS位于内部Web内容文件夹,则此操作应该有效:

<link type=“text/css”rel=“stylesheet”href=“<c:url value=”/globalCSS.css“/>”/>

其工作原理在“JavaServer Pages™标准标记库“版本1.2规范第7.5章(重点是我的):

7.5<c:url>
使用适当的重写规则构建URL。
...
URL必须是绝对URL从方案开始(例如“http://server/context/page.jsp”)或JSP.2.2.1“相对URL”中JSP 1.2定义的相对URL规范”。因此,实现必须预先发送以斜杠开头的URL的上下文路径(例如“/page2.jsp”)所以客户端浏览器可以正确解释这些URL。

注释
别忘了使用Taglib指令在JSP中可以引用JSTL标签。另请参阅示例JSP页面在这里.


2) 使用JSP表达式语言和隐式对象

可供替代的解决方案正在使用表达式语言(EL)要添加应用程序上下文:

<link type=“text/css”rel=“stylesheet”href=“${pageContext.request.contextPath}/globalCSS.css”/>

这里,我们从请求对象。为了访问请求对象,我们使用了页面上下文对象 隐式对象.


3) 使用<c:set(设置)>JSTL中的标记

免责声明
这个解决方案的想法来自在这里.

要使访问上下文路径比解决方案2中的更紧凑,可以首先使用JSTL<c:set(设置)>标签,那个设置值EL变量或任何JSP作用域(页面、请求、会话或应用程序)中EL变量的属性,以便以后访问。

<c:set var=“root”value=“${pageContext.request.contextPath}”/>...<link type=“text/css”rel=“stylesheet”href=“${root}/globalCSS.css”/>

重要注意事项
默认情况下,为了以这种方式设置变量,包含以下内容的JSP设置必须访问标记至少一次(包括在应用作用域使用范围属性,如<c:set var=“foo”value=“bar”scope=“application”/>),之前使用这个新变量。例如,您可以几个需要此变量的JSP文件。所以你必须以太a)二者都应用在其他JSP文件中使用此变量之前,请先作用域AND访问此JSP,或者b)在每个JSP文件(您需要在其中访问它)中设置包含变量的上下文路径。


4) 使用ServletContextListener

使访问上下文路径更紧凑的更有效方法是设置一个变量,该变量将保存上下文路径并将其存储在应用范围使用监听器这个解决方案类似于3号解决方案,但好处是现在设置了变量保持上下文路径就在一开始并且在应用程序范围内可用,不需要其他步骤。

我们需要一个实现ServletContextListener接口。以下是此类的一个示例:

包com.example.listener;导入javax.servlet。Servlet上下文;导入javax.servlet。ServletContextEvent;导入javax.servlet。ServletContextListener;导入javax.servlet.annotation。WebListener;@WebListener(网络侦听器)公共类AppContextListener实现ServletContextListener{@覆盖public void contextInitialized(ServletContextEvent事件){ServletContext sc=event.getServletContex();sc.setAttribute(“ctx”,sc.getContextPath());}@覆盖public void contextDestroyed(ServletContextEvent事件){}}

现在,在JSP中,我们可以使用EL访问此全局变量:

<link type=“text/css”rel=“stylesheet”href=“${ctx}/globalCSS.css”/>

注释
@WebListener(网络侦听器)注释自Servlet 3.0版起可用。如果使用支持旧servlet规范的servlet容器或应用程序服务器,请删除@WebServlet注释,而不是在部署描述符(web.xml)。下面是一个示例web.xml网站支持最高Servlet版本2.5的容器的文件(为了简洁起见,省略了其他配置):

<?xml version=“1.0”encoding=“UTF-8”?><web-app xmlns=“http://java.sun.com/xml/ns/javaee"xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation=“http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"版本=“2.5”>...  <听众><listener-class>com.example.listener。AppContextListener</listener-class></listener>...</webapp>


5) 使用Scriptlet

作为建议按用户@加文科阿您还可以使用小脚本这样地:

<%=请求.getContextPath()%>

对于这样一件小事,可能没关系,只需注意通常不鼓励在JSP中使用scriptlet.


结论

我个人更喜欢第一种解决方案(在我以前的项目中大部分时间都使用它)或第二种,因为它们最清晰、直观和明确(IMHO)。但你选择最适合你的。


其他想法

您可以将web应用程序部署为默认应用程序(即在默认根上下文),因此可以访问它不指定上下文路径。有关更多信息,请阅读“更新”部分在这里.

0
2

使用以下代码可以解决此问题。。。。如果您使用localhost服务器运行文件,那么可以按照Jsp Page Code解决此问题。此代码置于jsp文件中的头标记之间

<style type=“text/css”><%@include file=“css/style.css”%></style><script type=“text/javascript”><%@include file=“js/script.js”%></script>

您的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.