[ Marko_R @ 22.05.2008. 20:40 ] @
Pokušavam da napravim neku prostu JSF aplikaciju, dakle da se izabere neka stavka iz spiska. Spisak stavki se čita iz baze podataka i treba da se na osnovu toga generiše drop-down meni pomoću kog se vrši izbor. Naravno, pretpostavljam da to mora da bude <h:selectOneMenu> tag. Ali ima mnogo opcija, a i njihov broj je nepoznat, tako da to mora da bude neka struktura podataka koju treba proći nekom petljom. Ja sam probao <c:forEach> ali to nije radilo jer nisam uspeo da iz njega pristupim vrednostima managed bean-a. Dakle

Code:
<h:selectOneMenu value="#{artBean.marka}">
    <c:forEach var="row" items="${artBean.proizvodjaci}">
        <f:selectItem itemLabel="${row.getValue()}" itemValue="${row.getKey()}" />
    </c:forEach>
</h:selectOneMenu>


Takođe, nisam uspeo ni da iz bean-a setujem EL varijablu koja može da se iskoristi u JSTL tagovima. Pokušao sam sa

Code:
FacesContext context = FacesContext.getCurrentInstance();
servletContext servletContext = (ServletContext) context.getExternalContext().getContext();
if (servletContext.getAttribute("proizvodjaci") != null)
    servletContext.removeAttribute("proizvodjaci");
servletContext.setAttribute("proizvodjaci",proizvodjaci);


ali u meniju se pojavi doslovce ${row.getValue()} a ne vrednost tog izraza.

Ako iskoristim JspContext, javlja se Exception.

Code:
HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: #{artBean.submitId}: javax.faces.el.EvaluationException: java.lang.ClassCastException: org.apache.catalina.core.ApplicationContextFacade
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:209)

root cause

javax.faces.FacesException: #{artBean.submitId}: javax.faces.el.EvaluationException: java.lang.ClassCastException: org.apache.catalina.core.ApplicationContextFacade
    com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:78)
    javax.faces.component.UICommand.broadcast(UICommand.java:312)
    javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:267)
    javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:381)
    com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:75)
    com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200)
    com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:90)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:197)

note The full stack trace of the root cause is available in the Apache Tomcat/5.5 logs.
Apache Tomcat/5.5


Da li bi mogla mala pomoć oko ovoga?
[ zigizig @ 23.05.2008. 08:46 ] @
U bean-u kreiraj SelectItem[] listu

public SelectItem[] getListaProizvodjaca() {
...upit na bazu ili sta vec...
SelectItem [] select = new SelectItem[broj_rezultata_iz_baze];
for (int i = 0; i < broj_rezultata_iz_baze; ++i) {
select = new SelectItem(rezultat[ i].id, rezultat[ i].naziv);
}
return select;
}



U jsp strani napravi selectOneMenu

<h:selectOneMenu id="marka" value="#{artBean.marka}" required="true">
<f:selectItems id="listaProizvodjaca" value="#{artBean.listaProizvodjaca}"/>
</h:selectOneMenu>
[ Marko_R @ 23.05.2008. 12:09 ] @
Prvo, hvala na odgovoru. Način je delovao vrlo logično i nadao sam se uspehu. Ipak, došlo je do problema.

Uradio sam otprilike ovako:

u bean-u:

Code:

    private SelectItem [] proizvodjaci;
    
    ...

    public String submitId() {
        readProizvodjaci();
        ...
    }
    
    ...

    public SelectItem [] getProizvodjaci() {
        return proizvodjaci;
    }

    public void readProizvodjaci() {
        //Generiše proizvodjači iz baze podataka
        String query = "select id,naziv from proizvodjac";
        ...Izvršava se query i smešta rezultat u ResultSet rs...
        rs.last();
        proizvodjaci = new SelectItem [rs.getRow()];
        rs.beforeFirst();
        int i = 0;
        while (rs.next()) {
            proizvodjaci[i++] = new SelectItem(Integer.toString(rs.getInt(1)),rs.getString(2));
        }
        ...
    }


u jsp-u:

Code:

<h:selectOneMenu value="#{artBean.marka}">
    <f:selectItems id="proizvodjaci" value="#{artBean.proizvodjaci}" />
</h:selectOneMenu>


Proverio sam da je dužina niza proizvodjači 83, koliko i treba da bude.

Ali dobijam ovaj Excepition:

Code:
HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: javax.servlet.jsp.JspException: Argument Error: One or more parameters are null.
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:512)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:322)
    com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:130)
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:87)
    com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200)
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:117)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:198)

root cause

javax.servlet.ServletException: javax.servlet.jsp.JspException: Argument Error: One or more parameters are null.
    org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:839)
    org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:776)
    org.apache.jsp.update_jsp._jspService(update_jsp.java:83)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:334)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:322)
    com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:130)
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:87)
    com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200)
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:117)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:198)

root cause

java.lang.NullPointerException: Argument Error: One or more parameters are null.
    com.sun.faces.renderkit.html_basic.HtmlResponseWriter.writeText(HtmlResponseWriter.java:357)
    com.sun.faces.renderkit.html_basic.MenuRenderer.renderOption(MenuRenderer.java:581)
    com.sun.faces.renderkit.html_basic.MenuRenderer.renderOptions(MenuRenderer.java:525)
    com.sun.faces.renderkit.html_basic.MenuRenderer.renderSelect(MenuRenderer.java:481)
    com.sun.faces.renderkit.html_basic.MenuRenderer.encodeEnd(MenuRenderer.java:430)
    javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:720)
    javax.faces.webapp.UIComponentTag.encodeEnd(UIComponentTag.java:623)
    javax.faces.webapp.UIComponentTag.doEndTag(UIComponentTag.java:546)
    com.sun.faces.taglib.html_basic.SelectOneMenuTag.doEndTag(SelectOneMenuTag.java:505)
    org.apache.jsp.update_jsp._jspx_meth_h_selectOneMenu_0(update_jsp.java:219)
    org.apache.jsp.update_jsp._jspx_meth_h_form_0(update_jsp.java:153)
    org.apache.jsp.update_jsp._jspx_meth_f_view_0(update_jsp.java:115)
    org.apache.jsp.update_jsp._jspService(update_jsp.java:76)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:334)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:322)
    com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:130)
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:87)
    com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200)
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:117)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:198)

note The full stack trace of the root cause is available in the Apache Tomcat/5.5 logs.
Apache Tomcat/5.5


Šta sad to može da bude? Proverio sam sve više puta, probao razne kombinacije, ali uvek isto. Jedino nisam probao drugi tip podataka za proizvodjaci (npr. List ili Map).
[ Marko_R @ 23.05.2008. 20:39 ] @
Rešio sam ovaj problem, razlog je bio u tome što je jedno polje u bazi podataka bilo null. Ali i dalje ne radi kako treba, jer nije selektovana odgovarajuća opcija, već prva, a kada kliknem na submit da se upišu izmenjeni podaci, ne prebaci me na sledeću stranu, već se učita ta ista, a podaci ostanu nepromenjeni. Ima li nekih sugestija?
[ Marko_R @ 23.05.2008. 20:40 ] @
Ako umesto drop-down liste stavim text-box sve radi super.
[ Marko_R @ 23.05.2008. 23:45 ] @
Greška je bila u tome što sam stavio da SelectItem value bude tipa String, a marka je tipa int.
[ zigizig @ 24.05.2008. 20:39 ] @
neka ti value bude long jer id moze da bude povelik :)

Jel to sad radi kako treba?

Jos nesto:
Nema potreba da pravis i promenljivu proizvodjaci.
Neka ti metoda
Code:
public void readProizvodjaci()
vraca SelectItem[]
Code:
public SelectItem[] readProizvodjaci()
pa u njoj kreiraj
Code:
SelectItem[] proizvodjaci = new SelectItem [rs.getRow()]

pa na kraju
Code:
return proizvodjaci
[ Marko_R @ 25.05.2008. 01:20 ] @
Citat:
zigizig: neka ti value bude long jer id moze da bude povelik :)

Jel to sad radi kako treba?

Radi kako treba, a int je sasvim dovoljan jer ide do dve milijarde.

Citat:
Jos nesto:
Nema potreba da pravis i promenljivu proizvodjaci.
Neka ti metoda
Code:
public void readProizvodjaci()
vraca SelectItem[]
Code:
public SelectItem[] readProizvodjaci()
pa u njoj kreiraj
Code:
SelectItem[] proizvodjaci = new SelectItem [rs.getRow()]

pa na kraju
Code:
return proizvodjaci

Hvala na korisnoj sugestiji, sad niz ne mora da bude non-stop u memoriji. Samo izgleda da mora da se taj metod zove getProizvodjaci, inače dolazi do izuzetka.

Code:
HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: javax.servlet.jsp.JspException: Error getting property 'readProizvodjaci' from bean of type tjsf1.Artikal
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:512)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:322)
    com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:130)
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:87)
    com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200)
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:117)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:198)

root cause

javax.servlet.ServletException: javax.servlet.jsp.JspException: Error getting property 'readProizvodjaci' from bean of type tjsf1.Artikal
    org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:839)
    org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:776)
    org.apache.jsp.update_jsp._jspService(update_jsp.java:83)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:334)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:322)
    com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:130)
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:87)
    com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200)
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:117)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:198)

root cause

javax.faces.el.PropertyNotFoundException: Error getting property 'readProizvodjaci' from bean of type tjsf1.Artikal
    com.sun.faces.el.PropertyResolverImpl.getValue(PropertyResolverImpl.java:107)
    com.sun.faces.el.impl.ArraySuffix.evaluate(ArraySuffix.java:167)
    com.sun.faces.el.impl.ComplexValue.evaluate(ComplexValue.java:151)
    com.sun.faces.el.impl.ExpressionEvaluatorImpl.evaluate(ExpressionEvaluatorImpl.java:243)
    com.sun.faces.el.ValueBindingImpl.getValue(ValueBindingImpl.java:173)
    com.sun.faces.el.ValueBindingImpl.getValue(ValueBindingImpl.java:154)
    javax.faces.component.UISelectItems.getValue(UISelectItems.java:110)
    com.sun.faces.util.Util.getSelectItems(Util.java:600)
    com.sun.faces.renderkit.html_basic.MenuRenderer.getOptionNumber(MenuRenderer.java:488)
    com.sun.faces.renderkit.html_basic.MenuRenderer.renderSelect(MenuRenderer.java:465)
    com.sun.faces.renderkit.html_basic.MenuRenderer.encodeEnd(MenuRenderer.java:430)
    javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:720)
    javax.faces.webapp.UIComponentTag.encodeEnd(UIComponentTag.java:623)
    javax.faces.webapp.UIComponentTag.doEndTag(UIComponentTag.java:546)
    com.sun.faces.taglib.html_basic.SelectOneMenuTag.doEndTag(SelectOneMenuTag.java:505)
    org.apache.jsp.update_jsp._jspx_meth_h_selectOneMenu_0(update_jsp.java:227)
    org.apache.jsp.update_jsp._jspx_meth_h_form_0(update_jsp.java:154)
    org.apache.jsp.update_jsp._jspx_meth_f_view_0(update_jsp.java:116)
    org.apache.jsp.update_jsp._jspService(update_jsp.java:76)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:334)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:322)
    com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:130)
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:87)
    com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200)
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:117)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:198)

note The full stack trace of the root cause is available in the Apache Tomcat/5.5 logs.
Apache Tomcat/5.5
[ zigizig @ 25.05.2008. 08:05 ] @
Da u pravu si, to sam prevideo.
Da bi metoda mogla da se pozove iz jsf taga mora da ima prefiks get. Inace i kad mapiras promenljive u stvari se poziva get metoda (ili is za boolean).

Ako se dobro secam jedini izuzetak je ako metoda vraca String (ovo proveri jer nisam siguran).
[ Marko_R @ 25.05.2008. 09:04 ] @
Dakle, ono što je izgleda jedino moguće je da se metod nazove getProizvodjaci, a iz jsp-a da se referencira sa proizvodjaci (ne getProizvdjaci).
[ zigizig @ 25.05.2008. 23:30 ] @
Tako je ;)