Need help with <h:selectOneMenu> and valueChangeListener
asookazian Sep 1, 2007 2:16 AMUsing JBoss 4.0.5 and Seam 1.2.1.GA.
In the below .xhtml file, the valueChangeListener="#{userRoleSearch.processValueChange}" does not fire the public processValueChange method in my SFSB when the commented <s:div> and </s:div> tags around it are uncommented. It does execute when the tags are commented. In either case, the drop-down is rendered.
Why does this happen? I experienced the same thing with the <s:fragment> tag. Any help would be greatly appreciated...
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:s="http://jboss.com/products/seam/taglib" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:rich="http://richfaces.ajax4jsf.org/rich" template="layout/template.xhtml"> <ui:define name="body"> <h:messages globalOnly="true" styleClass="message"/> <rich:panel> <h:form> <h:outputText id="userRoleInfo" value="User-Role Information"/><br/> <h:outputText id="firstName" value="First Name:"/> <h:outputText id="lastName" value="Last Name:"/><br/> <h:inputText id="inputFirstName" value="#{userRoleSearch.searchStringFirstName}"/> <h:inputText id="inputLastName" value="#{userRoleSearch.searchStringLastName}"/> <h:commandButton id="searchButton" value="Search" action="#{userRoleSearch.getUsers}"/> <h:commandButton id="resetButton" value="Reset" type="reset"/><br/><br/> <h:outputText value="No Users Found" rendered="#{userRoleSearch.isDisplay and userRoleSearch.rowCount==0}"/> <!-- <s:div id="selectUserDD" rendered="#{userRoleSearch.isDisplay and userRoleSearch.rowCount>0}"> --> <h:outputText value="Select a user:"/> <h:selectOneMenu id="userFnameLname" valueChangeListener="#{userRoleSearch.processValueChange}" onchange="submit()"> <f:selectItems value="#{userRoleSearch.populateUsers}"/> </h:selectOneMenu><br/><br/> <!-- </s:div> --> <s:div id="selectRoleCheckBox" rendered="#{!empty userRoleSearch.currentUserId}"> <h:selectManyCheckbox id="userRoles"> <f:selectItems value="#{userRoleSearch.userRoles}"/> </h:selectManyCheckbox> </s:div> <s:link id="viewUserRoleSummary" value="View User-Role Summary" view="/filterRoles.xhtml"/> </h:form> </rich:panel> </ui:define> </ui:composition>
SFSB:
package com.cox.beans.session; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import javax.ejb.Remove; import javax.ejb.Stateful; import javax.faces.context.FacesContext; import javax.faces.event.ValueChangeEvent; import org.apache.log4j.Logger; import org.jboss.seam.annotations.Destroy; import org.jboss.seam.annotations.In; import org.jboss.seam.annotations.Name; @Stateful @Name("userRoleSearch") public class UserRoleSearchSFSB implements UserRoleSearchSFSBLocal { private String searchStringFirstName = ""; private String searchStringLastName = ""; private String currentUserId = ""; private boolean isDisplay = false; private ResultSet rs = null; private CallableStatement cstmt = null; private Connection con = null; private HashMap<String, String> hm = null; private HashMap<String, String> hm2 = null; Logger log = Logger.getLogger(this.getClass()); int rowCount = 0; public void getUsers() { log.info("getUsers(): searchStringFirstName = " + searchStringFirstName); log.info("getUsers(): searchStringLastName = " + searchStringLastName); try { String url = "jdbc:sqlserver://CORG0DV01:1433;databaseName=JavaTestDB"; con = DriverManager.getConnection(url, "_AppUser_JavaTestAcct", "JavaTestAcct"); cstmt = con.prepareCall("{call usp_u_adm_select_UserList(?, ?)}"); cstmt.setString(1, searchStringFirstName); cstmt.setString(2, searchStringLastName); rs = cstmt.executeQuery(); log.info("rs.next() = " + rs.next()); hm = new HashMap<String, String>(); while(rs.next()) { hm.put(rs.getString("UserID"), rs.getString("Name")); String name = rs.getString("Name"); log.info("getUsers(): name = " + name); String UserID = rs.getString("UserID"); log.info("getUsers(): UserID = " + UserID); rowCount++; } log.debug("in getUsers: rowCount = " + rowCount); } catch(Exception e) { e.printStackTrace(); } finally { this.cleanUp(); } //search button clicked so set isDisplay to false so <div> in adminUserRoles.xhtml can check for display purposes isDisplay = true; } public HashMap getPopulateUsers() { log.info("getPopulateUsers(): searchStringFirstName = " + searchStringFirstName); log.info("getPopulateUsers(): searchStringLastName = " + searchStringLastName); try { String url = "jdbc:sqlserver://CORG0DV01:1433;databaseName=JavaTestDB"; Connection con = DriverManager.getConnection(url, "_AppUser_JavaTestAcct", "JavaTestAcct"); if (con == null) { log.debug("con is null"); } cstmt = con.prepareCall("{call usp_u_adm_select_UserList(?, ?)}"); cstmt.setString(1, searchStringFirstName); cstmt.setString(2, searchStringLastName); rs = cstmt.executeQuery(); log.debug("rs.getRow() = " + rs.getRow()); hm = new HashMap<String, String>(); while(rs.next()) { hm.put(rs.getString("Name"), rs.getString("UserID")); String name = rs.getString("Name"); log.info("getPopulateUsers(): name = " + name); String UserID = rs.getString("UserID"); log.info("getPopulateUsers(): UserID = " + UserID); } } catch(Exception e) { e.printStackTrace(); } finally { this.cleanUp(); } return hm; } public HashMap getUserRoles() { log.info("in getUserRoles()"); if(hm2==null) { log.info("damn thing is null"); } return hm2; } public void processValueChange(ValueChangeEvent value) { log.info("begin processValueChange()"); currentUserId = (String)value.getNewValue(); log.info("processValueChange(): currentUserId = " + currentUserId); try { String url = "jdbc:sqlserver://CORG0DV01:1433;databaseName=JavaTestDB"; Connection con = DriverManager.getConnection(url, "_AppUser_JavaTestAcct", "JavaTestAcct"); cstmt = con.prepareCall("{call usp_u_adm_select_UserRole(?)}"); cstmt.setString(1, currentUserId); rs = cstmt.executeQuery(); hm2 = new HashMap<String, String>(); while(rs.next()) { hm2.put(rs.getString("Name"), rs.getString("IsChecked")); String name = rs.getString("Name"); log.info("getUserRoles(): name = " + name); String isChecked = rs.getString("IsChecked"); log.info("getUserRoles(): IsChecked = " + isChecked); } log.info("processValueChange(): rowCount = " + rowCount); } catch(Exception e) { e.printStackTrace(); } finally { this.cleanUp(); } } public String getCurrentUserId() { log.info("in getCurrentUserId: currentUserId = " + currentUserId); return currentUserId; } public void setCurrentUserId(String currentUserId) { log.info("in setCurrentUserId: currentUserId = " + currentUserId); this.currentUserId = currentUserId; } public String getSearchStringFirstName() { return searchStringFirstName; } public void setSearchStringFirstName(String searchStringFirstName) { log.info("in setSearchStringFirstName"); this.searchStringFirstName = searchStringFirstName; } public String getSearchStringLastName() { return searchStringLastName; } public void setSearchStringLastName(String searchStringLastName) { log.info("in setSearchStringLastName"); this.searchStringLastName = searchStringLastName; } public boolean getIsDisplay() { log.info("in getIsDisplay: isDisplay = " + this.isDisplay); return this.isDisplay; } public int getRowCount() { log.info("in getRowCount: rowCount = " + rowCount); return rowCount; } private void cleanUp() { try { if (rs != null) rs.close(); if (cstmt != null) cstmt.close(); if (con != null) con.close(); } catch(SQLException e) { e.printStackTrace(); } } @Remove @Destroy public void destroy() { log.info("destroy() called"); } }