【问题标题】:Parameter passing in JSF 2.0JSF 2.0 中的参数传递
【发布时间】:2014-02-09 04:46:20
【问题描述】:

我找到了一些参考JSF Parameter Passing

但是,这不符合我的要求。我会将object(Student) 一个支持bean 传递给另一个bean,如下所示。

studentTable.xhtml                              updateStudent.xhtml
                        pass student object
                        (not `StudentID` string)
                        ==================> 
StudentTableBean.java                           UpdateStudnetBean.java

两个支持 bean 可能是 RequestScopeViewScope,而不是 Session。当我单击studentTable.xhtml 的链接(一行数据表)时,我想将学生对象传递给updateStudent.xhtml

有可能吗?你能提供一些参考或提供吗?

【问题讨论】:

    标签: jsf object parameter-passing view-scope


    【解决方案1】:

    你认为这怎么可能? Viewscope 在您离开页面时结束,并且该范围内的所有 bean 都被销毁 - 它们所持有的对象也是如此。

    updateStudent.xhtml 创建一个新视图并获得它自己的一组 Viewscoped bean。如果您想在页面之间保留对象,请开始一个新的、长时间运行的对话或将对象推送到会话范围内。

    有关使用对话范围,请参阅this tutorial

    【讨论】:

    • 我在我的项目中使用Jboss Seam。现在我正在考虑删除Jboss Seam。这就是为什么,我正在尝试像Conversation 一样进行研究。
    • @CycDemo 我处于相同的位置并选择了带有转换器的 ViewScoped bean,如下所示的 BalusC(ConversationScoped 是 JEE7 的补充,我还不确定)。由于所有查找都是通过 PK 进行的,因此它们对缓存非常友好,与 JSF 需要做的所有其他事情相比应该快如闪电。
    【解决方案2】:

    您可以通过将学生的对象放在请求的当前实例的会话映射中来做到这一点:您将相关学生的 id 从studentTable.xhtml 传递给支持bean UpdateStudnetBean.java,然后搜索来自资源(列表、数据库等)的对象实例,然后将其放在上面的会话映射对象中。这样你就可以 通过隐式对象sessionScope 在视图updateStudent.xhtml 中获取它。

    【讨论】:

      【解决方案3】:

      HTTP 和 HTML 不理解复杂的 Java 对象。从 Java 的角度来看,它们只理解字符串。您最好将复杂的 Java 对象转换为字符串风格的唯一标识符,通常是其技术 ID(例如自动生成的数据库 PK),然后将该标识符用作 HTML 链接中的 HTTP 请求参数。

      给定一个List<Student>,它表示为一个带有如下链接的表格,

      <h:dataTable value="#{studentTable.students}" var="student">
          <h:column>
              <h:link value="Edit" outcome="updateStudent.xhtml">
                  <f:param name="id" value="#{student.id}" />
              </h:link>
          </h:column>
      </h:dataTable>
      

      您可以在目标视图updateStudent.xhtml 中使用&lt;f:viewParam&gt; 将传递的学生ID 转换回Student,如下所示,

      <f:metadata>
          <f:viewParam name="id" value="#{updateStudent.student}" converter="#{studentConverter}" />
      </f:metadata>
      

      private Student student;
      

      @ManagedBean
      @ApplicationScoped
      public class StudentConverter implements Converter {
      
          @EJB
          private StudentService studentService;
      
          @Override
          public Object getAsObject(FacesContext context, UIComponent component, String value) {
              if (value == null || value.isEmpty()) {
                  return null;
              }
      
              if (!value.matches("[0-9]+")) {
                  throw new ConverterException("The value is not a valid Student ID: " + value);
              }
      
              long id = Long.valueOf(value);
              return studentService.getById(id);
          }
      
          @Override    
          public String getAsString(FacesContext context, UIComponent component, Object value) {        
              if (value == null) {
                  return "";
              }
      
              if (!(value instanceof Student)) {
                  throw new ConverterException("The value is not a valid Student instance: " + value);
              }
      
              Long id = ((Student)value).getId();
              return (id != null) ? String.valueOf(id) : null;
         }
      
      }
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-26
      • 2012-10-01
      • 2011-08-04
      • 1970-01-01
      • 2010-12-18
      • 1970-01-01
      • 2011-04-26
      • 2013-12-20
      相关资源
      最近更新 更多