【问题标题】:JSF dynamic loading almost working - but no commandButtonsJSF 动态加载几乎可以工作 - 但没有命令按钮
【发布时间】:2011-07-16 12:32:06
【问题描述】:

我想在运行时动态包含 .xhtml 文件,您可能会这样称呼它 JSF 前端到实体级别的继承层次结构。我预计 总共有 100 x 30-50 行的 xhtml 文件,这些文件只会被加载 如果需要正确处理基础数据。一个典型的用例是 需要一两个 xhtml 文件来处理基础数据, 所以你可以想象我不想每次都加载完整的 100,它会 这样做是愚蠢的犯罪行为。

现在我知道关于这个话题有无休止的讨论,但是 经过无数小时的研究,我一无所获。我在用 莫哈拉 2.1.1.

在下面的示例中,我最初是 ui:include 一个“空”文件,一个带有 最少的内容(而不是 c:catch),然后单击一个命令按钮 将要包含的内容更改为 new.xhtml 并更新容器 ui:include with ajax。

new.xhtml 的内容显示在页面上,所以看起来不错。这 问题是我在 new.xhtml 中有一个 commandButton,当这个文件 动态包含 commandButton 将不起作用 - 操作例程 永远不会被调用。如果您使用 ui:include new.xhtml(而不是 #{bean.page}) 它工作正常。所以有几个问题:

  1. 还有其他人解决这个问题吗?
  2. 如果没有,还有其他方法吗?
  3. 为什么这么明显和有用的事情这么难做?

我今天玩了 jQuery load(),虽然我可以使用它来加载文件 有各种各样的问题。我要加载的文件将包含 PrimeFaces 对话框,当被 jQuery 加载时,对话框似乎瞬间闪现 消失之前在屏幕上,永远,进入深渊。其他人报告 没有任何 CSS 样式的组件。

谢谢。

编辑:我应该明确表示我希望进行动态加载而不是 只是导航到不同的页面是因为我只想使用 primefaces 对话框,根据底层的类型不同 数据。如果可能的话,这将是一种更简洁的方式。

index.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form>
            <h:commandButton value="push" action="#{bean.doit}">
                <f:ajax render="load"/>
            </h:commandButton>
            <br/>
            <h:panelGroup id="load">
                <ui:include src="#{bean.page}"/>
                <ui:remove>
                <ui:include src="new.xhtml"/>
                </ui:remove>
            </h:panelGroup>
        </h:form>
    </h:body>
</html>

新的.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:f="http://java.sun.com/jsf/core">
    <h:outputText value="new.xhtml"/>
    <br/>
    <h:commandButton value="inc" action="#{bean.inc}">
        <f:ajax/>
    </h:commandButton>
</html>

empty.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"/>

Bean.java

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

@ManagedBean
@RequestScoped
public class Bean {

    private String page = "/empty.xhtml";

    public String doit() {
        page = "/new.xhtml";
        return null;
    }
    // getters & setters removed
}

【问题讨论】:

    标签: jquery ajax jsf facelets


    【解决方案1】:

    问题原来是 ui:include 是由标签处理程序实现的 在恢复视图期间执行,而不是在调用期间重新执行 应用程序,因此当它修改组件树时,您的应用程序逻辑 不知道这些变化。仅在使用部分状态时才适用 保存。

    我将代码从 ui:include 标记处理程序复制到一个非常简单的自定义 组件,并且至少可以触发动作方法,但不可靠。

    解决方案是排除需要此动态 ui:include 功能的视图 从 web.xml 中的条目使用部分状态保存,如下所示:

    <context-param>
      <param-name>javax.faces.FULL_STATE_SAVING_VIEW_IDS</param-name>
      <param-value>/index.xhtml</param-value>
    </context-param>
    

    这已经在多个包含页面中使用多个命令按钮进行了测试 碎片并且似乎工作可靠(使用 ViewScoped JSF bean 测试)。我有 还动态包含了一个包含 primefaces 对话框的文件,这很有效 好的。我希望这对其他人有用,因为它占用了很大一部分 时间超出了我的日程安排,但至少现在可以正常工作,这很好。

    干杯。

    【讨论】:

      【解决方案2】:

      你可能会说 JSF 的想法是视图层内部有自己的 MVC 堆栈:视图层次结构的每个组件充当控制器(读取请求数据)、模型(存储其状态)和视图(呈现自身)。这就要求视图是稳定的:处理请求的视图必须与渲染表单的视图相同。在生命周期中间发生的视图树变化很难推理。

      在您的情况下,问题可能是(我没有检查)bean 是请求范围的,因此页面属性设置为“/new.xhtml”,而按钮显示,但是当按钮的操作时被发送回服务器,属性又是“/empty.xhtml”,所以按钮在重新创建的视图中不存在,所以它不识别动作,所以它不执行它。将 bean 的范围更改为 @ViewScoped 可能会有所帮助。

      至于“为什么这么明显和有用的事情这么难做?” - 在我看来,从这个问题来看,你做了一些主要的和有问题的架构设计,没有遵循任何既定的 JSF 实践,也没有学习你设计的库(你读过文档吗?还是只是例子?),将您的设计建立在您想象图书馆应该如何工作的基础上。我认为有些羞耻会比批评和要求更合适。

      【讨论】:

      • 在实际应用程序中,我在任何地方都使用视图范围,这没有什么区别。我对 jsf 生命周期了解很多,我经常调试 JSF 代码并针对 RI 提交 JIRA 问题,我是 primefaces 论坛的主要贡献者,我支持我的评论。网上到处都是有类似问题的人,表达我的沮丧是完全合理的。如果您不喜欢,请重新调到其他频道。
      • PrimeFaces 通过使用 jQuery .show() 和 .hide() 方法使对话框(不)可见,即设置 css display: none 或 block。当我使用 .load() 加载包含 primefaces 对话框的文件时,组件根本没有 css 属性,因此我将首先调查原因。
      猜你喜欢
      • 2013-06-07
      • 2015-07-08
      • 2014-05-20
      • 2017-03-27
      • 1970-01-01
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 2013-10-24
      相关资源
      最近更新 更多