我正在尝试从一本书中学习Java,并且我已经完成了最后一章,这让我有点厌倦了。它显示了一个包含值表达式的JSF文件:
#{timeBean.time}
它还显示了TimeBean.java文件,该文件包含getTime()
方法,该方法又包含变量time
。该变量不会出现在该方法之外。该书说#{timeBean.time}
调用getTime()
,但我不明白如何,因此我无法将其扩展到其他应用程序。
可能的澄清问题是,我不明白.time
#{timeBean.time}
部分的来源
答案 0 :(得分:2)
JSF创建名为托管bean的bean实例,您可以使用#{}
包装的表达式从您的页面调用它们,也称为EL expressions。 #{timeBean.time}
实际上是从getTime()
实例调用timeBean
getter。默认情况下,Bean实例引用类名为simple name的第一个字符。
所以有这个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>
答案 1 :(得分:0)
您正在寻找的概念称为“Java Bean”。
在Java中,Java Bean使用特定的命名约定来实现getter(也称为访问器)和setter(也称为mutators)。
我更容易证明描述命名约定。
boolean xxxBlammo;
Boolean hoot; // Note that this is not a boolean (primative).
String smashy; // the key is that this is not a boolean.
// convention: starts with is, first letter of property is capatalized.
public boolean isXxxBlammo()
{
return xxxBlammo;
}
// Note that the return type is not the primative boolean.
// convention: starts with get, first letter of prooperty is capatalized.
public Boolean getHoot()
{
return hoot;
}
// The naming convention is the same for getSmashy as it is for getHoot.
// convention: starts with get, first letter of prooperty is capatalized.
public String getSmashy()
{
return smashy;
}
// starts with set, first letter of property is capatalized.
public void setXxxBlammo(final boolean newValue)
{
xxxBlammo = newValue;
}
// same naming convention for all setters.
public void setHoot(final Boolean newValue) ...
public void setSmashy(final String newValue) ...
EL表达式#{beany.smashy}引用了“beany”Java Bean的“smashy”属性,这意味着它转换为对getSmashy()getter的调用。
在您的情况下,#{timeBean.time}引用“timeBean”Java Bean的“time”属性,这意味着它转换为对getTime()getter的调用。