到目前为止,我一直使用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 代码来强制执行干净的模型- View - Controller 分离”。因此,如果有人能够向我展示如何使用 JSF 处理上述任务,我将非常感激,因为我无法像以前那样使用 Java 代码。
最诚挚的问候,
詹姆斯·特兰
最佳答案
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 或托管 Bean 基础设施之类的机制向 JSF 公开 Bean。如果您选择 CDI 路线,我强烈建议您考虑使用 SEAM,因为它将统一(目前非常奇怪的不同)托管 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 操作的字符串(这将被编码到您的 faces-context.xml 文件中)以在返回后执行。支持 bean 上的阶段监听器还可以在页面呈现、验证和提交的各个阶段调用,从而为您提供非常细粒度的控制。
上面示例中的categoryList 当然不限于基本类型,
关于java - 如何在 JSF 中填充数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7723026/