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

时间:2010-09-07 02:09:28

标签: css image jsp servlets

当我将servlet转发到JSP时,我在加载CSS和图像以及创建指向其他页面的链接方面遇到了麻烦。具体来说,当我将<welcome-file>设置为index.jsp时,正在加载CSS并显示我的图像。但是,如果我将<welcome-file>设置为HomeServlet,将控件转发到index.jsp,则不会应用CSS并且不会显示我的图像。

我的CSS文件位于web/styles/default.css 我的图片位于web/images/

我正在链接到我的CSS:

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

我正在显示我的图片如下:

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

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


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

alt text

header.jsp文件是包含CSS链接标记的文件。 HomeServlet设置为welcome-file中的web.xml

<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 :我最终发现了问题 - 我的servlet映射不正确。显然,当将Servlet设置为<welcome-file>时,它不能具有/的URL模式,我觉得这有点奇怪,因为它不代表网站的根目录吗?

新映射如下:

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

9 个答案:

答案 0 :(得分:95)

JSP文件生成的HTML页面中的所有相对URL都是相对于当前请求URL(您在浏览器地址栏中看到的URL)和相对于JSP文件的位置正如您所期望的那样在服务器端。这就是webbrowser必须通过URL单独下载这些资源,而不是必须以某种方式从磁盘中包含它们的Web服务器。

除了更改相对URL以使它们相对于servlet的URL而不是JSP文件的位置之外,解决此问题的另一种方法是使它们相对于域根目录(即以{{开头) 1}})。这样,当您更改servlet的URL时,无需担心再次更改相对路径。

/

但是,您可能不希望硬编码上下文路径。很合理。您可以通过<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> 获取EL中的上下文路径。

${pageContext.request.contextPath}

(可以很容易地缩短<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}" />

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

${root}

无论哪种方式,如果你有很多相对的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>http://等)开始。在普通EL中获取基本上下文路径没有简洁的方法,所以我们需要JSTL的一些帮助。

https://

这反过来(再次)一些警告。锚点(<%@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> URL)也将相对于基本路径!您希望改为相对于请求URL(URI)。所以,改变如

#identifier

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

每种方式都有自己的优点和缺点。这取决于你选择哪个。至少,您现在应该了解这个问题是如何产生的以及如何解决它:)

另见:

答案 1 :(得分:6)

我遇到了与Spring MVC应用程序类似的问题。我使用< mvc:resources >标记来解决此问题。

请查看以下链接了解更多详情。

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

答案 2 :(得分:2)

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

通过给出这样的路径意味着“从当前位置”,另一方面,如果你从/开始意味着“来自上下文”。

答案 3 :(得分:0)

您的欢迎页面设置为该Servlet。所以所有的css,images路径都应该相对于那个servlet DIR给出。这是个坏主意!你为什么需要servlet作为主页?将.jsp设置为索引页并从那里重定向到任何页面?

你试图从db填充任何字段是你使用servlet的原因吗?

答案 4 :(得分:0)

如果您使用的是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"/>

答案 5 :(得分:0)

至于你的更新,我对后面的推理感到困惑。挖得更深一些,找到了这个宝石:

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

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

因此,映射确实有意义。

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

答案 6 :(得分:0)

简短回答 - 在jsp中添加以下行,这将定义基础
base href =&#34; / {你申请的根} /&#34;

答案 7 :(得分:0)

下面的代码对我有用。

而不是      采用     <%@ include file =“ styles / default.css”%>

答案 8 :(得分:0)

您也可以尝试这个。因为这对我有用,而且很简单。

<style>
    <%@ include file="/css/style.css" %>
</style>