我有几个页面需要 userId 才能工作,因此下面的代码:
用户页面.xhtml
<!-- xmlns etc. omitted -->
<html>
<f:metadata>
<f:viewParam name="userId" value="#{userPageController.userId}"/>
</f:metadata>
<f:view contentType="text/html">
<h:head>
</h:head>
<h:body>
<h:form>
<h:commandButton action="#{userPageController.doAction}" value="post"/>
</h:form>
</h:body>
</f:view>
用户页面控制器.java
@Named
@ViewScoped
public class userPageControllerimplements Serializable {
private static final long serialVersionUID = 1L;
@Inject protected SessionController sessionController;
@Inject private SecurityContext securityContext;
@Inject protected UserDAO userDAO;
protected User user;
protected Long userId;
public UserPage() {
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
if(!FacesContext.getCurrentInstance().isPostback()){
User u = userDAO.find(userId);
this.userId = userId;
this.user = u;
}
}
public void doAction(){
}
}
但是调用doAction之后,url中的view参数就消失了。由于其视图范围的性质,该 bean 仍然有效,但它破坏了我未来导航的尝试。当我四处搜索时,我得到的印象是视图参数应该在帖子之后保留,因此读取 userpage.jsf?userId=123,但事实并非如此。真正的预期行为是什么?
与此相关,我尝试在导航到要保留 userId 的另一个页面时实现视图参数的自动添加。它似乎对其他人有用,但对我来说, ViewRoot 中的 userId 始终为空。下面的代码用于检索视图参数(我知道我可以使用 bean 中临时存储的 userId 进行导航,但这个解决方案会更漂亮):
String name = "userId";
FacesContext ctx = FacesContext.getCurrentInstance();
ViewDeclarationLanguage vdl = ctx.getApplication().getViewHandler().getViewDeclarationLanguage(ctx, viewId);
ViewMetadata viewMetadata = vdl.getViewMetadata(ctx, viewId);
UIViewRoot viewRoot = viewMetadata.createMetadataView(ctx);
UIComponent metadataFacet = viewRoot.getFacet(UIViewRoot.METADATA_FACET_NAME);
// Looking for a view parameter with the specified name
UIViewParameter viewParam = null;
for (UIComponent child : metadataFacet.getChildren()) {
if (child instanceof UIViewParameter) {
UIViewParameter tempViewParam = (UIViewParameter) child;
if (name.equals(tempViewParam.getName())) {
viewParam = tempViewParam;
break;
}
}
}
if (viewParam == null) {
throw new FacesException("Unknown parameter: '" + name + "' for view: " + viewId);
}
// Getting the value
String value = viewParam.getStringValue(ctx); // This seems to ALWAYS be null.
最后一个想法是 setter 方法似乎仍然有效, setUserId 在发布时使用正确的值调用。
我是否完全误解了视图参数的工作原理,或者这里是否存在某种错误?我认为我的用例应该非常普遍,并且在框架中有基本的支持。