如何发送表单输入值并调用 JSF bean 中的方法

Posted

技术标签:

【中文标题】如何发送表单输入值并调用 JSF bean 中的方法【英文标题】:How to send form input values and invoke a method in JSF bean 【发布时间】:2011-04-10 12:22:15 【问题描述】:

我正在构建一个 JSF 应用程序。我定义了 GUI,并使用 select 语句查询数据库。

现在我必须执行插入语句,但我不知道如何读取像 <h:inputText> 这样的 JSF 输入组件的 value 并将其发送到执行插入操作的 bean。

是否应该通过faces-config.xml 映射<h:inputText> 值,以便我可以在我的Java 代码中使用它?

【问题讨论】:

【参考方案1】:

您需要将所有<h:inputXxx>/<h:selectXxx> 组件放在<h:form> 中,并通过像#bean.property 这样的EL 表达式将它们的value 属性绑定到bean 属性,由getter/setter 对支持。正确设置后,当表单通过<h:commandXxx> 组件以相同的表单提交时,JSF 将自动设置 bean 中的值。您可以通过#bean.action 之类的EL 表达式在<h:commandXxx> 组件的action 属性中指定一个bean 操作方法,它指向裸方法action()。所有提交的值都可以通过通常的 Java 方式立即获得。

给定这个带有一个输入字段和一个选择字段的 JSF 表单示例:

<h:form>
    <h:inputText value="#bean.text" required="true" />
    <h:selectOneMenu value="#bean.choice" required="true">
        <f:selectItem itemValue="#null" />
        <f:selectItem itemValue="One" />
        <f:selectItem itemValue="Two" />
        <f:selectItem itemValue="Three" />
    </h:selectOneMenu>
    <h:commandButton value="submit" action="#bean.submit" />
    <h:messages />
    <h:outputText value="#bean.result" />
</h:form>

以下 bean 将提交的值打印到标准输出,证明 JSF 早在您在 action 方法中访问它之前就已经设置了值。

package com.example;

import javax.inject.Named;
import javax.enterprice.context.RequestScoped;

@Named // Use @javax.faces.bean.ManagedBean on outdated environments.
@RequestScoped // Use @javax.faces.bean.RequestScoped on outdated environments.
public class Bean 

    private String text;
    private String choice;
    private String result;

    public void submit() 
        result = "Submitted values: " + text + ", " + choice;
        System.out.println(result);
    

    public String getText() 
        return text;
    

    public void setText(String text) 
        this.text = text;
    

    public String getChoice() 
        return choice;
    

    public void setChoice(String choice) 
        this.choice = choice;
    

    public String getResult() 
        return result;
    

就是这样。将常规表单转换为 ajax 表单只需在命令组件中嵌套 &lt;f:ajax&gt;,如下所示。

<h:commandButton value="submit" action="#bean.submit">
    <f:ajax execute="@form" render="@form" />
</h:commandButton>

您可以在our JSF wiki page 底部找到另一个示例和有价值的链接。

请注意,无论您打算对提交的值做什么,都超出了 JSF 的责任范围。例如,操作它,传递给另一个类,将它保存在数据库中等等。这些都与 JSF 无关。作为一个基于 html 表单的框架,它已经完成了为您提供可用 Java 变量风格的提交值的工作。其余的由您决定。

要研究下一步,此时您应该做的只是好像您已经准备了一堆准备好的/硬编码的变量,而不是整个基于 JSF 的用户界面。例如,为了保存到数据库中的值,人们通常使用像 EJB 这样的业务服务层框架,而后者又使用像 JPA 这样的持久层框架。有些人甚至为此使用“plain vanilla” JDBC。有关具体示例的更多链接,请从此处开始:JSF Controller, Service and DAO。

【讨论】:

如果我们假设有一个实体类具有文本和数字 getter/setter,如何使用该实体而不是再次定义 getter/setter? @hallaji 继续答案中的最后一个链接。

以上是关于如何发送表单输入值并调用 JSF bean 中的方法的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring Security 3.1.3 和 JSF 创建一个 Bean 来验证我的登录表单

java jsf 如何去重新加载bean

当通过链接或后退按钮打开时,强制 JSF 刷新页面/视图/表单

如何捕获表单值并通过电子邮件作为 ajax 请求发送?导轨

使用JavaScript / Ajax排除表单字段提交到支持bean

如何从非人脸请求中调用 JSF 支持 bean 方法?