JSF不执行bean

时间:2014-02-01 14:04:17

标签: jsf

我试图学习JSF,但是我失去了一些东西,因为这个按钮没有在eclipse控制台中显示消息

JAVA BEAN:

package beans;

public class protocoloBean {


    public void incluirProtocolo() {
        System.out.println("MSG");
    }

}

xhtml:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui">
<h:head>

</h:head>

<h:body>
    <h:button value="Protocolar"
        action="#{protocoloBean.incluirProtocolo()}"></h:button>
</h:body>
</html>

和faces-config:

<?xml version="1.0" encoding="UTF-8"?>
<faces-config version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd">
 <managed-bean>
  <managed-bean-name>protocoloBean</managed-bean-name>
  <managed-bean-class>beans.protocoloBean</managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>
 </managed-bean>
 <application/>
</faces-config>
我做错了什么?或者我输了:(

2 个答案:

答案 0 :(得分:1)

您的JSF代码错误。您需要/想要使用<h:button>时尝试使用<h:commandButton>触发操作。 <h:button>仅用于导航目的。请参阅此处了解它们之间的区别:Difference between h:button and h:commandButton

您应该将代码更新为:

<h:body>
    <ui:remove>
        <h:button value="Protocolar"
            action="#{protocoloBean.incluirProtocolo()}"></h:button>
    </ui:remove>
    <!--
        Note that h:commandButton MUST ALWAYS be inside a h:form
        Otherwise, the action won't fire
     -->
    <h:form>
        <h:commandButton value="Protocolar"
            action="#{protocoloBean.incluirProtocolo}" />
    </h:form>
</h:body>

更新代码后,将按预期打印日志消息。


由于您正在学习JSF 2.2,我建议开始使用JSF 2功能,例如几乎不使用faces-config.xml文件来管理bean定义。你可以改进你的代码:

@ManagedBean
@SessionScoped
public class ProtocoloBean {

    public void incluirProtocolo() {
        System.out.println("MSG");
    }
}

你的faces-config.xml文件*:

<?xml version="1.0" encoding="UTF-8"?>
<faces-config version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd">
</faces-config>

*是的,它是空的:)。

由于您是JSF新手,我建议您开始将您的bean声明为@RequestScoped@ViewScoped而不是@SessionScoped。您可以在此处阅读有关此内容的更多信息:How to choose the right bean scope?

答案 1 :(得分:0)

代码中的两个错误:

  1. 您的班级名称的第一个字符应为Captialized。你应该使用&#34; ProtocoloBean&#34;而不是&#34; protocoloBean&#34;

  2. Action属性用于重定向页面,方法类型必须是String而不是void。如果你只想执行一些代码,那么你应该使用&#34; actionListener&#34;而不是&#34; action&#34;,在这种情况下,您的方法返回类型可以为void,但请确保(ActionEvent操作)被定义为您的方法输入参数