【问题标题】:Invoke a managed bean method before render-response phase在渲染响应阶段之前调用托管 bean 方法
【发布时间】:2026-01-06 06:30:02
【问题描述】:

我使用的 JSF 版本是 1.2_09。 RichFaces API 是 3.3.2.SR1。

我正在使用<rich:dataTable> 组件将列表呈现到表格中。让我有一个初始化 mange-bean 属性的 manage-bean 方法。当调用get(int) List 方法来呈现数据时,将调用该方法。比如方法:

String orderedProperty;
// Something else
protected String parseOrderGetParameter(HttpServletRequest request)
    {
        String orderedProperty = "";
        Map<String, String[]> params = (Map<String, String[]>) request.getParameterMap();
        String[] value = params.get("fsp");

        if(value == null){
            return orderedProperty;
        }

        for(String s : params.get("fsp")){
            orderedProperty = orderedProperty.concat(s); 
        }

        String[] parts = orderedProperty.split(":");
        orderedProperty = parts[2];
        orderedProperty = orderedProperty.replaceFirst("j_id", "");
        orderedProperty = getHeaderNameById(Integer.valueOf(orderedProperty));
        return orderedProperty;
    }

有没有办法在渲染响应阶段之前调用 maange bean 方法?

【问题讨论】:

  • 最佳答案取决于 JSF 版本。但是,您的问题中缺少此信息。请始终在每个问题中提及库 impl/version。
  • @BalusC 我已经添加了 JSF 版本。

标签: jsf


【解决方案1】:

对于 JSF 1.2,最好的选择是 &lt;f:view beforePhase&gt; 钩子。

<f:view beforePhase="#{bean.beforePhase}">
    ...
</f:view>
public void beforePhase(PhaseEvent event) {
    if (event.getPhaseId() == PhaseId.RENDER_RESPONSE) {
        // Do here your job which should run right before the RENDER_RESPONSE.
    }
}

如果您使用 JSF 2.0/2.1,请使用 &lt;f:event type="preRenderView"&gt;,或者如果您使用 JSF 2.2,请使用 &lt;f:viewAction&gt;

【讨论】:

  • 进一步澄清。我可以在beforePhase 方法体中获取实际的HttpServletRequest 对象吗?
  • 直接从FacesContext获取请求参数即可:FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap()。在 JSF 后备 bean 类中导入 javax.servlet.* 是一个危险信号,所以无论何时你偶然发现这一点,请先查看 FacesContextExternalContext
  • 我的意思是,如果我以通常的方式从FacesContext 获取请求,是否会得到传递给服务器的实际RequestParameter Map
  • 我理解你。谢谢。
  • 必须在 中声明 dataTable 吗?
最近更新 更多