JSF 创建称为托管 bean 的 bean 实例,您可以使用#{}
包装的表达式(也称为EL 表达式)从页面调用这些实例。#{timeBean.time}
实际上是从实例调用getTime()
getter 。timeBean
默认情况下,使用类简单名称引用 Bean 实例,并且它们的第一个字符小写。
所以有这个bean:
@ManagedBean
@RequestScoped
public class TimeBean{
public Date getTime(){
return new Date();
}
}
通过@ManagedBean
注解我们告诉 JSF 它需要由它来管理。由于@RequestScoped
我们表达了 bean 的范围,实际上 JSF 会为每个浏览器请求创建一个 bean 实例,并且getTime()
每次您在页面中指定它时都会调用 getter 方法。
对于表单字段,您必须指定一个同时具有 getter 和 setter 方法的变量。这是因为 JSF 将在处理表单时设置该值。
@ManagedBean
@RequestScoped
public class TimeFormBean{
//Initializes time with current time when bean is constructed
private Date time = new Date();
public Date getTime(){
//No logic here, just return the field
return time;
}
public void setTime(Date d){
time=d;
}
public void processTime(){
System.out.println("Time processed: " + time);
}
}
然后您可以通过这种方式在表单输入中使用它:
<h:form>
<h:inputText value="#{timeFormBean.time}">
<f:convertDateTime pattern="yyyy-MM-dd"/>
</h:inputText>
<h:commandButton value="process" action="#{timeFormBean.processTime}" />
</h:form>