我目前正在使用 JSF,但由于我是一个老旧且脾气暴躁的 php 开发人员,所以我总是搞乱请求的 GET 参数。 (在 PHP 中,您可以随时使用 $_GET["paramname"]
数组访问请求参数。
现在,我正在开发用户管理系统。 (CRUD)通常我会使用所有可用用户的列表,其中包含编辑/删除等选项。例如,编辑链接指向 http:\\localhost\editUser.xhtml?userId=5
。
我还有一个名为 UserEditController
的 Controller ,它基本上保存用户实体并调用更新。
因此,在这个 Controller 中,我使用 @PostConstruct
注释从 DataService 加载 id 5 的用户并将其存储在属性中。
这里的问题是:Wenn 在 APPLY_REQUEST_VALUES
阶段输入 PostConstruct-Method,我无法访问 Faces 上下文的请求参数映射(将为 userId 返回 null)
Controller (简化):
@Named
@RequestScoped
UserEditController{
@Inject
private UserDataService userDataService;
private User currentUser;
@PostConstruct
public void initValues(){
String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("userId");
this.currentUser = userDataService.getUserById(id);
}
public String saveCurrentUser(){
userDataService.updateUser(this.currentUser);
return "userManagement"; //return to overview after saving
}
//getter and setter
}
这按预期工作。现在所有表单字段都绑定(bind)到用户的属性,例如 #{userEditController.currentUser.forename}
等。
我现在添加了一个带有操作属性的保存按钮{userEditController.saveCurrentUser()}
然而,脚本随后进入 APPLY_REQUEST_VALUES
阶段,并再次调用 UserEditController 的 initValues 。
- 当尝试访问 RequestParameterMap 时,这会导致空指针异常
- 显然我不想在保存之前重新加载用户:-)
这听起来像是一个愚蠢的问题,但我认为我在 PHP 风格和 JSF 风格之间搞乱了处理事情。
任何帮助将不胜感激。
请您参考如下方法:
将用户(或 userID)传递给 BackingBean 的常见方法是使用以下选项之一:
http://www.mkyong.com/jsf2/4-ways-to-pass-parameter-from-jsf-page-to-backing-bean/
我认为主要问题是你的bean是@RequestScoped
。如果您按下编辑页面上的保存按钮,您将发送一个新请求,因此将创建一个请求作用域 bean 的新实例。只需将您的 bean 更改为 @ViewScoped
即可。
更多信息: