gpt4 book ai didi

java - 当我尝试导入静态文件时出现 JSP 异常

转载 作者:行者123 更新时间:2023-11-30 11:31:22 24 4
gpt4 key购买 nike

我正在尝试将文件中的 javascript 导入到我的 jsp 中以用作内联脚本:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<script>
<c:import url="/path/to/file.js" />
</script>

上面的代码在 99% 的时间里都有效,但我在我的 tomcat 日志中看到了一些这样的错误:

Jun 20, 2013 1:25:33 AM org.apache.catalina.core.ApplicationDispatcher invoke
SEVERE: Servlet.service() for servlet jsp threw exception
javax.servlet.jsp.JspTagException: 304 /path/to/file.js
at org.apache.taglibs.standard.tag.common.core.ImportSupport.acquireString(ImportSupport.java:329)
at org.apache.taglibs.standard.tag.common.core.ImportSupport.doEndTag(ImportSupport.java:171)
at org.apache.jsp.WEB_002dINF.jsp.common.head.scripts_jsp._jspx_meth_c_005fimport_005f0(scripts_jsp.java:182)
at org.apache.jsp.WEB_002dINF.jsp.common.head.scripts_jsp._jspService(scripts_jsp.java:85)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:749)
at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:605)
at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:544)
at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:954)
at org.apache.jsp.WEB_002dINF.jsp.game_jsp._jspService(game_jsp.java:181)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
.......

我在 ImportSupport.java 中找到了抛出上述异常的代码:

// disallow inappropriate response codes per JSTL spec
if (irw.getStatus() < 200 || irw.getStatus() > 299) {
throw new JspTagException(irw.getStatus() + " " + stripSession(targetUrl));
}

所以看起来 servlet 响应代码是 304。

问题是为什么?这是错误还是我遗漏了什么?

更新:

问题似乎只有在传入请求上有 If-Modified-Since header 时才会出现

更新 2:

我通过从除静态文件之外的每个请求中删除 If-Modified-Since header 解决了这个问题。

最佳答案

我正在使用 Spring MVC 的 ResourceHttpRequestHandler(配置有 mvc:resources)从/resources/* 为我的静态资源提供服务,它在使用 If-Modified-Since header 的传入请求上返回 304。因此,当我使用 c:import 包含此类静态资源并且传入请求具有 If-Modified-Since header 时,我得到 javax.servlet.jsp.JspTagException: 304 错误。

我需要动态包含,所以 @include 不是一个选项,并且 jsp:include 在尝试包含由 ResourceHttpRequestHandler 处理的 URL 时会产生 IllegalStateException。所以我只好编写自己的包含文件,从文件中读取并将其写到 JSP 中:

<%@ page import="org.springframework.web.context.support.ServletContextResourceLoader, org.springframework.core.io.Resource" %>
<%@ page import="org.apache.commons.io.IOUtils" %>

<%
String path = "/resources/fileName.html";
ServletContextResourceLoader loader = new ServletContextResourceLoader(getServletConfig().getServletContext());
Resource resource = loader.getResource(path);
IOUtils.copy(contentResource.getInputStream(), pageContext.getOut());
%>

关于java - 当我尝试导入静态文件时出现 JSP 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17218609/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com