我正在使用PrimeFace 4.0。有一个数据表列出了登录用户的一些文档。当用户单击一行数据表时,它将打开一个新页面并显示该文档的PDF内容。它适用于第一次点击,在第一次单击同一原始页面(列出文档)后,点击任何元素将打开一个新窗口,但它会导航到主页。
数据表看起来像这样:
<p:dataTable id="tableLicenseeDocuments" value="#{pc_LicenseeDocumentsBean.documentList}" var="document">
<p:column sortBy="documentName" headerText="#{bundle['header.name']}" >
<h:commandLink value="#{document.documentName}" action="#{documentsBean.viewFile(document)}" ajax="false" target="_blank"/>
</p:column>
</p:dataTable>
DocumentBean在会话范围内,动作viewFile如下所示:
public void viewFile(DocumentDto document) {
FacesContext faceContext = FacesContext.getCurrentInstance();
ExternalContext extContext = faceContext.getExternalContext();
PortletRequest portletRequest = (PortletRequest) extContext.getRequest();
PortletSession pSession = portletRequest.getPortletSession(true);
pSession.setAttribute("document", document , PortletSession.APPLICATION_SCOPE);
String baseUrl = extContext.getRequestContextPath();
String url = baseUrl + "/DisplayPDFServlet";
try {
String encodeURL = extContext.encodeRedirectURL(url, null);
extContext.redirect(encodeURL);
} catch (Exception e) {
// Handle the exception here ...
} finally {
faceContext.responseComplete();
}
页面包含用户点击侧边菜单加载的数据表,也是commandLink,返回bean加载数据,然后显示,显示页面的生命周期是:(请注意第5阶段后,那里是一个额外的阶段1 RESOTRE_VIEW,为什么这里有一个额外的RESOTRE_VIEW阶段,视图是否已经恢复?)
1.START PHASE RESTORE_VIEW(1)
2.END PHASE RESTORE_VIEW(1)
3.START PHASE APPLY_REQUEST_VALUES(2)
4.END阶段APPLY_REQUEST_VALUES(2)
5.START PHASE PROCESS_VALIDATIONS(3)
6.END阶段PROCESS_VALIDATIONS(3)
7.START PHASE UPDATE_MODEL_VALUES(4)
8.END PHASE UPDATE_MODEL_VALUES(4)
9.START PHASE INVOKE_APPLICATION(5)
10.END PHASE INVOKE_APPLICATION(5)
11.START PHASE RESTORE_VIEW(1)
12.END PHASE RESTORE_VIEW(1)
13.START PHASE RENDER_RESPONSE(6)
14.END PHASE RENDER_RESPONSE(6)
当用户第一次点击数据表的行,打开一个新窗口并显示内容时,生命周期如下:
1.START PHASE RESTORE_VIEW(1)
2.END PHASE RESTORE_VIEW(1)
3.START PHASE APPLY_REQUEST_VALUES(2)
4.END阶段APPLY_REQUEST_VALUES(2)
5.START PHASE PROCESS_VALIDATIONS(3)
6.END阶段PROCESS_VALIDATIONS(3)
7.START PHASE UPDATE_MODEL_VALUES(4)
8.END PHASE UPDATE_MODEL_VALUES(4)
9.START PHASE INVOKE_APPLICATION(5)
10.END PHASE INVOKE_APPLICATION(5)
在同一页面上有数据表,当用户第二次点击该行时,它实际上转到主页:
1.START PHASE RESTORE_VIEW(1)
2.END PHASE RESTORE_VIEW(1)
3.START PHASE RENDER_RESPONSE(6)
4.END阶段RENDER_RESPONSE(6)
它实际上是一个Portlet,但我认为这个问题与JSF有关。我几天都在为此奋斗,任何建议都会非常感激!