2011-10-11 69 views
0

到目前为止,我一直使用JSP来显示页面。当一个页面,如“添加项目”,我会加载所有项目类别中的数组列表并将其显示在选择框中选择这样的用户请求:如何在JSF中填充数据

<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代码。

最好的问候,

詹姆斯陈

回答

0

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

+0

我可以做前2分。你能告诉我需要使用哪种标签吗?谢谢! –

+0

感谢您的提示!我发现如何做到这一点。它是[这里](http://www.roseindia.net/jsf/selectItems.shtml) –

+0

@JamesBoyZ:Roseindia.net是一个普遍教** **的网站。当您是JSF的新手时,请忽略此资源。 – BalusC

1

创建一个bean,并使其与已知的,例如@Named,以便您可以从JSF脚本中引用它。然后给这个bean一个返回你想要显示的数据的方法,然后从你的JSF脚本中调用这个方法,在那个数据被预期的位置,例如一个循环结构。

+0

我是新的JSF。你能不能给我一个简短的伪代码如何做.xhtml页面上的循环结构?目前,我只知道如何使用dataTable和outputText打印输出。但是,我不知道如何把我需要的东西放入

2

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

虽然技术上你可以从Facelets执行方法调用,但总的来说,这个想法是使用适当的geter/setter方法访问JavaBean来执行数据移动。你可以做到这一点的代码下面的片段显示:

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

对事物的豆方,你想用或者面临-配置(这在很大程度上是沮丧),或如一个机制来揭露一个bean JSF CDI或Managed Bean基础架构。我强烈建议您考虑使用SEAM,因为它将统一(当前非常不同的)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; 
    } 

    ... 

} 

您也可以使干将做你的价值观的初始化工作(从例如数据库中提取所属分类),并使用一些其他JSF的注解做各种初始化任务。

您还可以编写一些操作方法,它们返回表示JSF操作的字符串(将其编码到您的faces-context.xml文件中)以在返回后执行。辅助bean上的阶段侦听器也可以在页面渲染,验证和提交的各个阶段被调用,从而为您提供非常细致的控制。

categoryList在上面的例子中并不局限于当然的基本类型,而< f:selectItems >也有一些语法来写出你选择的项目的文本版本,所以你可以制作一些相当复杂的表达式来显示每个项目以友好的方式。

+0

=)谢谢你的非常详细的答案。我不能完全理解你所有的观点,因为我是JSF的新手,但我会尽力记住这些事情:P。 –

+0

只要我2美分:马上研究CDI。它本质上是一个Spring的J2EE标准化版本,功能非常强大。只要记得在使用CDI时使用SEAM(http://seamframework.org/Seam3),否则它不能很好地与JSF集成。使用它使得JSF非常高兴地使用它,并且启用了一些有趣的事情:http://stackoverflow.com/questions/6199458/how-to-create-a-modular-jsf-2-0-application – SplinterReality

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>