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");
}
}