2011-10-24 113 views
1

我有一個JSF應用程序,它配置了一個Servlet Filter,配置爲/faces/*的urlPattern。 我想從faces上下文中隱藏一個JSP,這樣它就不會通過Servlet Filter。 所以我一直是我的項目的WebContent文件夾下的WebContent/Error.jsp並宣佈像web.xml如下:隱藏來自FacesContext的JSP

<error-page> 
    <exception-type>java.lang.NullPointerException</exception-type> 
    <location>/Error.jsp</location> 
</error-page> 

但我Error.jsp永遠不會被拾起。相反,我看到404頁面未找到錯誤。

更清楚,我想我的Error.jsp頁面網址爲:

http://localhost:8080/myappname/Error.jsp

但由只有到達:

http://localhost:8080/myappname/faces/Error.jsp

當我在faces-config.xml中聲明view-id時,情況也是如此。如果我想從faces上下文中隱藏它,我該在哪裏保留錯誤JSP?

+0

我不明白該過濾器的作用。它在做什麼?它是否映射到'ERROR'調度器? – BalusC

+0

@ BalusC-感謝您的迴應。在我的過濾器中我正在尋找會話中的屬性。但是在Error.jsp中這樣的屬性不存在。所以我想繞過過濾器的Error.jsp。這是我的要求。我不要不知道什麼是ERROR調度程序。請解釋一下。 – Sreeram

+0

@ BalusC-I瞭解錯誤調度程序是什麼。我'Error.jsp'不應該通過'filter'。我應該在哪裏放置'Error.jsp',以便我可以從URL中移除'faces'? – Sreeram

回答

0

根據迄今爲止給出的信息,它看起來應該可以正常工作。您在過濾器上沒有<dispatcher>ERROR</dispatcher>,因此每當NPE被拋出時都不應調用過濾器。

顯然NPE被另一個異常包裝了,因爲它被拋出在一個不合邏輯的地方,比如bean的構造函數而不是普通的bean動作方法。在這種情況下,JSF會重新推出它作爲ManagedBeanCreationException。容器會取代它,而不是NPE,因此將無法找到錯誤頁面。在容器的默認HTTP 500錯誤頁面中,您應該讀取堆棧跟蹤的最高層異常,以便確定正確的異常來爲其定義錯誤頁面。

請記住像NPE這樣的運行時異常是開發人員錯誤(錯誤!),而不是生產錯誤,並且它們應儘快修復。我個人只使用一個全球性的HTTP 500錯誤頁面,對於這種錯誤的:

<error-page> 
    <status-code>500<status-code> 
    <location>/errors/generic.jsp</location> 
</error-page> 

對於更具體的,實際的生產異常,你總是可以宣佈一個更具體的錯誤頁面:

<error-page> 
    <exception-type>com.example.YourDatabaseAccessException</exception-type> 
    <location>/errors/database.jsp</location> 
</error-page> 
<error-page> 
    <exception-type>javax.faces.application.ViewExpiredException</exception-type> 
    <location>/errors/sessionexpired.jsp</location> 
</error-page> 
+0

感謝您的詳細explain.one更多的問題:)我有一個名爲'Logout.jsp'的頁面,我成功註銷後顯示。我可以放置在旁邊的過濾器? – Sreeram

+0

要麼只是把它放在一個與'Filter'的''不匹配的地方,或者(如果你的'Filter'有一個過熱的'/ *'模式),那麼在這個地方添加一個額外的'if'檢查'doFilter()'方法,只要請求URI是/ contextname/Logout.jsp,就會導致只調用'chain.doFilter(request,response)'。 – BalusC

+0

我的Url模式是'/faces/*'.and在'faces-config.xml'中。我有'/Logout.jsp'.但Logout.jsp的URL變爲'http:// localhost:8080/myappname/faces/Logout.jsp'。我可以在哪裏放這個'Logout.jsp'來避免這個'faces'在url.now我擁有它在'WebContent'下。 – Sreeram

0

如果您在web.xml中定義了一個過濾器並將其刪除,則除非您定義了過濾器映射,否則所有請求都將通過該過濾器。

我想你可以定義在web.xml的過濾器映射如下:

<filter> 
<filter-name>URLFilter</filter-name> 
<filter-class>the filter class in your source code</filter-class> 
</filter> 
<filter-mapping> 
<filter-name>URLFilter</filter-name> 
<url-pattern>/some pages</url-pattern>//skip error.jsp here 
</filter-mapping> 

這不是測試,但只是一個靈感。 編輯:你可以找到更多從Oracle site

0

對我來說,這聽起來不像面孔過濾器與這個問題有任何關係。你能達到http://localhost:8080/myappname/Error.jsp與完全禁用的過濾器?如果沒有,那麼Error.jsp文件本身可能存在一些問題?

很難說沒有看到代碼本身。

+0

@ jsight-謝謝你的回覆。當你在'web.xml'中看到上面的錯誤頁面聲明時,我給了'/Error.jsp'.but'http:// localhost:8080/myappname/faces'被附加在前面和url變成'http:// localhost:8080/myappname/faces/Error.jsp'.I正在尋找一種方法來避免上面的url中的面,以便這個請求不會通過過濾器。 – Sreeram