• Post Reply Bookmark Topic Watch Topic
  • New Topic
programming forums Java Mobile Certification Databases Caching Books Engineering Micro Controllers OS Languages Paradigms IDEs Build Tools Frameworks Application Servers Open Source This Site Careers Other Pie Elite all forums
this forum made possible by our volunteer staff, including ...
Marshals:
  • Campbell Ritchie
  • Jeanne Boyarsky
  • Ron McLeod
  • Paul Clapham
  • Liutauras Vilda
Sheriffs:
  • paul wheaton
  • Rob Spoor
  • Devaka Cooray
Saloon Keepers:
  • Stephan van Hulst
  • Tim Holloway
  • Carey Brown
  • Frits Walraven
  • Tim Moores
Bartenders:
  • Mikalai Zaikin

JSF h:selectOneMenu concern

 
Greenhorn
Posts: 17
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Hi, guys. Could you please help me with JSF h:selectOneMenu? Huge thanks in advance. I am a newbie to JSF, but I write a tool using it. I Have to extract projectStatuses from Database and display it.
I successfully managed to do it. But when I try to bind the value projectStatus, which will be selected by a user in browser, the method setProjectStatus(String projectStatus) is never invoked.

Here is my Backig Bean for JSF:

public class SubmitReport {
...
private String projectStatus;
...
private ArrayList<SelectItem> projectStatuses;
...

public ArrayList<SelectItem> getProjectStatuses() {
return projectStatuses = extractAllProjectStatusesFromDB();
}
public void setProjectStatuses(ArrayList<SelectItem> projectStatuses) {
this.projectStatuses = projectStatuses;
}

public String getProjectStatus() {
return projectStatus;
}
public void setProjectStatus(String projectStatus) {
this.projectStatus = projectStatus;
}

Here's part of my submit.jsp:

<h:selectOneMenu id="projectStatus" value="#{SubmitReport.projectStatus}"
styleClass="common-dropdown" immediate="true">
<f:selectItems value="#{SubmitReport.projectStatuses}"/>
</h:selectOneMenu>

faces-config.xml is OK, as I successfully retreived the logged in user's projects from DB and displayed them. Please, I NEED help!!
 
Ranch Hand
Posts: 50
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
This is because you have immediate="true" set. Remove it.
 
Andriy Burachinskiy
Greenhorn
Posts: 17
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Thanks for reply, Smitha. I removed immediate="true", but result is completely same. Besides one more paculiarity:

<h:commandButton value="Submit" id="SubmitCommand" action="#{SubmitReport.submitReport}"
immediate="true"/>

If I remove submit="true", my submitReport() method of SubmitReport backingBean seems never to be invoked.
I appreciate your responses.
 
Smitha H Rao
Ranch Hand
Posts: 50
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
This was one of the problems I used to face during my initial days of JSF learning.
This means there is some problem occuring during some setter operations. When you are keeping the immidiate="true" attribute, the setter method calling will be skipped so your code runs properly.

Please copy the bean and the JSP page. I will try to figureout the problem.

Thanks
Smitha
 
Andriy Burachinskiy
Greenhorn
Posts: 17
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Thanks for helping! Your prompting is very valuable for me.
------------------------------------------------------
-Here is my BackingBean:
------------------------------------------------------
package reportingtool.actions;

import com.sun.jsfcl.app.AbstractPageBean;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.faces.model.SelectItem;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import reportingtool.*;


/**
* This class is primarily intended for automating of processing JSF (JSP) forms &
* values
* @author aburachi
*/
public class SubmitReport extends AbstractPageBean {
private String projectName;
private String projectStatus;
private String week;

private java.sql.Clob repContent;
private String projReportAddNotes;

//the 2 vars highlighted are used in relity
private ArrayList<SelectItem> loggedUserProjects;
private ArrayList<SelectItem> projectStatuses;
private ArrayList<SelectItem> weeks;

public ArrayList<SelectItem> getLoggedUserProjects() {
return loggedUserProjects = extractUserProjectsFromDB();

}
public ArrayList<SelectItem> getProjectStatuses() {
return projectStatuses = extractAllProjectStatusesFromDB();
}
public ArrayList<SelectItem> getWeeks() {
return weeks = extractWeeksFromDB();
}

public void setLoggedUserProjects(ArrayList<SelectItem> loggedUserProjects) {
this.loggedUserProjects = loggedUserProjects;
}
public void setProjectStatuses(ArrayList<SelectItem> projectStatuses) {
this.projectStatuses = projectStatuses;
}
public void setWeeks(ArrayList<SelectItem> weeks) {
this.weeks = weeks;
}

public SubmitReport() {}

public String getProjReportAddNotes() {
return projReportAddNotes;
}
public void setProjReportAddNotes(String projReportAddNotes) {
this.projReportAddNotes = projReportAddNotes;
}
public String getProjectName() {
return projectName;
}
public void setProjectName(String projectName) {
this.projectName = projectName;
}
public String getProjectStatus() {
return projectStatus;
}
public void setProjectStatus(String projectStatus) {
this.projectStatus = projectStatus;
}
public String getWeek() {
return week;
}
public void setWeek(String week) {
this.week = week;
}
public java.sql.Clob getRepContent() {
return repContent;
}
public void setRepContent(java.sql.Clob repContent) {
this.repContent = repContent;
}

public static ArrayList<SelectItem> extractUserProjectsFromDB() {
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session = sessionFactory.openSession();
Integer usrIdStoredInSession = (Integer)Contexts.getSession().getAttribute("userID_stored");
List userProjectsList = session.createQuery(
"FROM Project as p where p.user = " + usrIdStoredInSession).
list();

ArrayList<SelectItem> usrProjectsSelItems = new ArrayList<SelectItem>(userProjectsList.size());
for (int i =0; i < userProjectsList.size(); i++) {
usrProjectsSelItems.add( new SelectItem(userProjectsList.get(i)) );
}
return usrProjectsSelItems;
}

public static ArrayList<SelectItem> extractAllProjectStatusesFromDB() {
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session = sessionFactory.openSession();
List allProjectStatuses = session.createQuery("FROM ProjectStatus as ps")
.list();

ArrayList<SelectItem> projStatusesSelItems = new ArrayList<SelectItem>(allProjectStatuses.size());
for (int i = 0; i < allProjectStatuses.size(); i++) {
projStatusesSelItems.add( new SelectItem(allProjectStatuses.get(i)) );
}
return projStatusesSelItems;
}
public static ArrayList<SelectItem> extractWeeksFromDB() {
//TODO: consider & implement
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session = sessionFactory.openSession();

//get curWeekNumbInYear
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
int aWeek = cal.get(Calendar.WEEK_OF_YEAR);

// currently I extract from DB 2 PREVIOUS weeks => later it should be corrected.
// Here JOIN is needed => check if for current week in WeeklyReport Table
// weekly_rep_send_date is null (it means WeeklyReport, i.e.Email has not
// yet been sent
List weeksList = session.createQuery("FROM Week as w WHERE w.weekId >= '" +
(aWeek - 2) + "' AND w.weekId <= '" + aWeek + "'" ).list();

ArrayList<SelectItem> recentWeeksSelItems = new ArrayList<SelectItem>(weeksList.size());
for (int i = 0; i < weeksList.size(); i++) {
recentWeeksSelItems.add(new SelectItem(weeksList.get(i)) );
}
return recentWeeksSelItems;
}


public String submitReport() {
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session = sessionFactory.openSession();

WeeklyProjectReport wProjReport = new WeeklyProjectReport();
wProjReport = _initWeeklyProjectReportInstanceFields(wProjReport);

return "submit_success";
}

/**
* @param projName, extracted from JSF (exacter JSP's) SelectItem element
* @return
*/
public Project getProjectByItsName () {
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session = sessionFactory.openSession();
List queriedProj = session.createQuery("FROM Project as p WHERE p.projName = '" +
this.projectName + "'").list();
System.out.println(queriedProj.size());
Project projectInst = (Project)queriedProj.get(0);
return projectInst;
}

/**
* @param projStatusName, extracted from JSF (exacter JSP's) SelectItem element
* @return
*/
public ProjectStatus getProjectStatusByItsName() {
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session = sessionFactory.openSession();
List queriedProjStatus = session.createQuery("FROM ProjectStatus as ps WHERE " +
"ps.projStatusName = '" + this.projectStatus + "'").list();
ProjectStatus projectStatusInst = (ProjectStatus)queriedProjStatus.get(0);

return projectStatusInst;
}
public Week getWeekByItsBorders() {
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session = sessionFactory.openSession();

List queriedWeek = session.createQuery("FROM Week as w WHERE w.weekId = '" +
DateHelper.getWeekIdByItsBorders(this.week) + "'").list();
Week weekInstance = (Week)queriedWeek.get(0);
return weekInstance;
}

/**
* Method called only before persisting WeeklyProjectReport instance to DB.
* @param wProjReport is instance, who's fields are to be initialized with values
* from JSF forms
*/
private WeeklyProjectReport _initWeeklyProjectReportInstanceFields(WeeklyProjectReport wProjReport) {

wProjReport.setWProjRepContent(repContent);
wProjReport.setWProjRepNotes(projReportAddNotes );

//projectName is contained in JSF form as SelectItem. SelectItems(projectNames)
//are inserted there from DB
wProjReport.setProject( getProjectByItsName());

//same exactly as projectName(see above)
// wProjReport.setProjectStatus( getProjectStatusByItsName());

// wProjReport.setWeek(this.getWeekByItsBorders());
return wProjReport;
}

}

----------------------------------------
-here is my jsp page:
----------------------------------------
<%--
Document : submit1
Created on : 16.08.2009, 19:15:25
Author : aburachi
--%>

<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<f:view>
<html>
<head>
<title>Submitting Your project activities report</title>
</head>
<body>
<h:form>
<!-- <td> <% //reportingtool.DateHelper.getPreviousWeeksStartEndDate() %> </td> -->
Project: <!-- <option>Gplus Adapter SAP ICI MultiChannel</option> --> <!--in JSF instead of mixing Java code with HTML(for JSP) we do the following:--> <h:selectOneMenu id="projectName" value="#{SubmitReport.projectName}" styleClass="common-dropdown"> <f:selectItems value="#{SubmitReport.loggedUserProjects}"/> </h:selectOneMenu>
weekly project status: <h:selectOneMenu id="projectStatus" value="#{SubmitReport.projectStatus}" styleClass="common-dropdown"> <f:selectItems value="#{SubmitReport.projectStatuses}"/> </h:selectOneMenu>
through: <h:selectOneMenu id="week" value="#{SubmitReport.week}"> <f:selectItems value="#{SubmitReport.weeks}"/> </h:selectOneMenu>

Type in Your report:



<h:inputTextarea id="repContent" value="#{SubmitReport.repContent}" required="true"
styleClass="input" rows="22" cols="75"/>

Additional notes:



<!--textarea rows="5" cols="75" name="ReportAddNotes"></textarea-->
<h:inputTextarea id="projReportAddNotes"
value="#{SubmitReport.projReportAddNotes}" required="true"
styleClass="input" rows="5" cols="75"/>



<h:commandButton value="Submit" id="SubmitCommand" action="#{SubmitReport.submitReport}"
/>


</h:form>
</body>
</html>
</f:view>

-----------------------------------
-and here's part of faces-config.xml:
-------------------------------------
<managed-bean>
<managed-bean-name>SubmitReport</managed-bean-name>
<managed-bean-class>reportingtool.actions.SubmitReport</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>

Thank You very much for trying to help me.
 
Smitha H Rao
Ranch Hand
Posts: 50
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
I think the main problem here is
you do list() on session for some query.
This returns List of Objects.

List userProjectsList = session.createQuery( "FROM Project as p where p.user = " + usrIdStoredInSession). list();

here userProjectsList is List of Objects and you are creating SelectItem directly from it.
ArrayList<SelectItem> usrProjectsSelItems = new ArrayList<SelectItem>(userProjectsList.size());
for (int i =0; i < userProjectsList.size(); i++) {
usrProjectsSelItems.add( new SelectItem(userProjectsList.get(i)) );
}

The value of h:selectOneMenu is a instance of String. I think th eproblem is here. try something like:

ArrayList<SelectItem> usrProjectsSelItems = new ArrayList<SelectItem>(userProjectsList.size());
for (int i =0; i < userProjectsList.size(); i++) {
usrProjectsSelItems.add( new SelectItem(userProjectsList.get(i).toString()) );
}

Let me know if this works.

Thanks
Smitha




 
Andriy Burachinskiy
Greenhorn
Posts: 17
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Smitha, I successfully retreive from DataBase and display loggedUserProjects: see
-------------------------------------
<h:selectOneMenu id="projectName" value="#{SubmitReport.projectName}"
styleClass="common-dropdown">
<f:selectItems value="#{SubmitReport.loggedUserProjects}"/>
</h:selectOneMenu>
-------------------------------------

For persisting ProjectReport to DataBase I need projectName (other fields, i.e. projectStatus etc are commented now). When I press "Submit" button in browser, JSF MUST initialize the binded #{SubmitReport.projectName} projectName field of SubmitReport bean and INITIALIZE IT with selected value (if I understand everything right). But this doesn't happen!!! THIS IS THE PROBLEM...

Thanks for helping & your patience.
 
Smitha H Rao
Ranch Hand
Posts: 50
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Hi Andriy,

What I wanted to tell in my last post was SubmitReport.projectName is a String object. and SubmitReport.loggedUserProjects is a list of SelectItems which have Object values Not String values.

My suggestion was to input String values into SelectItem() constructor. something like below:
usrProjectsSelItems.add( new SelectItem(userProjectsList.get(i).toString()) );

Can you try this way?
 
Andriy Burachinskiy
Greenhorn
Posts: 17
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
When I debug application, setProjectName() method is never invoked; only getProjectName()
-----------------------------------
public String getProjectName() {
return projectName;
}
public void setProjectName(String projectName) {
this.projectName = projectName;
}
--------------------------------------
WHAT MAY BE THE EPROBLEM???
 
Andriy Burachinskiy
Greenhorn
Posts: 17
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
YES, i TRIED IT DOESN'T HELP..
 
Smitha H Rao
Ranch Hand
Posts: 50
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator


One last suggestion. Try putting <h:messages /> tag inside h:form and submit. If there is any problem it will print it on your page.


Thanks
Smitha
 
reply
    Bookmark Topic Watch Topic
  • New Topic