JSF 2.0视图参数传递对象

时间:2011-12-22 20:30:15

标签: jsf-2 viewparams

我正在尝试将对象从一个页面传递到另一个页面,其中每个页面都在不同的视图中。

在第一页上我有一个输入文本,其中myBean是ViewScoped Bean,name是一个对象。      <h:inputText value="#{myBean.name}"/>

第二页包含,
    <f:metadata>
      <f:viewParam name="userId" value="#{myBean.name}"/>
   </f:metadata>

我为'null Converter'收到错误转换错误设置值mypackage.myBean@257100b'。 我们可以传递String值以外的对象来查看参数吗?

1 个答案:

答案 0 :(得分:10)

是的,你可以。您只需提供一个转换器,它在#{myBean.name}后面的对象类型的字符串表示形式和真实对象之间进行转换。字符串表示通常是所讨论对象的唯一技术/自然标识符。例如,表的PK。它必须是一个字符串,因为HTTP请求参数只能是字符串。您无法在URL中传递复杂的Java对象。网址只是字符串。

这是一个启动示例:

E.g。初始视图中的以下内容:

<h:link value="Edit" outcome="edit">
    <f:param name="id" value="#{personViewer.person.id}" />
</h:link>

(生成<a href="edit.xhtml?id=123">Edit</a>

以及链接视图中的以下内容:

<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));
    }

}

(过度简化;省略了所有空/数字检查,但您明白了这一点)

另见:


根据评论

更新,您实际上想要触发POST请求。您根本不需要<f:viewParam>。它仅用于设置/验证/转换GET请求参数。尝试序列化整个对象也没有任何意义。只需使用@ManagedProperty

E.g。

@ManagedBean
@ViewScoped
public class PersonEditor implements Serializable {

    @ManagedProperty("#{personViewer.person}")
    private Person person;

    // ...
}

它只是不再加入书签而不是SEO友好(但这是POST的本质,你可能已经很久才意识到这一点)。请注意,#{personViewer} bean本身也必须是@ViewScoped(因此不是@ReqestScoped)。您还需要确保不使用重定向导航回来,而只是向前导航。