h:使用JSF 2在每次单击时都不会触发commandLink操作

时间:2011-07-09 09:48:12

标签: jsf jsf-2

我有一个 masterLasyout.xhtml

<h:form id="abc">
  <h1>
    <ui:insert id="abc1" name="title"></ui:insert>
  </h1>
  <p>
    <ui:insert id="abc2" name="body"></ui:insert>
  </p>
</h:form>

我有2个片段文件(它们在ui:composition内):

<p:inputText id="it1" value="#{exampleBean.name}" immediate="true" ></p:inputText>
<h:commandLink id="cl1" immediate="true"  value="Text1" action="#{exampleBean.ModifyLink2}" actionListener="exampleBean.Modify">
    <p:ajax update=":abc:main"></p:ajax>
</h:commandLink>

第二档:

<p:inputText id="it2" value="#{exampleBean.name}" immediate="true"></p:inputText>
<h:commandLink id="cl2" immediate="true" value="Text2" action="#{exampleBean.ModifyLink}" actionListener="exampleBean.Modify"  >
    <f:param value="/snippets/snippet1.xhtml" id="link"></f:param>
    <p:ajax update=":abc:main"></p:ajax>
</h:commandLink>

我有托管bean:

现在,我希望在片段之间切换,并在以下托管bean中触发一个动作:

@ManagedBean (name="exampleBean")
@RequestScoped
public class ExampleBean {

    /** Creates a new instance of ExampleBean */
    public ExampleBean() {
        m_User = new User();
        SnippetFileName = "/snippets/snippet2.xhtml";
    }

    public void Modify(ActionEvent a){
        System.out.println("Modify");
        ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
        String t = externalContext.getRequestParameterMap().get("link");        
        System.out.println("SnippetFileName in ModifyLink is " + t);
    }

    public String ModifyLink()
    {        
        System.out.println("ModifyLink");
        SnippetFileName = "/snippets/snippet1.xhtml";
        return "page";
    }

    public String ModifyLink2()
    {
        System.out.println("ModifyLink2");
        SnippetFileName = "/snippets/snippet2.xhtml";
        return "page";
    }

    private String SnippetFileName;

    public String getSnippetFileName()
    {
        return SnippetFileName;
    }

    public void setSnippetFileName(String i_filename)
    {
        SnippetFileName = i_filename;
    }
    private User m_User;
    public String getName(){
        System.out.println("getName");
        if (m_User==null)
        {
            return null;
        }
        return m_User.getName();
    }

    public void setName(String i_Name){
        System.out.println("setName");
        String name = i_Name.trim();
        if (m_User!=null)
        {
            m_User.setName(name);
        }
    }
}

正在发生的是点击次数1,3,5,7 ... ModifyLink方法触发,点击次数2,4,6,8 ...`ModifyLink2'nonen'吨。我似乎无法理解为什么会发生这种行为。 我阅读了一些文章,包括commandButton/commandLink/ajax action/listener method not invoked or input value not updated,其中列出了7个问题,这些问题都不适用于口头案例,而http://vierwaende.org/articles/posts/jsf-2-evaluation-test.html则对JSF 2生命周期进行了非常好的概述。 我也试图删除Ajax,它仍然会这样做。

提前致谢。

1 个答案:

答案 0 :(得分:0)

问题得到解决。在web.xml中我定义了:

 <context-param>
     <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
     <param-value>false</param-value>
 </context-param>

我想知道是否有可能在JSF 2工作流页面控件中动态添加(以编程方式或使用xml文件),这些控件必须以动态方式添加。在上述问题的情况下,在页面的第一次请求期间创建的控制树中未定义其中一个控件。所以,在另一个注释中:是否有一个选项可以动态地向控件树添加控件而无需修改web.xml,以进行优化?