JSF值表达式和bean,它们如何工作?

时间:2013-09-06 19:54:04

标签: java jsf

我正在尝试从一本书中学习Java,并且我已经完成了最后一章,这让我有点厌倦了。它显示了一个包含值表达式的JSF文件:

#{timeBean.time}

它还显示了TimeBean.java文件,该文件包含getTime()方法,该方法又包含变量time。该变量不会出现在该方法之外。该书说#{timeBean.time}调用getTime(),但我不明白如何,因此我无法将其扩展到其他应用程序。

可能的澄清问题是,我不明白.time

#{timeBean.time}部分的来源

2 个答案:

答案 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的调用。