访问 JSF Managed Bean 中的动态 UIComponent

2023-12-26

我有一个 JSF 页面,我在其中迭代一个列表<h:dataTable>显示一些包含复选框、一些文本和一个文本框的行。

我必须验证<h:dataTable>这样当用户选中该复选框时,他必须在文本框中输入一些文本。

这是我的 JSF 页面。

 <h:form prependId="false" id="form">
    <h:dataTable id="rm" width="100%" cellspacing="4"
    value="#{controller.alertTriggers}" var="alt"
        columnClasses="c1,c2,c3,c4">                    


            <h:column>
              <h:selectBooleanCheckbox value="#{alt.checkValue}" id="checkbox"/>
           </h:column>
            <h:column>
               <h:outputText value="#{alt.id}" />                                       
            </h:column>
            <h:column>
              <h:outputFormat value="#{alt.msg1}" />                              
            </h:column>
            <h:column>                                              
                 <h:message for="emailID" id="email" styleClass="validation-error"/>
                 <h:inputText value="#{alt.mailId}" id="emailID" style="width: 87%;" />

            </h:column>                                         

    </h:dataTable>                                          
</h:form>                                       

我已将所有复选框的 id 指定为checkbox所有文本框的 id 为emailID。当页面呈现时,在检查页面源代码时,我发现复选框的 id 是“rm:0:checkbox”、“rm:1:checkbox”...而文本框的 id 是“rm:0:” emailID','rm:1:emailID'..

在控制器中,我想访问这些动态文本框和复选框,我使用以下代码:

 FacesContext context = FacesContext. getCurrentInstance();


                  for (int i=0;i<9;i++){
                       UIInput u=(UIInput) FacesContext.getCurrentInstance().getViewRoot().findComponent( "form:rm:" +i+":checkbox" );
                        if ((Boolean) u.getValue()){
                              UIInput ui=(UIInput) FacesContext.getCurrentInstance().getViewRoot().findComponent( "form:rm:" +i+":emailID" );

                               //code

                       }
                 }

但这给出了 java.lang.NullPointerException

即使使用代码:

  UIInput u=(UIInput) FacesContext.getCurrentInstance().getViewRoot().
   findComponent( "form:rm:0:checkbox" ); gives the same exception.

但如果我使用

     UIInput u=(UIInput) FacesContext.getCurrentInstance().getViewRoot().
       findComponent( "form:rm:checkbox" );

它没有给出空指针异常,但我不知道它是否给出了哪个复选框的值。

所以,总而言之,

JSF 生成的 id 为 rm:1:checkbox、rm:2:checkbox 等,但是当我尝试在 JSF 页面中访问此 UI 组件时,我无法执行此操作。

我错过了什么吗?


The FacesContext#getViewRoot()返回 JSF 组件树。在考虑所有因素后,这与 XHTML 源代码所表示的树完全相同标记处理程序 https://stackoverflow.com/questions/3342984/jstl-in-jsf2-facelets-makes-sense (JSTL, <ui:include>, ETC)。你需要意识到有only one <h:selectBooleanCheckbox id="checkbox">在那里。它可用于UIViewRoot#findComponent()正是通过该 ID"form:rm:checkbox".

这只是它的 HTML 表示形式,根据父级的当前迭代轮次重新生成多次<h:dataTable>。生成的 HTML 表示又具有内联当前行索引的客户端 ID。这种 HTML 表示形式显然在组件树中不可用。

组件的状态(提交的值等)也仅可用during迭代<h:dataTable>而不是之前或之后。本质上,您试图在 bean 的操作方法中访问组件的值,而<h:dataTable>组件不会迭代它,因此值将始终返回null.

为了以编程方式模拟<h:dataTable>迭代以便您可以收集所需的值,您需要访问<h:dataTable> by UIComponent#visitTree() http://docs.oracle.com/javaee/6/api/javax/faces/component/UIComponent.html#visitTree%28javax.faces.component.visit.VisitContext,%20javax.faces.component.visit.VisitCallback%29并收集感兴趣的信息VisitCallback执行。

UIData table = (UIData) viewRoot.findComponent("form:rm");
table.visitTree(VisitContext.createVisitContext(FacesContext.getCurrentInstance()), new VisitCallback() {
    @Override
    public VisitResult visit(VisitContext context, UIComponent target) {
        if (target instanceof HtmlSelectBooleanCheckbox) {
            HtmlSelectBooleanCheckbox checkbox = (HtmlSelectBooleanCheckbox) target;
            System.out.println("id: " + checkbox.getId());
            System.out.println("value: " + checkbox.getValue());
            // Collect them in an arraylist orso.
        }

        return VisitResult.ACCEPT;
    }
});

However,您在解决具体问题方面完全走错了方向。您应该在与您想要验证的输入组件关联的验证器中执行验证,而不是在操作方法中。以下是如何解决验证输入字段的特定具体功能要求required仅当同一行中的复选框被选中时:

<h:column>
    <h:selectBooleanCheckbox binding="#{checkbox}" ... />
</h:column>
<h:column>                                              
    <h:inputText ... required="#{checkbox.value}" />
</h:column>

就这样。额外的优点是,验证器运行while the <h:dataTable>正在迭代,所以你不需要所有这些visitTree()代码也是如此。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

访问 JSF Managed Bean 中的动态 UIComponent 的相关文章

  • ASP.NET MVC 的验证选项有哪些

    net mvc 的验证选项有哪些 他们中的任何一个都有像 Webforms 那样的很好的验证摘要吗 您可以使用 MVC html 验证摘要 请参阅此博客 http blog maartenballiauw be post 2008 08 2
  • Codeigniter 使用表单验证函数“匹配”子数组 POST

    上周刚开始使用 CI 并遇到了这个问题 里面要放什么matches如果我将表单数据作为数组传递 函数会怎样 我使用 html 表单中的数组来定位单个数组内的所有输入字段 以防我想传递用户生成的输入 例如多个电话号码或电子邮件 所以所有东西都
  • 将带有 HTML 代码的字符串注入并解释到 JSF 页面的组件

    我使用 PrimeFaces 和 JSF 2 0 来构建一个应用程序 我正在使用 PrimeFaces
  • 如何禁用单个视图的客户端验证?

    我需要在单个视图上禁用表单的客户端验证 我该怎么做呢 我不想只禁用以下 JS 文件 Scripts jquery jquery validate min js type text javascript gt Scripts jquery j
  • 使用 Java 根据本地 DTD 文件验证 XML 文件

    如何根据本地存储为文件的 DTD 验证 XML 文件 XML 文件没有任何 DOCTYPE 声明 或者可能有一个应该被覆盖的声明 我看了一下这个线程 https stackoverflow com questions 470313 net
  • 参数验证最佳实践

    想象一下你有一个应用程序是某种前端您所有的业务逻辑 该前端有很多依赖的 DLL 并且这些 DLL 中的方法可能会在前端执行一次给定方法时重复相互调用 如果您的应用程序的用户不直接访问这些 DLL 您是否应该 1 冒着 小 性能下降的风险并验
  • h:message 为空时的默认输出

    我正在寻找一种在 JSF 中实现以下切换的方法 div if empty div
  • Groovy:验证 JSON 字符串

    我需要检查 Groovy 中的字符串是否为有效的 JSON 我的第一个想法就是把它发送出去new JsonSlurper parseText myString 并且 如果没有例外 就假设它是正确的 然而 我发现 Groovy 很乐意接受尾随
  • 你把你的验证放在 asp.net mvc 3 的哪里?

    ASP NET MVC 中一种常见的推荐做法是您不应该将您的商业模式发送到您的视图中 http lostechies com jimmybogard 2009 06 30 how we do mvc view models 相反 您应该创建
  • Rails 验证日期范围的唯一性

    我有一个涉及员工缺勤记录的应用程序 我需要确保每条记录的开始日期和结束日期不重叠 例如 如果我输入了从今天开始到明天结束的缺勤记录 则不可能以任何方式在该日期范围内输入另一个缺勤记录 所以我不能制作一个从前天开始 然后在后天或任何更晚的日期
  • “通用”电话号码的基本正则表达式

    我需要一个正则表达式 用于 ASP NET 网站 来验证电话号码 它应该是灵活的 唯一的限制是 应至少为 9 位数字 没有字母 可以包含空格 连字符 单个 我搜索过 SO 和 Regexlib com 但我得到的表达式有更多限制 例如英国电
  • Maven安装错误找不到javax.el.E​​LContext和找不到javax.el.E​​LResolver

    我正在使用 Maven 3 和 JDK 1 7 当我尝试做的时候mvn install 我收到以下错误 ERROR domain view EmployeeNameConverter java 29 76 cannot access jav
  • WinForms 验证事件阻止 Escape 键关闭表单

    我有一个简单的表单 带有一个文本框 加上 确定 和 取消 按钮 表单的 AcceptButton 和 CancelButton 设置正确 并且 确定 和 取消 按钮的 DialogResult 设置为 确定 和 取消 我想向 TextBox
  • 如何使用自定义 ValidationAttribute 来确保两个属性匹配?

    我们使用 xVal 和标准DataAnnotationsValidationRunner描述here http blog stevensanderson com 2009 01 10 xval a validation framework
  • 如何验证magento中的单选按钮?

    在我的自定义模块中 我有一个带有单选按钮的表单 当我单击提交按钮时 它不会验证单选按钮 如何使用 Magento 默认验证类进行验证 Thanks 我得到了答案 use validate one required by name在单选按钮的
  • 如何正确清理来自 AngularJS 控制器的无效输入的表单?

    我有一个 AngularJS 表单 其中包含 除其他字段之外 类型之一url 后者很重要 因为这会强制相应的输入成为有效的 URL 在某些条件下 例如 要关闭具有此类表单的模式对话框 我想以编程方式清除该表单 为此 我实现了方法reset基
  • Angular 模板验证表单

    我正在研究表单验证 我正在使用模板驱动的验证表单 其编码如下 现在工作正常 但是当我尝试添加时 username ngModel and password ngModel 在创建验证类的输入中 它向我显示一个错误 也请找到该错误 div c
  • 确定 C 字符串是否是 C 中的有效 int

    我需要检查 C 字符串是否是有效整数 我都尝试过 int num atoi str and int res sscanf str d num 但发送字符串 8 9 10 这两行都仅返回 8 而没有指示该字符串的无效性 谁能提出替代方案 看看
  • jQuery 验证日期范围问题

    我的代码中有很多地方有成对的相关开始和结束日期字段 范围 我需要验证开始日期早于结束日期 我正在使用 jQuery 验证插件 这是我的代码 http jsfiddle net jinglesthula dESz2 http jsfiddle
  • 设置 runat=server 时输入名称和 id 发生变化

    在我的表单中 我需要插入 文本 类型的不同输入 输入必须是带有名称和 ID 的 html 控件 因为我将此表单发送到外部网址 对于验证 我在所有输入中执行 runat server 然后我可以使用 requiredfieldvalidato

随机推荐