像这样定义 View 参数有什么区别:
<f:metadata>
<f:viewParam name="id" value="#{someBean.id}"/>
</f:metadata>
并在 ManagedBean 中定义属性,如下所示:
@Inject @ManagedProperty(value = "#{param.id}")
private Integer id;
最佳答案
<f:viewParam>
:
仅在更新模型值阶段设置值(因为它扩展了
UIInput
)。设置值在
@PostConstruct
期间不可用。 ,所以您需要额外的<f:event type="preRenderView" listener="#{bean.init}" />
里面<f:metadata>
根据设定值进行初始化/预加载。从 JSF 2.2 开始,您可以使用<f:viewAction>
为此。允许嵌套
<f:converter>
和<f:validator>
用于更细粒度的转换/验证。甚至是<h:message>
可以附上。可以使用
includeViewParams
自 Action 为 GET 查询字符串包含在结果目标 URL 中<h:link>
的属性或includeViewParams=true
任意 URL 中的请求参数。可用于
@RequestScoped
bean,但它要求 bean 为@ViewScoped
如果您希望 View 参数能够承受由 View 中包含的表单引起的任何验证失败,否则您需要通过<f:param>
手动保留后续请求的所有请求参数在UICommand
组件,因为<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/