Skip to main content
 首页 » 编程设计

JSF 传递参数的最佳方式

2024年09月03日15shanyou

我目前正在使用 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 即可。

更多信息: