首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> JSP 程式設計 >> 關於JSP

解決 JSP 輸出 XML 宣告不在文件開頭的解析錯誤

     編輯:關於JSP

在 JSP 中使用 JSTL 拼裝 XML 並設定 contentType="text/xml" 時,Firefox 回報「XML 或文本聲明不在實體的開頭」,Chrome 提示「XML declaration allowed only at the start of the document」。根因在於 JSP 編譯後產生的 Servlet 會在頁面最前方輸出空白字元(換行、縮排),導致 <?xml ...?> 不在文件第 1 列第 1 欄。

問題重現

<%@ page language="java" contentType="text/xml; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
<?xml version="1.0" encoding="UTF-8"?>
<videoNews>
    <c:forEach items="${lstnews}" var="n">
        <news id="${n.id}">
            <title>${n.title}</title>
            <length>${n.timeLength}</length>
        </news>
    </c:forEach>
</videoNews>

上方程式碼在 Eclipse 內建瀏覽器正常,但在 Firefox/Chrome 失敗,因為 JSP 編譯後的 _jspService() 會先寫入換行符。

解決方案:將所有指令壓縮至第一行

<%@ page language="java" contentType="text/xml; charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %><?xml version="1.0" encoding="UTF-8"?><videoNews><c:forEach items="${lstnews}" var="n"><news id="${n.id}"><title>${n.title}</title><length>${n.timeLength}</length></news></c:forEach></videoNews>

雖然可讀性降低,但確保 XML 宣告位於輸出流最開頭。若專案使用 Maven,可配置 jspc 外掛預編譯並移除空白;或改用 Servlet 直接輸出 XML,徹底避開 JSP 空白字元問題。

替代最佳實務

  1. Spring MVC @ResponseBody:回傳 JAXB 物件或 String,由 MappingJackson2XmlHttpMessageConverter 自動序列化,無空白干擾。
  2. Freemarker/Thymeleaf:模板引擎可精確控制輸出,設定 strip_whitespace=true。
  3. JSP Trim 指令:<%@ page trimDirectiveWhitespaces="true" %>(JSP 2.1+),自動移除指令間空白,但仍需確保 XML 宣告緊跟在後。

總結

JSP 輸出 XML 時,XML 宣告必須位於輸出流第 0 位元組。最快修法是將 page、taglib、xml 三行合併為一行;長遠建議改用現代 MVC 架構輸出 XML/JSON,徹底解決空白字元干擾。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved