【问题标题】:Simple JSF Ajax Command Button rerender not working简单的 JSF Ajax 命令按钮重新渲染不起作用
【发布时间】:2013-06-30 23:51:52
【问题描述】:

我在实现对托管 Bean 的 Ajax 调用时遇到了很多问题。我准备了一个简单的测试用例 - 我希望 outputText 值更改为 Beta,但它仍为 Alpha。我做错了什么?

package com.example.controllers;

import javax.faces.bean.ViewScoped;
import javax.inject.Named;

@Named(value = "tester")
@ViewScoped
public class tester{

    private String testString;

    /**
     * Creates a new instance of tester
     */
    public tester() {
        testString = "Alpha";
    }

    public String changeText(){

        testString = "Beta";
        return null;
    }

    /**
     * @return the testString
     */
    public String getTestString() {
        return testString;
    }

    /**
     * @param testString the testString to set
     */
    public void setTestString(String testString) {
        this.testString = testString;
    }
}


<?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:p="http://primefaces.org/ui"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form>
            <h:commandButton value="Add Row" action="#{tester.changeText}">
                <f:ajax event="action" execute="@form" render="out"></f:ajax>
            </h:commandButton>
            <h:outputText id="out" value="#{tester.testString}"/>
        </h:form>
    </h:body>
</html>

【问题讨论】:

    标签: ajax jsf render commandbutton


    【解决方案1】:

    不要将 CDI 与托管 bean 混合使用。将import javax.faces.bean.ViewScoped 更改为import javax.faces.view.ViewScoped

    更新 从您的评论看来,您没有 JSF 2.2(我的错误)。您最容易做的事情是:

    替换

    import javax.inject.Named 
    

    import javax.faces.bean.ManagedBean;
    

    @Named(value = "tester")
    

    @ManagedBean(name = "tester")
    

    最后一件事,当您进行上述更改时,您不必为name 指定值。当您使用@ManagedBean 而不使用name 时,您可以使用类名在您的xhtml 页面中引用您的bean。请记住,第一个字母将小写。

    【讨论】:

    • Netbeans 似乎无法识别该导入,您确定它正确吗?
    • @tacua 是否有意义?如果需要,我可以扩展。
    • 我可以通过更改为托管 Bean 来解决问题,谢谢!我的老师说我应该使用 CDI,所以我需要了解两者之间的差异。
    • @tacua 真的很简单。 CDI 将忽略包 javax.faces.bean.* 中的所有注释它有自己的包,当涉及到范围时 import javax.enterprise.context.* CDI 还有更多功能(它们更强大),但现在应该足够了;)
    猜你喜欢
    • 2013-04-30
    • 2012-09-02
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多