JSF 2.0 中的参数传递

Posted

技术标签:

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

我找到了一些参考JSF Parameter Passing

Passing parameters between managed beans with request scope JSF 2.X Passing parameter between two xhtml pages jsf passing parameters in a method expression failes in ViewScoped bean

但是,这不符合我的要求。我会将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

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

【问题讨论】:

【参考方案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;
   


【讨论】:

传递ID String,再次从数据库中检索。否则,请使用SessionScopeApplicationScope。我对吗?感谢您的提供。 不要滥用作用域,否则你会扼杀线程安全和用户体验。进一步阅读:***.com/q/7031885 和 ***.com/a/15523045 更多有用链接:jsf.zeef.com/bauke.scholtz

以上是关于JSF 2.0 中的参数传递的主要内容,如果未能解决你的问题,请参考以下文章

在JSF之间传递和使用参数包括

JSF 2.0在bean(或页面?)之间传递数据

JSF 2:如何将包含要调用的参数的动作传递给 Facelets 子视图(使用 ui:include 和 ui:param)?

迁移到 tomcat 后,将枚举值作为参数从 JSF 页面传递给 bean 方法失败

JSF 2.0 中的 STATE_SAVING_METHOD 参数是啥

PromiseKit 2.0:链接承诺不传递参数