Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 从支持bean替换托管bean实例_Jsf 2_Cdi - Fatal编程技术网

Jsf 2 从支持bean替换托管bean实例

Jsf 2 从支持bean替换托管bean实例,jsf-2,cdi,Jsf 2,Cdi,在执行CRUD时,我有一个RequestScope票据bean 我有一个XHTML页面,直到现在我一直在使用它来创建新的票据;票证字段直接填充(#{ticket.description}等等) 现在我有了一个搜索表单,它列出了票证,每个票证都有一个以票证id为参数的链接。我希望支持bean从EJB/JPA(已经完成)检索票证bean并将其放入请求中。我认为有三种方法可以做到这一点: 将从JPA检索到的bean中的数据复制到注入提供的bean中。难看/容易被遗漏 使用并把豆子放在那里。看起来不太

在执行CRUD时,我有一个RequestScope票据bean

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

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

  • 将从JPA检索到的bean中的数据复制到注入提供的bean中。难看/容易被遗漏
  • 使用并把豆子放在那里。看起来不太合适。我说得对吗
  • 将我的ticketbean包含到另一个bean类中,这样我就可以执行
    myNewBean.setTicket(ticketFromJpa)。似乎是最好的选择,但我不喜欢仅仅为了这个就必须在页面中为所有EL加前缀
有没有更干净更合适的方法来做我想做的事

提前谢谢

更新: 用更多的信息改写我想要的。我在页面
P1
中有一个commandLink,它在backingbean
B1
中调用action
a
<代码>B1执行其逻辑并重定向到页面
P2
。 我想在动作
a
中设置一个(请求范围)bean
B2
,并且
B2
将可用于绘制
P2

通过实验,我发现在离开action
A
之后,框架创建了一个新的
B2
请求范围bean,因此看起来请求范围比我预期的要短

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


我希望维护请求范围的bean,因为要在另一个页面中查看票据,可以执行以下操作之一:
1) 使用h:link和包含票证ID的f:param

<h:link value="#{ticket.description}" outcome="/viewTicket" >
    <f:param name="id" value="#{ticket.id}" /
</h:link>
2) 如果不想公开票证ID,可以使用commandLink而不是h:link,它在导航到viewTicket.xhtml之前从JPA获取票证并将其放入flash范围。然后,在viewTicket中,您可以从闪存示波器获取票据。这就是commandLink的操作方法的样子

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

要在另一页中查看票证,可以执行以下操作之一:
1) 使用h:link和包含票证ID的f:param

<h:link value="#{ticket.description}" outcome="/viewTicket" >
    <f:param name="id" value="#{ticket.id}" /
</h:link>
2) 如果不想公开票证ID,可以使用commandLink而不是h:link,它在导航到viewTicket.xhtml之前从JPA获取票证并将其放入flash范围。然后,在viewTicket中,您可以从闪存示波器获取票据。这就是commandLink的操作方法的样子

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

你为什么要把票放在申请单上?接下来要做什么?我想将票证传递到.xhtml页面,以便它呈现票证数据。为什么需要将票证放入请求中?下一步要做什么?我想将票证传递到.xhtml页面,以便它呈现票证数据。请对第一个选项进行详细说明,好吗?我对JSF非常陌生,到目前为止,当我使用xhtml时,我只是在托管bean中呈现数据(在支持bean操作时更新)。如何从xhtml本身调用JPA?我现在要离开工作,稍后我将检查第二个选项并告诉它它是如何运行的。我更新了答案。您在托管bean的@PostConstruct方法中读取参数并从JPA获取票证。我建议你多学习一点JSF,阅读一些教程,阅读文档等等。这是非常基本的。flash方法更像我需要的,但我发现它有点麻烦(迫使我在重定向到页面的每个动作中向flash添加bean,并在EL中通过flash进行引用)。您知道有没有办法解决这些问题吗?您可以使用以下行从@PostConstruct中的Flash读取bean,而不是在EL中引用Flash:FacesContext.getCurrentInstance().getExternalContext().getFlash().get(“票证”);我认为没有其他方法可以实现这一点;通常使用h:链接。请您详细说明一下第一个选项好吗?我对JSF非常陌生,到目前为止,当我使用xhtml时,我只是在托管bean中呈现数据(在支持bean操作时更新)。如何从xhtml本身调用JPA?我现在要离开工作,稍后我将检查第二个选项并告诉它它是如何运行的。我更新了答案。您在托管bean的@PostConstruct方法中读取参数并从JPA获取票证。我建议你多学习一点JSF,阅读一些教程,阅读文档等等。这是非常基本的。flash方法更像我需要的,但我发现它有点麻烦(迫使我在重定向到页面的每个动作中向flash添加bean,并在EL中通过flash进行引用)。您知道有没有办法解决这些问题吗?您可以使用以下行从@PostConstruct中的Flash读取bean,而不是在EL中引用Flash:FacesContext.getCurrentInstance().getExternalContext().getFlash().get(“票证”);我认为没有其他方法可以实现这一点;通常使用h:链接。