【问题标题】:Wizard Component PrimeFaces Updating other variables向导组件 PrimeFaces 更新其他变量
【发布时间】:2013-04-01 09:44:00
【问题描述】:

我有两个标签。 使用向导组件,当我按下“下一步”按钮(从第一个选项卡)时,我需要填充一个列表(带有 SelectItem 对象),然后在第二个选项卡的 SelectOneMenu 标记中显示这些 SelectItems。我很快就在第一个选项卡上完成了输入数据,然后按“下一步”按钮,这个 SelectOneMenu 标记(在第二个选项卡上)没有任何内容。

基本上,我需要在处理当前选项卡的同时更新下一个选项卡。无论如何要这样做?

提前致谢。

这是我的代码:

<p:wizard widgetVar="wiz" showNavBar="true" flowListener="#{detentionForm.onFlowProcess}">
                <p:tab id="typeOfLeader" title="Leader Selection">
                    <p:panel header="Leader Selection">
                        <p:messages showSummary="true" showDetail="false"/>
                        <p:panelGrid columns="2">
                            #{msgs.typeOfLeaderPunishment}
                            <p:selectOneMenu value="#{detentionForm.typeOfLeaderSelectedID}" style="width:400px" panelStyle="width:150px" effect="fade">
                                <f:selectItems value="#{detentionForm.teacherTypes}" var="type" itemLabel="#{type.label}" itemValue="#{type.value}" />
                            </p:selectOneMenu>
                        </p:panelGrid> 
                    </p:panel>
                </p:tab>
                <p:tab id="typeOfPunishment" title="Punishment Type">
                    <p:panel header="Type of Punishment">
                        <p:panelGrid columns="2">
                            #{msgs.typeOfDetention}
                            <p:selectOneMenu value="#{detentionForm.typeOfPunishment}" style="width:400px" panelStyle="width:150px" effect="fade" >
                                <f:selectItems value="#{detentionForm.detentionTypes}" var="type" itemLabel="#{type.label}" itemValue="#{type.value}" />
                            </p:selectOneMenu> 
                        </p:panelGrid>

                    </p:panel>
                </p:tab>

            </p:wizard>

#{detentionForm.detentionTypes} 是一个数组列表,一旦我按下“下一步”按钮到第二个选项卡,就需要填充它。


这是我的支持 bean:

@ViewScoped
@Named("detentionForm")
public class DetentionFormBean implements Serializable{
    @Resource(name="jdbc/DetentionCentre")
    private DataSource ds;

    private Details details = (Details) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("userDetails");



    private String typeOfPunishment;
    private String typeOfLeader = details.getTypeOfLeader(); //Can change if user is House Leader. Eg. They can become a teacher when making a punishment
    private int typeOfLeaderID; //ID in the database of the teacher's type of leadership
    private int typeOfLeaderSelectedID = 1; //Set default to teacher as House leader can be teacher and normal teacher will be a teacher!
    private ArrayList<SelectItem> detentionTypes = new ArrayList<SelectItem>(); //SelectItem objects that shows what punishments each teacher can do
    private ArrayList<SelectItem> teacherTypes = new ArrayList<SelectItem>(); //SelectItem objects that shows what type of leadership a teacher can be (Teacher or House Leader)


    //gets all the data necessary from the database to show on the page
    @PostConstruct
    public void initialize(){
        this.setTypeOfLeaderID(details.getUserName()); //gets the ID from the database to find out the default type of leadership
        this.findTeacherTypes(this.typeOfLeader); 
    } 

    public String onFlowProcess(FlowEvent event) {  //change later for backing as well >>>>>>>>>>>>>>
            String stepToGo = event.getNewStep();
            if(stepToGo.equals("typeOfPunishment")){
                this.findDetentionTypes();

            }
        return stepToGo;

    }

    //populates teacherType Arraylist depending the user's teacher type. House Leader can be a Teacher or a House Leader.
    private void findTeacherTypes(String type) {
        if(type.equals("House Leadership Team")){
            this.teacherTypes.add(new SelectItem(Integer.toString(this.typeOfLeaderID), type)); //House leader is 2
            this.teacherTypes.add(new SelectItem(Integer.toString(this.typeOfLeaderID - 1), "Teacher" )); //Teacher is 1
        }else{ //type is Teacher
            this.teacherTypes.add(new SelectItem(Integer.toString(this.typeOfLeaderID), type)); //Teacher is 1
        }
    }


    //populates detentiontypes depending on type of leader
    private void findDetentionTypes() {
        System.out.println(">>>>Inside findDetentionTypes()!!!");
        PreparedStatement ps;
        Connection con;
        String sqlInitialData = "SELECT r.punishment_type, p.type FROM detentioncentredb.tbl_teacher_roles_allowed_punishments r, detentioncentredb.tbl_punishment_types p WHERE r.teacher_roles = ? AND p.ID = r.punishment_type";
        ResultSet rs;

        try {
            con = ds.getConnection();
            ps = con.prepareStatement(sqlInitialData);
            ps.setString(1, Integer.toString(this.typeOfLeaderSelectedID)); 
            rs = ps.executeQuery();
            while(rs.next()){
                SelectItem s = new SelectItem(rs.getString("punishment_type"), rs.getString("type"));
                this.detentionTypes.add(s);
            }
            rs.close();
            ps.close();
            con.close();

        } catch (SQLException ex) {
            Logger.getLogger(DetentionFormBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    //getter and setter methods

    public String getTypeOfPunishment() {
        return typeOfPunishment;
    }

    public void setTypeOfPunishment(String typeOfPunishment) {
        this.typeOfPunishment = typeOfPunishment;
    }

    public String getTypeOfLeader() {
        return typeOfLeader;
    }

    public ArrayList<SelectItem> getDetentionTypes() {
        return detentionTypes;
    }

    public ArrayList<SelectItem> getTeacherTypes() {
        return teacherTypes;
    }

    public int getTypeOfLeaderID() {
        return typeOfLeaderID;
    }

    //gets the typeOfLeader the current user is from the database. This retrieves the ID of the teacher's type of leadership. NOT WHAT THE TEACHER SELECTED.
    private void setTypeOfLeaderID(int userName){
        PreparedStatement ps;
        Connection con;
        String sqlTypeOfLeaderID = "SELECT TypeOfLeader FROM detentioncentredb.tbl_teachers WHERE RegNumber = ?";
        ResultSet rs;
        try {
            con = ds.getConnection();
            ps = con.prepareStatement(sqlTypeOfLeaderID);
            ps.setInt(1, userName);
            rs = ps.executeQuery();
            while(rs.next()){
                this.typeOfLeaderID = rs.getInt("TypeOfLeader");
            }
            rs.close();
            ps.close();
            con.close();
        } catch (SQLException ex) {
            Logger.getLogger(DetentionFormBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public int getTypeOfLeaderSelectedID() {
        return typeOfLeaderSelectedID;
    }

    public void setTypeOfLeaderSelectedID(int typeOfLeaderSelectedID) {
        this.typeOfLeaderSelectedID = typeOfLeaderSelectedID;
    }


}

【问题讨论】:

  • primeface 的版本是什么?我正在使用 v4.0RC1,并且在 onFlowProcess() 中所做的所有更改都会更新。

标签: java jsf primefaces updates wizard


【解决方案1】:

您可以使用 ajax 通知服务器端您正在进入向导。来自PF documentation

如果您希望在向导尝试后退或前进时在服务器端收到通知,请定义 flowListener

<p:wizard flowListener="#{userWizard.handleFlow}">
...
</p:wizard>

public String handleFlow(FlowEvent event) {
    String currentStepId = event.getCurrentStep();
    String stepToGo = event.getNextStep();
    if(skip)
        return "confirm";
    else
        return event.getNextStep();
    }

在您的情况下,您需要在stepToGo 达到typeOfPunishment 时加载detentionTypes 数组,具体取决于用户在向导第一步中选择的内容:

public String handleFlow(FlowEvent event) {
    String stepToGo = event.getNextStep();
    if(stepToGo.equals("typeOfPunishment")){
        detentionTypes = service.loadDetentionTypes(this.TypeOfLeaderSelectedID);
    }
}

【讨论】:

  • 是的,我试过了。它填充列表,但不更新页面,因此 SelectOnempMenu 中没有任何内容。这就是我遇到的问题。
  • 您能发布您的支持 bean 代码吗?特别是您在流侦听器方法中所做的事情。您还应该调试该方法并查看数组中的值。
  • 在问题中添加了后面的 bean 代码。我已经完全按照你对那个流量监听器所说的做了。我已经调试了应用程序,我看到我的detentionTypes arraylist 正在被填充。但是,下一个选项卡不会再次呈现以使用该填充的数组列表。
  • 我注意到那里有问题。我没有使用p:wizard 标记,但是当您返回不是null 或支持bean 中的空字符串时,JSF 2 @ViewScoped bean are destroyed。所以这可能是你的handleFlow 方法的问题,你返回向导的下一步,bean 正在重建,所以你失去了你的价值观。作为一种解决方案,您可以尝试在触发第一个组合的 change 事件时加载您的值,并摆脱 handleFlow 方法。
  • 感谢您的回复。但它仍然没有更改下一个选项卡中的下一个 selectOneMenu 标记。我在第一个 selectOneMenu 标记中使用了一个 ajax 标记,并在一个加载值的侦听器中插入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多