3 回答

TA貢獻(xiàn)1735條經(jīng)驗(yàn) 獲得超5個(gè)贊
首先,<welcome-file>并不代表“默認(rèn)主頁(yè)”的路徑。它代表包含您希望擔(dān)任了作為默認(rèn)的文件時(shí),文件夾中的物理文件的文件名的文件夾一樣/,/foo/,/foo/bar/,請(qǐng)求等。
因此,在JSF 2.x風(fēng)格中,基本上是:
<welcome-file-list>
<welcome-file>index.xhtml</welcome-file>
</welcome-file-list>
這樣,如果最終用戶請(qǐng)求/并且您有/index.xhtml,則將為您提供服務(wù)?;蛘?,如果最終用戶請(qǐng)求,/foo并且您有/foo/index.xhtml,則將為它提供服務(wù),等等。如果沒(méi)有這樣的文件,則將返回404錯(cuò)誤。
現(xiàn)在,你似乎映射了FacesServlet一個(gè)前綴<url-pattern>的/faces/*。這是JSF 1.0 / 1.1時(shí)代以來(lái)的遺留物,實(shí)際上最近不建議這樣做。也許您正在閱讀針對(duì)JSF 1.x的過(guò)時(shí)教程,或者本來(lái)是為JSF 1.x編寫的,維護(hù)不佳的教程,但隨后針對(duì)JSF 2.x進(jìn)行了不當(dāng)更新,而不是從頭開始重寫。
該教程似乎也沒(méi)有向您解釋一些servlet基礎(chǔ)知識(shí)。即,為了使XHTML頁(yè)面中的JSF組件運(yùn)行并生成一些HTML輸出,F(xiàn)acesServlet必須在請(qǐng)求XHTML頁(yè)面時(shí)調(diào)用。當(dāng)您像這樣請(qǐng)求XHTML頁(yè)面時(shí)/index.xhtml,當(dāng)FacesServlet映射到時(shí)/faces/*,它將不會(huì)被調(diào)用。然后,瀏覽器將檢索原始的未解析的JSF源代碼,而不是生成的HTML輸出。您可以通過(guò)右鍵單擊Web 瀏覽器中的查看源代碼來(lái)查看它。您應(yīng)該這樣請(qǐng)求頁(yè)面,/faces/index.xhtml以便FacesServlet可以運(yùn)行并產(chǎn)生瀏覽器可以理解并呈現(xiàn)的HTML輸出。
這與歡迎文件一起使用效果不佳。這完全解釋了為什么當(dāng)index.xhtml用作歡迎文件時(shí)會(huì)得到一個(gè)“干凈的白色”(空白)頁(yè)面的原因(某些劣等的Web瀏覽器,例如IE,由于包含原始XHTML源代碼的響應(yīng)中缺少/錯(cuò)誤的內(nèi)容類型,會(huì)令人困惑地提示下載對(duì)話框)。該FacesServlet是根本就沒(méi)有被調(diào)用。只需擺脫老式的/faces/*URL模式,而改用JSF 2.x *.xhtml模式的URL模式即可。
<servlet-mapping>
<servlet-name>facesServlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
通過(guò)這種方式,歡迎文件應(yīng)該可以工作,您可以通過(guò)直接請(qǐng)求JSF的物理URL來(lái)打開JSF頁(yè)面,而不會(huì)浪費(fèi)虛擬URL。在JSF 1.x中這是不可能的,因?yàn)樗鼘⑹笷acesServlet運(yùn)行在無(wú)限循環(huán)中進(jìn)行自我調(diào)用,并導(dǎo)致堆棧溢出。
添加回答
舉報(bào)