如何在JSF中填充数据

时间:2011-10-11 08:06:15

标签: java jsp jsf ejb

到目前为止,我一直在使用JSP来显示页面。当用户请求诸如“添加项目”之类的页面时,我将在数组列表中加载所有项目类别,并将其显示为选择框中的选项,如下所示:

<select name="category>
    <%
        ArrayList<Category> categories = (ArrayList<Category>) request.getAttribute("categories");
        for (Category c : data) {
    %>
    <option value="<%= c.getId() %>"><%= c.getName() %></option>
    <%
        }
    %>
</select>

从“JavaServer Faces 2.0,完整参考”一书中,我了解到:“JSF通过禁止在标记页面中包含Java代码来实施清晰的模型 - 视图 - 控制器分离”。因此,如果有人能告诉我如何使用JSF处理上述任务,我将非常感激,因为我不能像以前那样使用Java代码。

致以最诚挚的问候,

James Tran

4 个答案:

答案 0 :(得分:2)

JSF 2.0使用Facelets作为模板方法,简而言之就是带有一些额外元素的XHTML。

虽然从技术上讲,您可以从Facelets执行方法调用,但通常的想法是使用正确的geter / setter方法访问JavaBean以执行数据移动。您可以通过下面的代码段显示:

<h:selectOneMenu value="#{backingBean.selectedCategory}">
    <f:selectItems value="#{backingBean.categoryList}"/>
</h:selectOneMenu>

在bean方面,您希望使用faces-config(基本上不鼓励)或CDI或Managed Bean基础结构等机制将bean暴露给JSF。我强烈建议你研究使用SEAM,如果你采用CDI路线,因为它将统一(当前真正奇怪的不同)Managed Bean和CDI框架,因此你可以在CDI中使用JSF范围,并在JSF范围内提供CDI bean。

@ManagedBean(name="backingBean")
@ViewScoped
public class MyJavaBackingBean {

    @ManagedProperty("#{param.categories}")
    protected List<String> categoryList

    public void setSelectedCategory(String value) {
        this.selectedCategory = value;
    }
    public String getSelectedCategory() {
        return this.property;
    }

    ...

}

您还可以让getter对值进行惰性初始化(例如,从数据库中提取categoryList),并使用其他一些JSF注释来执行各种初始化任务。

您还可以编写操作方法,这些方法返回表示JSF操作的String(这将被编码到faces-context.xml文件中),以便在返回后执行。还可以在页面呈现,验证和提交的各个阶段调用辅助bean上的阶段侦听器,从而为您提供非常精细的控制。

上述示例中的

categoryList不限于课程的基本类型,&lt; f:selectItems&gt;还有一些语法可以写出所选项目的文本版本,因此您可以制作一些非常复杂的表达式,以友好的方式显示每个项目。

答案 1 :(得分:1)

创建一个bean,并通过例如@Named所以你可以从你的JSF脚本中引用它。然后给该bean一个返回要显示的数据的方法,并从期望该数据的位置的JSF脚本中调用该方法,例如循环结构。

答案 2 :(得分:0)

将要显示的数据存储在Java列表中,并将该列表公开为辅助bean的属性。使用适当的JSF标记来显示该属性。

答案 3 :(得分:0)

在JSF 2.0中,您可以包含标记h:selectOneMenu,您可以在其中获取存储所选项目值的值。 f:selectItems中的值可以是任何对象的集合,大多数时候SelectItem在此对象中声明值对象和要显示的标签。

<h:selectOneMenu value="#{backingBean.selectedvalue}">
    <f:selectItems value="#{backingBean.List}"/> </h:selectOneMenu>

如果您需要另一个对象的值和标签,则必须声明

<h:selectOneMenu value="#{backingBean.selectedvalue}">
    <f:selectItems value="#{backingBean.ListCar}" var="car" itemLabel="#{car.model}" itemValue="#{car.modelId}"/>
</h:selectOneMenu>