如何在JSF 2.0中使命令按钮在表单外起作用

3

我是JSF编程的初学者,所以我有一个简单的问题。

我有以下JSF文件:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="en" xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets">

<h:head>
    <title>Insert Title Here</title>
</h:head>

<body>
    <h:form>
        <h:panelGrid columns="3">

            /* Here I take the username */

            <h:outputLabel for="username">Username</h:outputLabel>
            <h:inputText id="username" value="#{register.user.username}"  
                required="true" requiredMessage="Enter username">
                <f:ajax event="blur" render="usernameMessage" />
            </h:inputText>
            <h:message id="usernameMessage" for="username" />

            /* Here I take the password */

            <h:outputLabel for="password">Password</h:outputLabel>
            <h:inputSecret id="password" value="#{register.user.password}"
                required="true" redisplay="true" requiredMessage="Enter password">
                <f:ajax event="blur" render="passwordMessage" />
            </h:inputSecret>
            <h:message id="passwordMessage" for="password" />

            /* Here I take the email */

            <h:outputLabel for="email">Email</h:outputLabel>
            <h:inputText id="email" value="#{register.user.email}"
                required="true" requiredMessage="Enter email">
                <f:ajax event="blur" render="emailMessage" />
            </h:inputText>
            <h:message id="emailMessage" for="email" />

            /* And these are my 3 command buttons, and they are working only when the username, password and email are filled in. */

            <h:panelGroup>
                <h:commandButton value="Register" action="#{register.submit}">
                    <f:ajax execute="@form" render="@form" />
                </h:commandButton>
                <h:commandButton value="setDB" action="#{register.setDB}">
                    <f:ajax execute="@form" render="@form" />
                </h:commandButton>
                <h:commandButton value="getDB" action="#{register.getDB}">
                    <f:ajax execute="@form" render="@form" />
                </h:commandButton>
                <h:commandButton value="reset" action="#{register.reset}">
                    <f:ajax execute="@form" render="@form" />
                </h:commandButton>
            </h:panelGroup>

            <h:messages globalOnly="true" layout="table" />
        </h:panelGrid>
    </h:form>

    /* And this is the button that I want to work without the need to fill in the username, password and email */

    <h:panelGroup rendered="#{register.user.ini!=true}">
        <h3>Result</h3>
        <h:commandButton value="getDB" action="#{register.getDB}" />
    </h:panelGroup>

</body>
</html>

所以我的问题是如何使下面的命令按钮起作用:
<h:panelGroup rendered="#{register.user.ini!=true}">
    <h3>Result</h3>
    <h:commandButton value="getDB" action="#{register.getDB}" />
</h:panelGroup>

应用程序启动时它没有出现。我只想获取数据库信息而无需填写字段:) …其他按钮在表单中,只有当字段的用户名、密码和电子邮件有内容时才会起作用。这段代码既不生成异常也不出错,但是按钮不起作用(在表单之外的那个按钮)。


h:commandLink 就可以了。 - Joop Eggen
1个回答

3
您必须在 h:form 的内部才能使用 h:commandButton
我不确定您想要实现什么,但可以参考这个PreRenderViewEvent
此外,如果您想在bean创建时运行一些逻辑,则可以在bean中使用@PostConstruct
@PostConstruct
public void init() {
    retrieveDB();
}

此外,给 bean 动作方法添加 get/set 前缀是一个非常糟糕的做法,最好仅将其用于 getters/setters。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接