做一个CRUD,我有一个RequestScoped Ticket bean。
我有一个XHTML页面,直到现在我一直用来创建新的门票;故障单字段直接填充(#{ticket.description}
等等)
现在我有一个列出故障单的搜索表单,每个故障单都有一个带有故障单ID的链接作为参数。我希望backing bean从EJB / JPA(已经完成)中检索票证bean并将其放入请求中。我看到了3种方法:
myNewBean.setTicket(ticketFromJpa);
。似乎是最好的选择,但我不喜欢在页面中为我的所有EL添加前缀。有没有更干净,更正确的方式做我想做的事情?
提前致谢。
更新:
用更多的信息来改写我想要的东西。我在页面P1
中有一个commandLink,它在支持bean A
中调用操作B1
。 B1
执行其逻辑并重定向到页面P2
。
我想在行动B2
中设置一个(请求范围的)bean A
,并且B2
可用于绘制P2
。
从实验中,我发现在离开动作A
之后,框架会创建一个新的B2
请求范围的bean,因此看起来请求范围比我预期的要短。
达米安推动的闪存范围看起来更像我想要的工作,但迫使我重新设计#{flash}周围的页面,并且(当我想用它来创建一个新的bean时)我还必须添加bean在动作方法中使用flash(目前它只是转到页面并且托管bean可用)
我希望自
以来维护一个Request scoped bean答案 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";