从辅助bean替换托管bean实例

时间:2012-05-29 10:56:04

标签: jsf-2 cdi

做一个CRUD,我有一个RequestScoped Ticket bean。

我有一个XHTML页面,直到现在我一直用来创建新的门票;故障单字段直接填充(#{ticket.description}等等)

现在我有一个列出故障单的搜索表单,每个故障单都有一个带有故障单ID的链接作为参数。我希望backing bean从EJB / JPA(已经完成)中检索票证bean并将其放入请求中。我看到了3种方法:

  • 将从JPA检索到的bean中的数据复制到注入提供的bean中。丑陋/容易遗漏。
  • 使用ExternalContex#getRequestMap并将豆子放在那里。看起来不太合适。我是对的吗?
  • 将我的票证bean包含在另一个bean类中,这样我就可以myNewBean.setTicket(ticketFromJpa);。似乎是最好的选择,但我不喜欢在页面中为我的所有EL添加前缀。

有没有更干净,更正确的方式做我想做的事情?

提前致谢。

更新: 用更多的信息来改写我想要的东西。我在页面P1中有一个commandLink,它在支持bean A中调用操作B1B1执行其逻辑并重定向到页面P2。 我想在行动B2中设置一个(请求范围的)bean A,并且B2可用于绘制P2

从实验中,我发现在离开动作A之后,框架会创建一个新的B2请求范围的bean,因此看起来请求范围比我预期的要短。

达米安推动的闪存范围看起来更像我想要的工作,但迫使我重新设计#{flash}周围的页面,并且(当我想用它来创建一个新的bean时)我还必须添加bean在动作方法中使用flash(目前它只是转到页面并且托管bean可用)

我希望自

以来维护一个Request scoped bean

1 个答案:

答案 0 :(得分:4)

要在其他页面中查看故障单,您可以执行以下操作之一:
1)使用h:链接到包含票证ID的f:param

<h:link value="#{ticket.description}" outcome="/viewTicket" >
    <f:param name="id" value="#{ticket.id}" /
</h:link>

然后在viewTicket.xhtml(或任何你称之为页面的内容)中读取ID参数,并从JPA获取票证。

管理层基本上是这样的:

@ManagedBean
@ViewScoped
public class ViewTicketMBean implements Serializable {

    private String ticketId;
    private Ticket ticket;

    @PostConstruct
    public void init() {
        ticketId = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id");
        // read ticket from JPA by ID
    }

}

2)而不是h:link,如果您不想公开故障单ID,可以使用commandLink,在导航到viewTicket.xhtml之前,从JPA获取故障单并将其放入闪存范围。然后,在viewTicket中,您将从闪存范围获取票证。这就是commandLink的action方法看起来像

的方式
Ticket ticket = null;
// get ticket from JPA    
FacesContext.getCurrentInstance().getExternalContext().getFlash().put("ticket", ticket);
return "/viewTicket";