当前位置: 首页 > 知识库问答 >
问题:

为什么中的操作在复合组件中不起作用

轩辕弘雅
2023-03-14

我有一个非常简单的JSF 2/Facelets页面,如下所示:

<ui:repeat value="#{myBean.names}" var="_name">
  <h:commandLink value="#{_name}" action="#{myBean.sayHello(_name)}">
    <f:ajax execute="@this"/>
  </h:commandLink>
  <br/>
</ui:repeat>

支持bean提供了一个java。util。列表

这个很好用。我在浏览器中获得了一个名称列表,单击会触发对指定名称打招呼的操作方法。

当我想把这段代码放在一个复合组件中进行迭代并通过一个方面呈现实际链接时,问题就出现了:

<ui:component xmlns="http://www.w3.org/1999/xhtml"
              xmlns:f="http://xmlns.jcp.org/jsf/core"
              xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
              xmlns:cc="http://xmlns.jcp.org/jsf/composite">
  <cc:interface>
    <cc:attribute name="value" type="java.util.List" required="true" />
    <cc:facet name="content" />
  </cc:interface>
  <cc:implementation>
   <ui:repeat value="#{cc.attrs.value}" var="_name">
     <cc:renderFacet name="content"/>
   </ui:repeat>
  </cc:implementation>
</ui:component>

我使用的复合组件如下所示:

<my:myComp value="#{bean.names}">
  <f:facet name="content">
    <h:commandLink value="#{_name}" action="#{bean.sayHello(_name)}">
      <f:ajax execute="@this"/>
    </h:commandLink>
    <br/>
  </f:facet>
</my:myComp>

在浏览器中,我得到了一个与以前一模一样的名字列表。但是现在点击一个链接就会显示一条“hello null”消息。因此,\u name

我还尝试使用actionListener而不是action中的listener属性

在这个问题上,有人能遮掩一下吗?

我的环境:

  • WildFly 8.1 with
  • JSF 2.2.6(Mojarra)

共有1个答案

戚俊人
2023-03-14

这个问题与变量的作用域有关,在这种情况下_name,当

    <h:form>
        <my:myComp value="#{bean.names}">
            <f:facet name="content">
                <h:commandLink value="#{_name}" action="#{bean.sayHello()}">
                    <f:param name="name_" value="#{_name}"/>
                    <f:ajax execute="@this"/>
                </h:commandLink>
                <br/>
            </f:facet>
        </my:myComp>
    </h:form>

我还对@RequestScopedbean修改了sayHello()方法,如下所示:

@ManagedProperty(value = "#{facesContext}")
private FacesContext facesContext;

public void setFacesContext(FacesContext facesContext) {
    this.facesContext = facesContext;
}

public void sayHello() {
    Map<String, String> params = facesContext.getExternalContext()
                .getRequestParameterMap();
    String name = params.get("name_");
    System.out.println("Hello " + name);
}

您可以在@ViewScopedbean中将其更改为更短的内容,以:

 public void sayHello() {
    Map<String, String> params = FacesContext.getCurrentInstance()
            .getExternalContext().getRequestParameterMap();
    String name = params.get("name_");
    System.out.println("Hello " + name);
}

最终的结果是它正确地打印出名称。

 类似资料:
  • 问题内容: 我有几列使用flex给出相等的宽度。每个都包含标签,我希望这些图像显示尺寸。 如本演示中所示,图像没有调整大小。这是为什么? 问题答案: 从规格: 该属性指定如何将替换元素的内容装配到通过其使用的高度和宽度建立的框中。 关键术语是: 根据其使用的高度和宽度安装到盒子中 图像将被替换,而不是其容器。并且由其使用的高度和宽度确定的框与图像本身有关,而不与容器有关。 因此,报废容器并使图像本

  • 代码如下: 运行时,这是错误消息: 错误:不匹配'运算符*'(操作数类型是'std::__cxx11::字符串{aka std::__cxx11::basic_string 如何修复此错误并使程序正确运行?

  • 问题内容: 为什么这项工作有效- 但这不是- 第二种情况下的输出为。你能解释一下输出吗? 问题答案: 该方法没有返回值。它会在适当的位置更改列表,并且由于您没有将分配给任何变量,因此只是“迷失在空间” 我没有重载所有有问题的方法,但是概念应该很清楚。

  • 我试图在我的Word文档中使用块,但我有一些问题。首先,当我在我的文档中声明一个块时,如果我不使用函数“cloneBlock”,结果会出现这样的情况: 也许我必须使用那个函数才能正常出现。但是我的主要问题是“删除块”不起作用。如果我不克隆块,生成的docx就会损坏。但是如果我克隆了这个块,函数“删除块”不会删除这个块,它会在我的最终docx文件中显示那个块内的信息。 这是我的代码: Docx模板:

  • 问题内容: 我的Dockerfile创建一个目录,将其chown,然后再列出该目录。该目录仍归root用户所有。这是为什么? 这是Dockerfile: 这是“ docker build”的输出: Docker版本1.2.0,构建fa7b24f 主机运行Ubuntu 12.04,但具有3.13.0-36通用内核。 问题答案: 回答我自己的问题:它声明为卷。如果取出VOLUME指令,则将生效。 此外

  • 问题内容: 我想在控制台中打印一些内容,以便对其进行调试。但是由于某种原因,我的Android应用程序中没有任何内容。 那我该如何调试呢? 问题答案: 在仿真器上,大多数设备都重定向到LogCat并使用进行打印。在非常旧的或自定义的Android版本上可能并非如此。 原版的: 没有控制台将消息发送到,因此消息丢失。当你使用来运行“传统” Java应用程序时,也会以同样的方式发生这种情况。 相反,你