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

标签 jsf managed-bean viewparams managed-property

像这样定义 View 参数有什么区别:

<f:metadata>
  <f:viewParam name="id" value="#{someBean.id}"/>
</f:metadata>

并在 ManagedBean 中定义属性,如下所示:

@Inject @ManagedProperty(value = "#{param.id}")
private Integer id;

最佳答案

<f:viewParam> :

示例:

<f:metadata>
    <f:viewParam id="user_id" name="id" value="#{bean.user}"
        required="true" requiredMessage="Invalid page access. Please use a link from within the system."
        converter="userConverter" converterMessage="Unknown user ID."
    />
</f:metadata>
<h:message for="user_id" />

private User user;

和一个 @FacesConverter("userConverter") 。调用页面 http://example.com/context/user.xhtml?id=123将通过id通过转换器参数并设置User对象作为 bean 属性。

<小时/>

@ManagedProperty :

  • 在 bean 构造后立即设置值。

  • 设置值在 @PostConstruct 期间可用。它允许根据设置值轻松初始化/预加载其他属性。

  • 是否不允许允许在 View 中进行声明性转换/验证。

  • 是否支持自动包含在结果目标网址中。

  • 可以在任何范围的 bean 上使用,但它只会在 bean 构造期间设置,而不是在每个请求时设置。

示例:

@Inject @ManagedProperty("#{param.id}")
private Long id;

private User user;

@EJB
private UserService userService;

@PostConstruct
public void init() {
    user = userService.find(id);
}

请注意,每当 user 时,您都必须自己管理转换和验证。是 null通过摆弄 FacesContext#addMessage() 里面@PostConstruct方法。另请注意,当 #{param.id}不是一个有效的数字,那么在 @PostConstruct 之前会抛出异常被击中。如果你想处理它,那么你最好将其设置为 private String id 。但更好的是使用 <f:viewParam> .

<小时/>

@PostConstruct 时,您可以同时使用它们。和includeViewParams是必须的。您将无法再应用细粒度的转换/验证。

<小时/>

另请参阅:

关于jsf - ViewParam 与 @ManagedProperty(值 = "#{param.id}"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4888942/

相关文章:

java - 帮助理解JSF对托管bean的多次调用

jsf - ManagedBean 类型已弃用

JSF f :viewParam not calling setter if located in template. xhtml

jsf - 元数据组件需要嵌套在 f :metadata tag. 建议:将必要的组件包含在 <f:metadata> 中

java - 如何在没有faces-config.xml文件的情况下基于action方法返回字符串从ManagedBean直接调用xhml页面

java - Primefaces CommandButton 不触发 p :columns header facet 内的 actionListener 方法

JSF 托管 Bean 命名约定

jsf - 如何在 JSF 支持 bean 之间共享一个实体?

jsf - session 到期时自动在客户端执行操作

jsf - p :selectOneMenu value not set in bean