Jsf 2 JSF2.0传递对象的视图参数
我试图将一个对象从一个页面传递到另一个页面,其中每个页面都位于不同的视图中 在第一个页面上,我有一个输入文本,其中myBean是一个ViewScoped Bean,name是一个对象。Jsf 2 JSF2.0传递对象的视图参数,jsf-2,viewparams,Jsf 2,Viewparams,我试图将一个对象从一个页面传递到另一个页面,其中每个页面都位于不同的视图中 在第一个页面上,我有一个输入文本,其中myBean是一个ViewScoped Bean,name是一个对象。 第二页包含, 我得到了错误转换错误设置值mypackage。myBean@257100b'表示“空转换器”。 我们可以传递字符串值以外的对象来查看参数吗 是的,你可以。您只需要提供一个转换器,它可以在{myBean.name}后面的对象类型的字符串表示形式和真实对象之间进行转换。字符串表示通常是相关对象的
第二页包含,
我得到了错误转换错误设置值mypackage。myBean@257100b'表示“空转换器”。
我们可以传递字符串值以外的对象来查看参数吗 是的,你可以。您只需要提供一个转换器,它可以在
{myBean.name}
后面的对象类型的字符串表示形式和真实对象之间进行转换。字符串表示通常是相关对象的唯一技术/自然标识符。例如,表的主键。它必须是字符串,因为HTTP请求参数只能是字符串。不能在URL中传递复杂的Java对象。URL只是字符串
以下是一个启动示例:
例如,初始视图中的以下内容:
<h:link value="Edit" outcome="edit">
<f:param name="id" value="#{personViewer.person.id}" />
</h:link>
(过于简化;省略了所有空/数字检查,但您知道了)
另见:
更新根据评论,您实际上想要发出POST请求。您根本不需要
。它仅用于设置/验证/转换GET请求参数。试图序列化整个对象也毫无意义。只需使用@ManagedProperty
例如
这不仅不再是书签,也不利于搜索引擎优化(但这是帖子的本质,你可能早就意识到了这一点)。注意,
{personViewer}
bean本身也必须是@ViewScoped
(因此不是@requestscope
)。您还需要确保不使用重定向返回,而只是向前导航。顺便说一句,在没有转换器的
中使用该值是非常令人困惑的。在提交带有该字段的POST表单时,您会遇到完全相同的问题。感谢BaluCs的快速回复。我们可以仅通过来自另一个视图范围bean的POST将接收的值设置为managedProperty(另一个视图范围bean)。您不能通过@ManagedProperty
在视图范围的bean中设置请求参数。另请参阅答案底部的“请参阅”文章链接。我们正在尝试序列化和反序列化viewParam中传递的对象。但问题是调用的是getAsObject,而不是getAsString。因此,我们为myBean添加了一个单独的toString方法。参数值也显示在URL中。有没有办法隐藏这个参数?所以你只是想要一个帖子?那么您根本不需要
。连载毫无意义。
用于设置GET请求参数。对于POST,只需使用引用初始bean的@ManagedProperty
。另请参阅更新后的答案。我们需要在第一页中使用第二页中的值。如果我们只做了一个post,并像您上面提到的那样为初始bean提供ManagedProperty,则person id为空。如果我在第二页添加f:metadata标记和相应的代码,并添加转换器,我们可以在第二页中看到值。如果我们不将该类转换为toString,则会发生一个错误,声明person不能设置为PersonEdit bean。那么,有没有一种方法可以在转换器中调用toString方法,或者其他更好的方法?
<f:metadata>
<f:viewParam name="id" value="#{personEditor.person}"
converter="#{personConverter}" converterMessage="Bad request. Unknown person."
required="true" requiredMessage="Bad request. Please use a link from within the system."
/>
</f:metadata>
<h:messages />
@ManagedBean
@RequestScoped
public class PersonConverter implements Converter {
@EJB
private PersonService personService;
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
return String.valueOf(((Person) value).getId());
}
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
return personService.find(Long.valueOf(value));
}
}
@ManagedBean
@ViewScoped
public class PersonEditor implements Serializable {
@ManagedProperty("#{personViewer.person}")
private Person person;
// ...
}