0

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

我有一个 XHTML 页面,直到现在我一直在使用它来创建新票证;工单字段直接填充(#{ticket.description}依此类推)

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

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

有没有更清洁、更正确的方法来做我想做的事?

提前致谢。

更新:改写我想要的内容,提供更多信息。我在 page 中有一个 commandLink ,它在 backing beanP1中调用 action 。执行其逻辑并重定向到 page 。我想在 action中设置一个(请求范围的)bean ,并且可以用来绘制。AB1B1P2B2AB2P2

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

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

我希望从那时起维护一个请求范围的 bean

4

1 回答 1

4

要在另一个页面中查看票证,您可以执行以下操作之一:
1) 使用 h:link 和包含票证 ID 的 af: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) 如果您不想公开票证 ID,则可以使用 commandLink 代替 h:link,在导航到 viewTicket.xhtml 之前,它会从 JPA 获取票证并将其放入 flash 范围内。然后,在 viewTicket 中,您可以从 flash 范围中获取票证。这就是 commandLink 的 action 方法的样子

Ticket ticket = null;
// get ticket from JPA    
FacesContext.getCurrentInstance().getExternalContext().getFlash().put("ticket", ticket);
return "/viewTicket";
于 2012-05-29T13:05:37.120 回答