jsf-2 - JSF 2.0 View 参数传递对象

标签 jsf-2 viewparams

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

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

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

我收到错误 Conversion Error setting value mypackage.myBean@257100b' for 'null Converter'。 我们可以将字符串值以外的对象传递给 View 参数吗?

最佳答案

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

这是一个启动示例:

例如初始 View 中的以下内容:

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

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

以及链接 View 中的以下内容:

<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 .

例如

@ManagedBean
@ViewScoped
public class PersonEditor implements Serializable {

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

    // ...
}

它不再是可收藏的,而且对 SEO 不友好(但这就是 POST 的本质,您可能早就意识到这一点)。请注意 #{personViewer} bean 本身也必须是 @ViewScoped (因此不是 @ReqestScoped )。您还需要确保您不使用重定向导航返回,而只是向前导航。

关于jsf-2 - JSF 2.0 View 参数传递对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8609378/

相关文章:

redirect - 带有 includeViewParams 的 JSF2 重定向允许用户输入解析为文本字段的 EL 表达式

ajax - 不处理条件渲染组件中的表单提交

jsf - ViewParam 与 @ManagedProperty(值 = "#{param.id}")

ajax - JSF ViewParam 必需 +AJAX 中断页面

jsf-2 - 获取缺少运行时依赖项的错误 : java. lang.NoClassDefFoundError: org/apache/commons/fileupload/FileItem

jsf - includeViewParams=true 将空模型值转换为查询字符串中的空字符串

jsf - <h :link includeViewParams ="true"> does not include URL parameters

ajax - Primefaces数据表动态更新

css - 根据属性数据库 jsf2 primefaces 更改外观数据表

jsf - 从请求作用域 bean 访问 session 作用域 bean