99

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

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

并像这样在 ManagedBean 中定义属性:

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

2 回答 2

146

<f:viewParam>

  • 仅在更新模型值阶段设置值(因为它 extends UIInput)。

  • 设置值在 期间不可用,因此您需要在内部@PostConstruct额外根据设置值进行初始化/预加载。从 JSF 2.2 开始,您可以改为使用它。<f:event type="preRenderView" listener="#{bean.init}" /><f:metadata><f:viewAction>

  • 允许嵌套<f:converter><f:validator>更细粒度的转换/验证。甚至<h:message>可以附加一个。

  • 可以使用任何 URL 中includeViewParams的属性<h:link>或请求参数作为 GET 查询字符串包含在内。includeViewParams=true

  • 可以在一个@RequestScopedbean上使用,但是如果你想让视图参数在视图中包含的表单导致的任何验证失败中幸存下来,它就需要bean ,否则你需要在命令@ViewScoped中手动保留所有后续请求的请求参数<f:param>成分。

示例

<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可以根据设置值轻松初始化/预加载其他属性。

  • 不允许在视图中进行声明性转换/验证。

  • #{param}范围比请求范围更广的 bean 上不允许托管属性 of ,因此 bean 必须是@RequestScoped.

  • 如果您依赖#{param}在后续 POST 请求中存在的托管属性,那么您需要将其包含<f:param>UICommand组件中。

示例

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

private User user;

@EJB
private UserService userService;

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

但是你必须自己管理验证,只要usernull通过摆弄FacesContext#addMessage()什么的。


当两者都是强制性的时,您可以同时使用它们。您将无法再应用细粒度的转换/验证。@PostConstructincludeViewParams


也可以看看:

于 2011-02-03T17:06:28.600 回答
6

2 其他区别:

  • @ManagedProperty只能用于由 JSF 管理的 bean,不能用于由 CDI ( @Named) 管理的 bean;
    • <f:viewParam>仅适用于 GET 请求的参数。
于 2012-12-06T15:44:08.233 回答