簡體   English   中英

JSF 傳遞參數的最佳方式

[英]JSF best Way to pass parameters

我目前正在使用 JSF,但由於我是一個老而脾氣暴躁的 php-dev,我總是弄亂請求的 GET 參數。 (在 PHP 中,您可以隨時使用$_GET["paramname"]數組訪問請求參數。

現在,我正在研究用戶管理系統。 (CRUD)通常我會列出所有可用用戶的列表,其中包含編輯/刪除等選項。 例如,編輯鏈接指向http:\\\\localhost\\editUser.xhtml?userId=5

我還有一個名為UserEditController的控制器,它基本上保存用戶實體並調用更新。

因此,在此控制器中,我使用@PostConstruct注釋從 DataService 加載 ID 為 5 的用戶並將其存儲在屬性中。

這里的問題是:Wenn 在APPLY_REQUEST_VALUES -Phase 中輸入 PostConstruct-Method 我無法訪問 Faces 上下文的請求參數映射(將為 userId 返回 null)

控制器(簡化):

@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
}

這按預期工作。 現在所有的表單字段都綁定到用​​戶的屬性,如#{userEditController.currentUser.forename}等。

我現在添加了一個帶有操作屬性{userEditController.saveCurrentUser()}的保存按鈕

然而,腳本然后進入APPLY_REQUEST_VALUES -Phase 並且再次調用 UserEditController 的 initValues。

  • 當嘗試訪問 RequestParameterMap 時,這會導致空指針異常
  • 顯然我不想在保存之前重新加載用戶:-)

這聽起來像一個愚蠢的問題,但我認為我在 PHP 風格和 JSF 風格之間搞砸了處理事情。

任何幫助,將不勝感激。

將用戶(或用戶 ID)傳遞給您的 BackingBean 的常用方法是使用以下選項之一:

http://www.mkyong.com/jsf2/4-ways-to-pass-parameter-from-jsf-page-to-backing-bean/

我認為主要問題是您的 bean 是@RequestScoped 如果您按下編輯頁面上的保存按鈕,您將發送一個新請求,因此將創建請求范圍 bean 的新實例。 只需將您的 bean 更改為@ViewScoped

更多信息:

我試圖將其更改為 ViewScoped,但每次訪問屬性時,它最終都會為 bean“調用構造函數”...

與此同時,我嘗試了很多東西,但沒有任何效果:

我可以讓它工作的唯一情況是將控制器設置為“SessionScoped”。 但我認為這不是一個好方法,因為我需要處理“清理”值並導致大量未使用(初始化)的 bean ......

我創建了一個簡單的項目來播放。 這是正在工作的會話范圍版本。 但是如果我改變范圍,我需要在點擊保存按鈕時“重新加載”當前用戶。 如果無法訪問請求參數,我不知道如何實現。

(我嘗試再次使用“表單”傳遞用戶 ID,但隨后我在“第一次”傳遞 ID 時遇到了問題)

這是我的樣本。 (Getter 和 Setter 可用,未提及以保持簡短)

用戶類:

public class User {

   private String firstname;
   private String lastname;

   public User (String f, String l){
       this.firstname = f;
       this.lastname = l;
   }
}

數據庫模擬器:

@Named("dbSimulator")
@SessionScoped
public class DBSimulator implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = 659826879566280911L;

private Map<String, User> data;

public DBSimulator() {
    //Load data
    User u1 = new User("Mickey", "Maus");
    User u2 = new User("Peter", "Pan");

    this.data = new HashMap<String, User>();
    this.data.put("Mickey", u2);
    this.data.put("Max", u1);
}

public List<User> getUserList(){
    List<User> l = new LinkedList<User>();

    for (Map.Entry<String, User> user : data.entrySet()) {
        l.add(user.getValue());
    }

    return l;

}

public void saveUser(User user){
    this.data.put(user.getFirstname(), user);
}
}

用戶管理控制器:

@Named
@SessionScoped
public class UserManagementController implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = -4300851229329827994L;

@Inject
private DBSimulator dbSimulator;

private List<User> users;

public UserManagementController() {
    System.out.println("UserManagementController:construct()");
}

@PostConstruct
public void LoadUsers(){
    this.setUsers(this.dbSimulator.getUserList());
}
}

用戶編輯控制器

@Named
@SessionScoped
public class UserEditController implements Serializable{

/**
 * 
 */
private static final long serialVersionUID = 1867483972880755108L;

@Inject
private DBSimulator dbSimulator;

private User user;

public UserEditController() {
    System.out.println("UserEditController:construct()");
}

public String activateUser(User user){
    this.setUser(user);
    System.out.println("setting User");
    return "userEdit";
}

public String save(){
    //Save user
    this.dbSimulator.saveUser(user);
    return "userManagement";
}

}

最后兩個 XHTML 文件:UserManagement.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core">

<h:head>
<title>Test</title>
</h:head>
<h:body>
    <h:outputText value="Select user to edit." />

    <h:dataTable value="#{userManagementController.users}" var="user">
        <h:column>
            <f:facet name="header">Firstname</f:facet>
            <h:outputText value="#{user.firstname}" />
        </h:column>

        <h:column>
            <f:facet name="header">Lastname</f:facet>
            <h:outputText value="#{user.lastname}" />
        </h:column>

        <h:column>
            <f:facet name="header">Options</f:facet>
            <h:form>
                <h:commandLink action="userEdit" actionListener="#{userEditController.activateUser(user)}" value="edit user" />
            </h:form>
        </h:column>
    </h:dataTable>
</h:body>
</html>

用戶編輯.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core">


<h:head>
<title>Test</title>
</h:head>
<h:body>
    <h:form>
        <h:inputText value="#{userEditController.user.firstname}"></h:inputText>
        <br /><br />
        <h:inputText value="#{userEditController.user.lastname}"></h:inputText>
        <br /><br />
        <h:commandButton value="save" action="#{userEditController.save}"></h:commandButton>
    </h:form>

</h:body>
</html>

ps.:我不希望任何人“糾正”我的代碼——但也許有人能夠看到完整的例子,我的頭飾來自哪里:)

使用 ViewScoped Bean 會生成以下控制台輸出:

[pageload]
12:07:49,126 INFO  [stdout] (http--0.0.0.0-8090-3) UserManagementController:construct()
12:07:49,334 INFO  [stdout] (http--0.0.0.0-8090-3) UserManagementController:construct()
12:07:49,341 INFO  [stdout] (http--0.0.0.0-8090-3) UserManagementController:construct()
[edit click]
12:08:35,410 INFO  [stdout] (http--0.0.0.0-8090-3) UserManagementController:construct()
12:08:35,411 INFO  [stdout] (http--0.0.0.0-8090-3) UserManagementController:construct()
12:08:35,412 INFO  [stdout] (http--0.0.0.0-8090-3) UserManagementController:construct()
12:08:35,413 INFO  [stdout] (http--0.0.0.0-8090-3) UserManagementController:construct()
12:08:35,414 INFO  [stdout] (http--0.0.0.0-8090-3) UserManagementController:construct()
12:08:35,414 INFO  [stdout] (http--0.0.0.0-8090-3) UserManagementController:construct()
12:08:35,415 INFO  [stdout] (http--0.0.0.0-8090-3) UserManagementController:construct()
12:08:35,416 INFO  [stdout] (http--0.0.0.0-8090-3) UserManagementController:construct()
12:08:35,416 INFO  [stdout] (http--0.0.0.0-8090-3) UserManagementController:construct()
12:08:35,417 INFO  [stdout] (http--0.0.0.0-8090-3) UserManagementController:construct()
12:08:35,476 INFO  [stdout] (http--0.0.0.0-8090-3) UserEditController:construct()
12:08:35,478 INFO  [stdout] (http--0.0.0.0-8090-3) setting User
12:08:35,494 INFO  [stdout] (http--0.0.0.0-8090-3) UserEditController:construct()
12:08:35,497 INFO  [stdout] (http--0.0.0.0-8090-3) UserEditController:construct()

顯然用戶不再設置,因為(ViewScoped)UserEditController在設置用戶后已經重建了兩次......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM