gpt4 book ai didi

java - JSF - 如何从支持 bean 操作方法内部确定当前 JSP 页面

转载 作者:行者123 更新时间:2023-11-30 05:09:45 24 4
gpt4 key购买 nike

我有一个包含两个 JSP 页面的 JSF 应用程序,这两个页面都显示来自 session 范围容器对象的一些相同数据。每个页面显示的数据都不同,每个数据表中的数据在页面之间也有所不同。到目前为止一切正常。

我的问题是,我在如何确定从我的支持 bean 操作方法内部请求的页面方面有点作弊。在每个页面上,我都使用了数据表的绑定(bind)。

draftReport.jsp:

<t:dataTable 
border="1"
id="reportDraftDataTable"
binding="#{controller.reportDraftDataTable}"
value="#{sessionData.reportDraftAdapterList}"
var="currentRow"
rowClasses="dataTableOddRow, dataTableEvenRow">

report.jsp:

<t:dataTable 
border="1"
id="reportDataTable"
binding="#{controller.reportDataTable}"
value="#{sessionData.reportAdapterList}"
var="currentRow"
rowClasses="dataTableOddRow, dataTableEvenRow">

我有一个请求范围的支持 bean(名为 Controller),其中包含这些页面的一些操作方法。我不想在支持 bean 上重复代码(每个类似的 JSP 页面都有一个类似的方法),而是想弄清楚正在呈现哪个页面,并将其用作通用处理程序方法(可以处理两个页面的操作)的参数。支持 bean 。所以我作弊并这样做了:

public class Controller {
...

private HtmlDataTable preArrivalReportDataTable;
private HtmlDataTable preArrivalReportDraftDataTable;
private static enum ReportType {
NON_DRAFT,
DRAFT
}
...

private ReportType determineReportTypeFromControlBindings() {
Validate.isTrue(this.preArrivalReportDataTable != null ^
this.preArrivalReportDraftDataTable != null,
"Either preArrivalReportDataTable XOR " +
"preArrivalReportDraftDataTable must be null in " +
"determineReportTypeFromControlBindings()");
if (this.preArrivalReportDataTable != null) {
return ReportType.NON_DRAFT;
} else {
return ReportType.DRAFT;
}
}
...

public String actionOnReport() {
ReportType reportType = null;
reportType = determineReportTypeFromControlBindings();
handleReportAction(reportType);
return "REFRESH";
}
...
}

这在我的 Controller 类的操作方法中工作正常,但随后我需要添加另一个方法,最终破坏了我的黑客代码:

    public String getStyleClass() {
ReportType reportType = determineReportTypeFromControlBindings();
switch (reportType) {
case NON_DRAFT:
return "styleA";
case DRAFT:
return "styleB";
default:
return null;
}
}

在我的 JSP 中,JSF-EL 表达式位于数据表的控件绑定(bind)之上,我在支持 bean 中使用该数据表来确定我所在的页面。此时,defineReportTypeFromControlBindings() 在验证检查时抛出异常,可能是因为控件绑定(bind)尚未发生。

发生这种事我并不感到惊讶。总感觉方式不对。但我的问题是:

从请求范围的支持 bean 操作方法确定当前请求的 JSP 页面的正确方法是什么?

如果相关的话,我正在使用 MyFaces 1.2 Tomahawk 标签库。

最佳答案

我可以想到几种方法,一种是主动式的,其中页面告诉 bean View 是什么,一种是被动式的,其中 bean 推断 View 。最后一个是拥有一个抽象 bean,其中包含草稿和非草稿的具体实现。

我更喜欢最后一种方法,它感觉最像Java,而且最不hacky。但这里有一些关于如何实现前两个的基本想法。

主动:在 renderResponse 阶段调用方法来设置报告类型。我只在 session 范围的 bean 中完成了此操作,不确定它在请求范围内的工作效果如何,您可能需要检查其他阶段,或者可能只是应用它,而不管实际阶段如何。

Controller.java

public void draftInitializer(PhaseEvent event) {
if (event.getPhaseId().equals(PhaseId.RENDER_RESPONSE)) {
reportType = DRAFT;
}
}

draftReport.jsp

<f:view beforePhase="#{controller.draftInitializer}">

响应式:从请求中获取 URL。

Controller.java

  private String getRequestURL(){
HttpServletRequest request = (HttpServletRequest)FacesContext.getExternalContext().getRequest();
return request.getRequestURL();
}

private boolean isDraft() {
return getRequestURL().contains(DRAFT_URL_IDENTIFIER);
}

关于java - JSF - 如何从支持 bean 操作方法内部确定当前 JSP 页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3858191/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com