Java JSF:如何将List <t>类型的模型传递给视图?</t>

时间:2012-10-27 06:48:25

标签: java jsf

背景

我正在学习Java,目前正在学习JSF。我来自ASP.NET MVC背景,并且最近才暴露在Java世界中,所以要温柔;)

问题

我无法弄清楚如何将模型(List<T>)放入JSF视图中。我最近学习Struts时所做的是:

  1. 像这样创建了一个Servlet:

    @WebServlet(name = "ViewProductsServlet", urlPatterns = {"/ViewProductsServlet"})

    public class ViewProductsServlet extends HttpServlet {

        protected void processRequest(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            ProductRepository repository = new ProductRepository();
            List<Product> model = repository.getAll();
            request.setAttribute("model", model);
            request.getRequestDispatcher("/viewProducts.jsp").forward(request, response);
        }
    
  2. 链接到查看产品页面,如下所示:

  3. <html:link forward="viewProducts" styleClass="btn btn-primary">View Products</html:link>

    1. 在视图中,我得到了这样的模型:

      <% List<Product> model = (List<Product>)request.getAttribute("model"); %>

    2. 然后我只是使用JSTL标签迭代这些项目..不确定这是否是“正确”的方法,但它有效..

      现在对于JSF的东西,我试图采取类似的方法,但我注意到<% %>标签在xhtml页面中不起作用。很公平,但是我如何将一个集合传递给一个页面,以便我可以在一个表/网格中显示这些项目?

      修改

      感谢Sanjeevi.V,我可以看到我应该使用h:dataTable标签。但是,它不显示数据。这是我的代码:

      MODEL / Manage Bean:

      @ManagedBean
      @SessionScoped
      public class EmployeeCollection {
          private List<Employee> items;
      
          public List<Employee> getItems() {
              if (items == null) {
                  EmployeeRepository repository = new EmployeeRepository();
                  items = repository.getAll();
              }
      
              return items;
          }
      }
      

      查看标记:

      <div class="container-fluid">
                  <div class="row-fluid">
                      <div class="span8 offset2">
                          <h:dataTable class="table table-striped" value="#{EmployeeCollection.items}" var="item">
                              <h:column>
                                  <f:facet name="header">First Name</f:facet>
                                  #{item.getFirstName()}
                              </h:column>
                              <h:column>
                                  <f:facet name="header">Last Name</f:facet>
                                  #{item.getLastName()}
                              </h:column>
                              <h:column>
                                  <f:facet name="header">Date of Birth</f:facet>
                                  #{item.getDateOfBirth().toString()}
                              </h:column>
                          </h:dataTable>
                      </div>
                  </div>
              </div>
      

      我试着按照那个教程,所以我不确定我哪里出错了。就个人而言,我不明白它是如何工作的......如何将EmployeeCollection bean连接起来?是因为它有@SessionScoped每个会话只有一个,所以会使用它吗?即便如此,在运行时,它将是一个空对象。我在这里错过了什么?我怎样才能做到这一点?我确实在数据库中有行,所以不要问这个。 :)

2 个答案:

答案 0 :(得分:2)

value="#{EmployeeCollection.items}"

camelcase开始小尝试

value="#{employeeCollection.items}"

答案 1 :(得分:1)

请尝试以下代码

Managed Bean:

@ManagedBean(name = "bean")
@SessionScoped
public class Bean {
private List<Integer> numList;

public List<Integer> getNumList() {
    return numList;
}

public void setNumList(List<Integer> numList) {
    this.numList = numList;
}

public Bean() {
    numList=new ArrayList<Integer>();
    for (int i = 0; i < 10; i++) {
        numList.add((int)(Math.random()*100));
    }
}

}

标记:

<h:dataTable value="#{bean.numList}" var="num">
  <h:column><h:outputText value="#{num}"/></h:column>
</h:dataTable>

来源:http://www.mkyong.com/jsf2/jsf-2-datatable-example/

希望这有帮助。