我试图创建一个JSF页面,用户可以在其中选择两个selectOneMenu组件中的值。然后,这些选择中的值将传递到SQL查询以更新页面上显示的表。

我已经将每个选择项绑定到支持Bean中的适当变量,但是在更改了selectOneMenu中选择的值之后,支持Bean中的bound属性不会更改,并且查询将被执行但不返回任何内容结果。 (顺便说一句,在最初显示页面时,吸气剂也似乎被调用了两次)。

我不能将任何其他第三方组件(例如RichFaces等)用于此实现。

对此有任何见识,不胜感激!

这是代码:

notes.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
    <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
      <title></title>
 </head>
<body>

<f:view>

<h:form id="notelistform">
    <f:subview id="loginbar">
        <jsp:include page="/jsp/loginbar.jsp" />
    </f:subview>

    <h:outputText value="Worktype:" />
    <h:selectOneMenu value="#{pc_noteListBacker.worktype}"
        title="worktype" id="worktypeList" onchange="submit()">
        <f:selectItems value="#{pc_noteListBacker.selectWorktypes}" />
        <f:valueChangeListener
            type="<package>.web.backer.note.NoteListBacker" />

    </h:selectOneMenu>

    <h:outputText value="Product:" />
    <h:selectOneMenu value="#{pc_noteListBacker.product}" title="product"
        id="productList" onchange="submit()">
        <f:selectItems value="#{pc_noteListBacker.selectProducts}" />
        <f:valueChangeListener
            type="<package>.web.backer.note.NoteListBacker" />
    </h:selectOneMenu>


    <h:dataTable id="notelisttable" value="#{pc_noteListBacker.noteList}"
        var="item" bgcolor="#F1F1F1" border="10" cellpadding="5"
        cellspacing="3" first="0" width="80%" dir="LTR" frame="hsides"
        rules="all" summary="Status and notes note table display."
        binding="#{pc_noteListBacker.noteListTable}">


        <h:column>
            <f:facet name="header">
                <h:outputText value="Note ID" />
            </f:facet>
            <h:outputText value="#{item.noteId}"></h:outputText>
        </h:column>


        <h:column>
            <f:facet name="header">
                <h:outputText value="Note Category" />
            </f:facet>
            <h:outputText value="#{item.noteCategory}"></h:outputText>
            <f:facet name="footer">
                <h:commandButton value="Add" action="#{pc_noteListBacker.insert}">
                </h:commandButton>
            </f:facet>
        </h:column>

        <h:column>
            <f:facet name="header">
                <h:outputText value="Note Subcategory" />
            </f:facet>
            <h:outputText value="#{item.noteSubCategory}"></h:outputText>
        </h:column>


        <h:column>
            <f:facet name="header">
                <h:outputText value="Note" />
            </f:facet>
            <h:outputText value="#{item.note}"></h:outputText>
        </h:column>



        <h:column>
            <h:commandButton value="Edit" action="#{pc_noteListBacker.edit}">
            </h:commandButton>
        </h:column>
        <h:column>
            <h:commandButton value="Delete" action="#{pc_noteListBacker.delete}"></h:commandButton>
        </h:column>
    </h:dataTable>

</h:form>







NoteListBacker.java

 package <package>.web.backer.note;

 import java.util.List;
 import java.util.ArrayList;

 import javax.faces.component.UIComponent;
 import javax.faces.component.UIComponentBase;
 import javax.faces.component.UIData;
 import javax.faces.context.FacesContext;
 import javax.faces.event.AbortProcessingException;
 import javax.faces.event.ValueChangeEvent;
 import javax.faces.event.ValueChangeListener;
 import javax.faces.model.ListDataModel;
 import javax.faces.model.SelectItem;
 import javax.swing.JOptionPane;


 public class NoteListBacker implements ValueChangeListener {

private UIData noteListTable;

private Note note;

private NoteCategory noteCategory;

private NoteSubCategory noteSubCategory;

private NoteDao nDao;

private SybaseSqlDao sybaseDao;

private List<Note> noteList;

private List<SelectItem> selectWorktypes;

private List<SelectItem> selectProducts;

private String worktype;

private List<String> worktypeList;

private String product;

private List<Product> productList;

private int noteId;

public NoteListBacker() {

    nDao = new NoteDao();
    sybaseDao = new SybaseSqlDao();
    selectWorktypes = new ArrayList<SelectItem>();
    selectProducts = new ArrayList<SelectItem>();
    noteList = new ArrayList<Note>();
    note = new Note();
    worktypeList = new ArrayList<String>();
    productList = new ArrayList<Product>();
}

public String insert() {
    return "success";
}

public String save() {
    return "notes";
}

public String edit() {
    return "success";
}

public String update() {
    return "notes";
}

public String delete() {
    Note delNote = (Note) noteListTable.getRowData();
    nDao.deleteNote(delNote);
    return "notes";
}

public String cancel() {
    return "notes";
}

public Note getNote() {
    return note;
}

public void setNote(Note note) {
    this.note = note;
}

public NoteDao getNDao() {
    return nDao;
}

public UIData getNoteListTable() {
    return noteListTable;
}

public void setNoteListTable(UIData noteListTable) {
    this.noteListTable = noteListTable;
}

public List<Note> getNoteList() {


    noteList = nDao.selectNotes(worktype, product); //
    return noteList;
}

public void setNoteList(List<Note> noteList) {
    this.noteList = noteList;
}

public void setNDao(NoteDao dao) {
    nDao = dao;
}

public String getProduct() {
    return product;
}

public void setProduct(String product) {
    this.product = product;
}

public String getWorktype() {
    return worktype;
}

public void setWorktype(String worktype) {
    this.worktype = worktype;
}

public NoteCategory getNoteCategory() {
    return noteCategory;
}

public void setNoteCategory(NoteCategory noteCategory) {
    this.noteCategory = noteCategory;
}

public NoteSubCategory getNoteSubCategory() {
    return noteSubCategory;
}

public void setNoteSubCategory(NoteSubCategory noteSubCategory) {
    this.noteSubCategory = noteSubCategory;
}

public int getNoteId() {
    return noteId;
}

public void setNoteId(int noteId) {
    this.noteId = noteId;
}

public SybaseSqlDao getSybaseDao() {
    return sybaseDao;
}

public void setSybaseDao(SybaseSqlDao sybaseDao) {
    this.sybaseDao = sybaseDao;
}

public List<SelectItem> getSelectWorktypes() {
    selectWorktypes.clear();

    worktypeList = this.getWorktypeList();

    for (String strt : worktypeList) {

        SelectItem si = new SelectItem();
        si.setValue(strt);
        si.setLabel(strt);
        si.setDescription(strt);
        selectWorktypes.add(si);
    }

    return selectWorktypes;
}

public void setSelectWorktypes(List<SelectItem> selectWorktypes) {

    this.selectWorktypes = selectWorktypes;
}

public List<String> getWorktypeList() {

    worktypeList = sybaseDao.selectWorktypes();
    return worktypeList;
}

public void setWorktypeList(List<String> worktypeList) {
    this.worktypeList = worktypeList;
}

public List<Product> getProductList() {

    productList = sybaseDao.selectProducts();
    return productList;
}

public void setProductList(List<Product> productList) {
    this.productList = productList;
}

public List<SelectItem> getSelectProducts() {
    selectProducts.clear();

    productList = this.getProductList();

    for (Product prod : productList) {

        SelectItem si = new SelectItem();
        si.setValue(prod);
        si.setLabel(prod.toString());
        si.setDescription(prod.toString());
        selectProducts.add(si);
    }

    return selectProducts;
}

public void setSelectProducts(List<SelectItem> selectProducts) {
    this.selectProducts = selectProducts;
}

public void processValueChange(ValueChangeEvent arg0) {

    if (arg0.getComponent().getId().equalsIgnoreCase("productList")) {
        this.setProduct(arg0.getNewValue().toString());

    }
    if (arg0.getComponent().getId().equalsIgnoreCase("worktypeList")) {
        this.setWorktype(arg0.getNewValue().toString());
    }

}

 }


faces-config.xml

 <?xml version="1.0"?>

 <!DOCTYPE faces-config PUBLIC
   "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"
   "http://java.sun.com/dtd/web-facesconfig_1_0.dtd">

 <faces-config>

<lifecycle>
    <phase-listener>
        <package>.utils.NoCachePhaseListener
    </phase-listener>
</lifecycle>

<managed-bean>
    <managed-bean-name>pc_userBacker</managed-bean-name>
    <managed-bean-class>
        <package>.web.backer.UserBacker
    </managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
</managed-bean>

<managed-bean>
    <managed-bean-name>pc_noteCategoryListBacker</managed-bean-name>
    <managed-bean-class>
        <package>.web.backer.note.NoteCategoryListBacker
    </managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

<managed-bean>
    <managed-bean-name>
        pc_noteSubCategoryListBacker
    </managed-bean-name>
    <managed-bean-class>
        <package>.web.backer.note.NoteSubCategoryListBacker
    </managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

<managed-bean>
    <managed-bean-name>pc_noteListBacker</managed-bean-name>
    <managed-bean-class>
        <package>.web.backer.note.NoteListBacker
    </managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
</managed-bean>

<managed-bean>
    <managed-bean-name>pc_statusListBacker</managed-bean-name>
    <managed-bean-class>
        <package>.web.backer.status.StatusListBacker
    </managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

<managed-bean>
    <managed-bean-name>pc_statusReasonBacker</managed-bean-name>
    <managed-bean-class>
        <package>.web.backer.status.StatusReasonBacker
    </managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>


<!-- Notes -->
<navigation-rule>
    <from-view-id>/jsp/notes/notes.jsp</from-view-id>
    <navigation-case>
        <from-action>#{pc_noteListBacker.edit}</from-action>
        <from-outcome>success</from-outcome>
        <to-view-id>/jsp/notes/noteedit.jsp</to-view-id>
    </navigation-case>
    <navigation-case>
        <from-action>#{pc_noteListBacker.insert}</from-action>
        <from-outcome>success</from-outcome>
        <to-view-id>/jsp/notes/notenew.jsp</to-view-id>
    </navigation-case>


</navigation-rule>


<!-- Note Categories -->
<navigation-rule>
    <from-view-id>/jsp/notes/notecategories.jsp</from-view-id>
    <navigation-case>
        <from-action>#{pc_noteCategoryListBacker.edit}</from-action>
        <from-outcome>success</from-outcome>
        <to-view-id>/jsp/notes/notecategoryedit.jsp</to-view-id>
    </navigation-case>
    <navigation-case>
        <from-action>
            #{pc_noteCategoryListBacker.insert}
        </from-action>
        <from-outcome>success</from-outcome>
        <to-view-id>/jsp/notes/notecategorynew.jsp</to-view-id>
    </navigation-case>


</navigation-rule>

<!-- Note Subcategories -->
<navigation-rule>
    <from-view-id>/jsp/notes/notesubcategories.jsp</from-view-id>
    <navigation-case>
        <from-action>
            #{pc_noteSubCategoryListBacker.edit}
        </from-action>
        <from-outcome>success</from-outcome>
        <to-view-id>/jsp/notes/notesubcategoryedit.jsp</to-view-id>
    </navigation-case>
    <navigation-case>
        <from-action>
            #{pc_noteSubCategoryListBacker.insert}
        </from-action>
        <from-outcome>success</from-outcome>
        <to-view-id>/jsp/notes/notesubcategorynew.jsp</to-view-id>
    </navigation-case>
</navigation-rule>

<!-- Statuses -->
<navigation-rule>
    <from-view-id>/jsp/statuses/statuses.jsp</from-view-id>
    <navigation-case>
        <from-action>#{pc_statusListBacker.edit}</from-action>
        <from-outcome>success</from-outcome>
        <to-view-id>/jsp/statuses/statusedit.jsp</to-view-id>
    </navigation-case>
    <navigation-case>
        <from-action>#{pc_statusListBacker.insert}</from-action>
        <from-outcome>success</from-outcome>
        <to-view-id>/jsp/statuses/statusnew.jsp</to-view-id>
    </navigation-case>
</navigation-rule>

<!-- Status Reasons -->
<navigation-rule>
    <from-view-id>/jsp/statuses/statusreasons.jsp</from-view-id>
    <navigation-case>
        <from-action>#{pc_statusReasonBacker.edit}</from-action>
        <from-outcome>success</from-outcome>
        <to-view-id>/jsp/statuses/statusreasonedit.jsp</to-view-id>
    </navigation-case>
    <navigation-case>
        <from-action>#{pc_statusReasonBacker.insert}</from-action>
        <from-outcome>success</from-outcome>
        <to-view-id>/jsp/statuses/statusreasonnew.jsp</to-view-id>
    </navigation-case>
</navigation-rule>

<!-- static and general actions-->
<!-- what page the action is coming from doesn't matter here -->
<navigation-rule>

    <navigation-case>
        <from-outcome>login</from-outcome>
        <to-view-id>/login.jsp</to-view-id>
    </navigation-case>

    <navigation-case>
        <from-outcome>menu</from-outcome>
        <to-view-id>/menu.jsp</to-view-id>
    </navigation-case>

    <!-- Notes -->
    <navigation-case>
        <from-outcome>notes</from-outcome>
        <to-view-id>/jsp/notes/notes.jsp</to-view-id>
    </navigation-case>


    <!-- Note Categories -->
    <navigation-case>
        <from-outcome>notecategories</from-outcome>
        <to-view-id>/jsp/notes/notecategories.jsp</to-view-id>
    </navigation-case>

    <!-- Note Subcategories -->
    <navigation-case>
        <from-outcome>notesubcategories</from-outcome>
        <to-view-id>/jsp/notes/notesubcategories.jsp</to-view-id>
    </navigation-case>

    <!-- Statuses -->
    <navigation-case>
        <from-outcome>statuses</from-outcome>
        <to-view-id>/jsp/statuses/statuses.jsp</to-view-id>
    </navigation-case>



    <!-- Status Reasons -->
    <navigation-case>
        <from-outcome>statusreasons</from-outcome>
        <to-view-id>/jsp/statuses/statusreasons.jsp</to-view-id>
    </navigation-case>


</navigation-rule>
 </faces-config>

最佳答案

我只看了一下代码,但我猜问题的一部分可能在这里:

public void processValueChange(ValueChangeEvent arg0) {
        if (arg0.getComponent().getId().equalsIgnoreCase("productList")) {
                this.setProduct(arg0.getNewValue().toString());

        }
        if (arg0.getComponent().getId().equalsIgnoreCase("worktypeList")) {
                this.setWorktype(arg0.getNewValue().toString());
        }
}


如果您阅读valueChangeListener type属性的文档,则会显示以下内容:


  要创建和注册的ValueChangeListener的标准Java类名称。


这意味着您将至少拥有三个<package>.web.backer.note.NoteListBacker实例-两个实例创建为侦听器,第三个实例创建为托管bean。最后一个是表绑定到的唯一一个,并且侦听器中的任何状态更改都不相关。

修理:


没有NoteListBacker实现ValueChangeListener;无关紧要。
可以将selectOneMenuvalueChangeListener属性绑定到#{pc_noteListBacker.valueChange}方法(有关详细信息,请参见文档),也可以使用单独的ValueChangeListener实现,该实现直接使用pc_noteListBacker从会话中查找FacesContext

关于java - 根据selectOneMenu值更新JSF数据表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1590484/

10-12 01:27