如何发送表单输入值并调用 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 表单只需在命令组件中嵌套 <f:ajax>
,如下所示。
<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 来验证我的登录表单
当通过链接或后退按钮打开时,强制 JSF 刷新页面/视图/表单