![](/img/trans.png)
[英]Gatein 3.4.0 final Jboss 5.1.0 portlets states and JSR186 interaction, Not able to show multiple portlets when going from one portlet to another
[英]Richfaces error page redirection with gatein, jboss 5.1.0 ga portlet bridge jars and my mistakes
我知道關於相同/相似的主題有很多相似的問題,但是我無法對我的問題應用任何解決方案。
我想在呈現Portlet頁面時捕獲到異常時將用戶重定向到自定義錯誤頁面。 為什么渲染頁面時拋出異常? 這是因為在后台我們將其扔給用戶一些有用的信息,以這種方式設計並且不會在短期內進行更改,因此我的目的是保持這種方式。
我相信,如果我舉個例子,那就更好了:這是我提供使用名稱並按“ >>”按鈕獲取有關該用戶的一些信息的簡單Portlet,在先前的實現中,它的工作原理很好,請參見第二張圖片。
第二張圖片:
如您所見,布局是正確的”(這是它的外觀),錯誤頁面只是用自己的內容替換了portlet內容,並顯示了為什么我們無法獲得有關用戶任何信息的錯誤消息。 到現在為止還挺好。
現在讓我們看一下問題案例:我們已經從jboss 4.2.3 ga升級到5.1.0 ga,現在GateIn開始發揮作用了。 還有一些舊的jar用於創建portlet的視圖,現在它們都已升級為較新的。 如:
(org.richfaces.framework) Richfaces-api 3.3.3-final,
(org.richfaces.framework) Richfaces-impl 3.3.3-final,
(org.richfaces.framework) Richfaces-ui 3.3.3-final,
(com.sun.faces) jsf-api 2.2.14,
(com.sun.faces) jsf-impl 2.2.14,
(javax-servlet) servlet-api 2.5,
(javax-servlet) jstl 1.2
Gatein version: 3.4
Gatein本身使用了與jsr168兼容的jars +我們有jsf 1.2版本(此版本中使用了標簽)。
問題案例:正如您所看到的那樣,我們想要獲取一些用戶信息的portlet被破壞並合並到域詳細的portlet中。 看起來像湯
產生這種混亂的代碼也屬於我們。 它曾經可以正常工作,但是現在卻以某種方式破壞了整個布局。
讓我向您展示渲染視圖的代碼:
public void renderView(FacesContext context, UIViewRoot viewToRender) throws java.io.IOException, javax.faces.FacesException{
try {
super.renderView(context, viewToRender);
}catch(FacesException e){
Application application = context.getApplication();
ViewHandler viewhandler = application.getViewHandler();
PortletRequest request = (PortletRequest)context.getExternalContext().getRequest();
PortletConfig config = (PortletConfig)request.getAttribute(PortletConstants.PORTLET_CONFIG);
String errorView = config.getInitParameter(PortletConstants.PORTLET_FACES_ERROR_VIEW);
if(errorView == null || errorView.matches("")){
errorView = ProvPortletViewHandler.DEFAULT_FACES_ERROR_VIEW;
}
Throwable cause = e.getCause();
FacesMessage fm= findProvisioningException(cause);
if(fm == null)
{
request.setAttribute("ErrorMessage", "Unknown Error occured");
}
else
{
request.setAttribute("ErrorMessage", fm.getSummary());
}
viewToRender = viewhandler.createView(context,errorView);
context.setViewRoot(viewToRender);
viewhandler.renderView(context, viewToRender);
PortletSession objSes = (PortletSession)context.getExternalContext().getSession(false);
objSes.invalidate();
}
}
在這段代碼中,您可以看到存在super.renderView(context, viewToRender);
它一直到達服務並進行服務調用。 服務調用返回此用戶在數據庫中沒有信息的異常。 並且此異常會在路上轉換為FacesException(我們正在這樣做)。
問題不是異常,也不是將其轉換為FacesException。
此部分出現問題
viewToRender = viewhandler.createView(context,errorView);
context.setViewRoot(viewToRender);
viewhandler.renderView(context, viewToRender);
據我們調試。 我們相信,由於異常而部分渲染的舊視圖無法替換為錯誤視圖。
但是,如果以前可以正常工作,那該怎么辦。 我們尚未更改代碼的這一部分。
這些信息足以引發有關該問題的想法嗎? 你們需要更多細節嗎? 您認為我們在這里做錯了什么?
感謝和問候
深入研究后,可以看到當請求到達時,此時將創建並填充其響應。 它已經具有HTML內容了。 當嘗試重定向新的jsp文件時,它將新的HTML元素添加到該響應中。 因此,響應中的HTML元素對於Gate-in變得晦澀難懂。 為了避免此問題,重置響應就足夠了。 可以完成重置響應緩沖區,在代碼上可以看到;
viewToRender = viewhandler.createView(context, errorView);
context.setViewRoot(viewToRender);
**((javax.portlet.RenderResponse) context.getExternalContext().getResponse()).resetBuffer();**
viewhandler.renderView(context, viewToRender);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.