2010-05-24 34 views
6

在包含在另一個.jsp中的.jsp中重複標頭時會發生什麼?Java(JSP):在「sub-jsp」中重複contentType標頭

例如,如果example.jsp開始與此:

<?xml version="1.0" encoding="UTF-8"?> 
<jsp:root version="2.0" xmlns:jsp="http://java.sun.com/JSP/Page"> 
<jsp:directive.page contentType="text/html; charset=UTF-8" /> 

<div class="content"> 

<jsp:include page="support.jsp"/> 
... 

(它包括support.jsp

然後support.jsp開始與此:

<?xml version="1.0" encoding="UTF-8"?> 
<jsp:root version="2.0" xmlns:jsp="http://java.sun.com/JSP/Page"> 
<jsp:directive.page contentType="text/html; charset=UTF-8" /> 
... 

這是一個問題嗎?這是不好的做法嗎?

什麼是具體當您重複幾次只有對應於一個標題在結果.html頁面的標題?

回答

5

JSP Specification

JSP.5.4 < JSP:包括>

...

包含的網頁無法改變 響應狀態代碼或設置頭。 這排除了調用方法,如 setCookie。試圖調用這些 方法將被忽略。 約束等同於 RequestDispatcher類的包含方法強加的 。

也就是說,嘗試設置內容類型將被忽略。

0

這是絕對正常的做法。

你所說的'headers'只是jsp編譯器的指令。

+0

0123但是我稱之爲「頭文件」也被稱爲axtavt引用的官方JSP規範中的「頭文件」) – SyntaxT3rr0r 2010-05-24 17:52:46

2

該指令直接翻譯成ServletResponse.setContentType呼叫

此方法的單證說:

設置響應 的內容類型被髮送到客戶端,如果 反應是不承諾了。 給定的內容類型可能包括 字符編碼規範,對於 示例,text/html; charset = UTF-8。如果在調用getWriter 之前調用此方法,則 響應的字符編碼僅爲 ,如果設置爲 ,則返回給定的內容類型。

此方法可能會重複調用 來更改內容類型和字符 編碼。如果在提交響應爲 之後調用 ,則此方法無效。如果在調用getWriter之後調用 或響應爲 後調用 響應的字符編碼,則它不會設置 響應的字符編碼。如果 協議提供了這樣做的一種方式

容器必須進行通信用於該servlet 響應的寫入器到客戶機的 內容類型和字符 編碼。 對於HTTP,使用Content-Type 標頭。

在我看來,最好在頂層JSP頁面中只使用一次該指令,甚至可能在控制器servlet中,但絕對不在包含的頁面中。

對於沒有記在JSPX頁,一個指令,IS有益的,應在具有非ASCII字符是<%@ page pageEncoding="XXXX" %>所有JSP進行設置。如果您不喜歡在您的頁面上打印\ uXXXX代碼,我強烈建議您使用它。

+0

但是,OP使用JSPX(JSP XML,XML語法中的JSP,「JSP文檔」 )。 XML聲明已包含頁面編碼。 – BalusC 2010-05-24 18:04:37

+0

@BalusC:感謝您指出這一點。最後一段的語言更新。我認爲'contentType'指令最初的混淆和擴散源於不理解這兩個完全獨立的指令是如何工作的。基本上,如果你的JSP頁面沒有非ASCII,那麼它需要設置'pageEncoding',但你應該把'contentType'留給鏈中更高的一個。至少這是我自己的困惑。 – 2010-05-24 18:36:46

+0

我給你+1了,但是......你沒有真正解決我認爲的問題:axtavt引用的JLS明確指出*「包含的頁面不能更改響應狀態代碼或設置標題,嘗試調用這些方法將會忽略「*。所以AFAICT我正在做一個包含,因此後面的調用將被忽略。這與您引用的內容不同,後者專門處理* setContentType *方法(顯然,當* not *從「included」.jsp中調用時)。 – SyntaxT3rr0r 2010-05-24 20:06:44