java - 如何在 JSF 中填充数据

标签 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 代码来强制执行干净的模型- 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/

相关文章:

java - Nutch 新手 - JSP 与 html 问题

java - JSF:如何根据特定 FacesContext session 属性的值将用户重定向到另一个页面

database - JDBC DriverManager 尝试使用非指定的 Oracle 驱动程序

java - 如何在 califorium CoAP 服务器中使用路径变量?

java - 我的 Centos 6.4 上同时存在两个 Java 版本(1.8.0_66 和 1.7.0_67),如何删除旧的 1.7?

javascript - Facebook javascript SDK 从属性文件到 jsp 的共享版本不起作用 [webapp]

javascript - 发送隐藏输入字段值返回 null

javascript - 单个 HTML 表单中的多个提交按钮

java - GridGain:如何在同一个JVM中运行多个节点?

css - 如何使用 CSS 填充设置 primefaces 数据表列填充