2013-06-20 28 views
2

我試圖從文件導入的JavaScript到我的JSP被用作在行腳本: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標題上

更新2只發生:

我通過去除解決了這個問題來自除了靜態文件之外的每個請求的If-Modified-Since標頭。

+1

請嘗試清除緩存並重試。 – NINCOMPOOP

+3

爲什麼不簡單使用: MickJ

+0

@MickJ出於性能原因。 – panos2point0

回答

1

我正在使用Spring MVC的ResourceHttpRequestHandler(使用mvc:resources進行配置)爲/ resources/*提供我的靜態資源,並在使用If-Modified-Since標頭的傳入請求上返回304。所以當我用c:import包含這樣一個靜態資源並且傳入請求有一個If-Modified-Since標題時,我得到了javax.servlet.jsp.JspTagException:304錯誤。

我需要動態包括所以@include不是一個選項,並且當試圖包含由ResourceHttpRequestHandler處理的URL時,jsp:include會產生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()); 
%> 
+0

這將工作以及,特別是如果刪除if-modified-since不是一個選項。 – panos2point0

+0

順便說一句 - 你是如何從請求中刪除if-modified-since標頭的? – tukushan

+0

是的,我只將它從靜態文件提供給客戶端瀏覽器的一個目錄留下。 – panos2point0

0

嘗試 - <c:import url="/path/to/file.js"/> 與嘗試 - <c:import url="/path/to/file.js/"/>

相關問題