Avatar billede jokl98ac Nybegynder
06. maj 2004 - 11:02 Der er 21 kommentarer og
1 løsning

Hvordan populeres en liste i en JSP dynamisk fra en database?

Hej,

Sidder med an struts-applikation, bruger Tomcat 5.0.19 samt mysql 4.

Jeg vil gerne dynamisk populere en drop-down liste i en JSP med data fra databasen.
Hvordan gøres det? Jeg har været rundt om singleton-objekter og servlets, javascript & servlets og lidt andet, men kan ikke få ind i skallen, at der ikke findes en elegant og genbrugeligt måde at gøre det på. Eller at jeg bare ikke fatter det :-)

Tak!

mvh Jonas
Avatar billede arne_v Ekspert
06. maj 2004 - 11:08 #1
Hvor ligger problemet ?

Grundliggende henter du data fra databasen (DriverManager.getConnection + JDBC kald
eller DataSource lookup fra connection pool + JDBC kald eller EJB eller ...)
og outputter HTML (enten håndkodet eller via struts tag lib).
Avatar billede jokl98ac Nybegynder
06. maj 2004 - 11:18 #2
Hmm.. problemet ligger i jeg er meget grøn når det kommer til JSP. Alt det bagvedliggende, såsom at hente data fra db, connection pooling etc er der styr på.

Jeg ved simpelthen ikke nok om html til at vide, hvordan man populerer listen. Det jeg leder efter er et svar der fortæller mig, hvilken generel server-side løsning der skal laves (altså skal der skrives en servlet der skriver til HTML siden i html/text eller en Bean der returnerer en arraylist af Strings som bruges i JSPen eller hvad) samt et kodeeksempel på, hvordan select-listen implementeres i JSPen. Helst via struts tag-lib.

mvh Jonas
Avatar billede arne_v Ekspert
06. maj 2004 - 11:43 #3
Den relevante HTML syntax er:

<select name="foobar">
<option>aaa</option>
<option>bbb</option>
<option>ccc</option>
</select>
Avatar billede arne_v Ekspert
06. maj 2004 - 11:44 #4
Jeg kan ikke huske om / hvordan man får genereret den HTML med Struts taglib. Men
det må fremgå af Struts docs.

Det er nemt at lave i JSP med lidt embedded Java kode i.
Avatar billede arne_v Ekspert
06. maj 2004 - 11:46 #5
Hvis det skal smukkeseres lidt s¨laver du vel en klasse en metode som
returnerer en ArrayList af beans.
Avatar billede jokl98ac Nybegynder
06. maj 2004 - 11:50 #6
Ok, HTML syntaxen for listen har jeg - den bruger jeg og så struts tag-lib ud til højre.

Men hvordan fyldes listen ud med data fra databasen? Da jeg ikke er så hurtig i det her, tror jeg et kodeeksempel ville hjælpe en hel del...
Avatar billede jokl98ac Nybegynder
06. maj 2004 - 11:53 #7
Har lavet en bean (listCompaniesBean) der udtrækker det nødvendige fra databasen og returnerer det som et ResultSet. Spørgsmålet er vel, hvordan jeg bruger den (eller en der returnerer en Arrylist af Strings) i JSPen til at populere listen?
Avatar billede arne_v Ekspert
06. maj 2004 - 11:55 #8
Super simpelt eksempel:

<select name="foobar">
<%
for(int i=0;i<lst.size();i++) {
%>
<option><%=lst.get(i)%></option>
<%
}
%>
</select>
Avatar billede arne_v Ekspert
06. maj 2004 - 12:01 #9
Mit eksempel forudsætter en List af objekter der har en fornuftig toString metode.
Avatar billede fsconsult.dk Nybegynder
06. maj 2004 - 12:19 #10
jeg formoder at du loader din bean i en action. Sender du denne bean over til JSP via request eller som property på din form?
Avatar billede jokl98ac Nybegynder
06. maj 2004 - 12:20 #11
Ok, tak. Jeg fortsætter lige lidt med den her ArrayList af String-objekter.

Hvis jeg har en klasse (i dette tilfælde listCompaniesBean) hvori en metode (public ArrayList companies()) returnerer en liste af korrekt formaterede String objekter (altså Strings), hvordan bruger jeg da metoden i forbindelse med ovenstående? Hvilken kode skal tilføjes? Noget include eller hvordan?
Avatar billede arne_v Ekspert
06. maj 2004 - 12:23 #12
<select name="foobar">
<%
List lst = listCompaniesBean.companies();
for(int i=0;i<lst.size();i++) {
%>
<option><%=lst.get(i)%></option>
<%
}
%>
</select>
Avatar billede jokl98ac Nybegynder
06. maj 2004 - 13:59 #13
Så kører det - mange tak for hjælpen, point på vej til dig.

mvh Jonas
Avatar billede jokl98ac Nybegynder
06. maj 2004 - 14:00 #14
hvordan er det lige det fungerer? Du skal vel oprette et svar?
Avatar billede jokl98ac Nybegynder
06. maj 2004 - 14:14 #15
hmm... det virkede kun en gang. nu får jeg en org.apache.jasper.JasperException
... nogen idé om hvorfor?
Avatar billede arne_v Ekspert
06. maj 2004 - 14:19 #16
svar
Avatar billede arne_v Ekspert
06. maj 2004 - 14:20 #17
Post hele exceptionen så kigger vi på det
Avatar billede arne_v Ekspert
06. maj 2004 - 14:21 #18
Struts er iøvrigt et udmærket framework, men jeg vil helt klart anbefale
erfaring med JSP og servlets inden man går igang med det.
Avatar billede jokl98ac Nybegynder
06. maj 2004 - 14:21 #19
meget mærkeligt... det virker ca. hver 10. gang jeg prøver...

Min JSP ser således ud (hat taget uvedkommende ud):

<%@ page language="java" import="java.util.*, helperClasses.*"%>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>


<html:html>
<head>
<title>Create new delivery</title>
</head>
<body bgcolor="white">

<html:errors/>

<html:form action="/CreateDeliveryAction">

    Select the customer company:<BR>
    <html:select property="customerCompanyName" size="1">
        <%
            //listCustomerCompanies lcc = new listCustomerCompanies()
            ArrayList lst = listCustomerCompanies.getCustomerCompaniesList();
            for(int i=0;i<lst.size();i++)
            {
                %>
                <option><%=lst.get(i)%></option>
                <%
            }
        %>


    </html:select><BR><BR> 
      <html:submit property="submit" value="Save delivery"/>
</html:form>
</td>
  </tr>
</table>
</body>
</html:html>

Og min klasse ser således ud

package helperClasses;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.*;
import java.util.*;

public class listDeliveries
{
    private static Connection con = null;               
    private static Statement stmt = null;
    private static ResultSet rs = null;
     
    public listDeliveries(){}
   
    public static void getConnection()
    {
        try
        {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            con = DriverManager.getConnection("jdbc:mysql://localhost/deliveryinterview?user=root&password=jokl98ac");           
           
        }
        catch (SQLException sex)
        {
            // handle any errors
            System.out.println("SQLException: " + sex.getMessage());
            System.out.println("SQLState: " + sex.getSQLState());
            System.out.println("VendorError: " + sex.getErrorCode());
        }
        catch (Exception ex)
        {
            System.out.println("Exception: " + ex.getMessage());
        }
    }
   
    public static ResultSet getDeliveries()
    { 
        try
        {
            stmt = con.createStatement();
            StringBuffer sqlString = new StringBuffer("SELECT delivery_name FROM deliveries");
            rs = stmt.executeQuery(sqlString.toString());                     
        }
        catch (SQLException sex)
        {
            // handle any errors
            System.out.println("SQLException: " + sex.getMessage());
            System.out.println("SQLState: " + sex.getSQLState());
            System.out.println("VendorError: " + sex.getErrorCode());
        }       
        return rs;
    }   
   
    public static ArrayList getDeliveriesList()
    {
        ArrayList l = new ArrayList();
       
        try
        {           
          getDeliveries();
            int i = 0;
            while(rs.next())
            {               
                String element = rs.getString(1);               
                l.add(element);
                i++;
            }         
        }
        catch (SQLException sex)
        {
            // handle any errors
            System.out.println("SQLException: " + sex.getMessage());
            System.out.println("SQLState: " + sex.getSQLState());
            System.out.println("VendorError: " + sex.getErrorCode());
        }
        return l;       
      }
}

Kan i se, hvad der sker? Eller rettere hvorfor den nogle gange kører og andre ange ikke?
Avatar billede jokl98ac Nybegynder
06. maj 2004 - 14:22 #20
Ok, her er hele exceptionen

QUOTE
MonitorFilter::ServletException
MonitorFilter::A web application object caused an exception
MonitorFilter::org.apache.jasper.JasperException
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:358)
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:301)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:248)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:284)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:204)
        at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:305)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:233)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:204)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:257)
        at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:151)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:567)
        at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:245)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:199)
        at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:151)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:567)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:184)
        at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:151)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:164)
        at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:149)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:567)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:156)
        at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:151)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:567)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:972)
        at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:206)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:833)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:732)
        at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:619)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:688)
        at java.lang.Thread.run(Thread.java:534)

UNQUOTE
Avatar billede jokl98ac Nybegynder
06. maj 2004 - 14:30 #21
Hej - har løst det. Du får dine point nu med mange tak for hjælpen!

mvh Jonas
Avatar billede arne_v Ekspert
06. maj 2004 - 20:49 #22
Efter at have kigget lidt på Struts docs tror jeg at:

        <%
            ArrayList lst = listCustomerCompanies.getCustomerCompaniesList();
            for(int i=0;i<lst.size();i++)
            {
        %>
                <option><%=lst.get(i)%></option>
        <%
            }
        %>

kan erstattes af:

<html:options collection="lst" property="propertyOfYourBeans"/>

Men tilsyneladende skal du så bruge beans.

fsconsult.dk kan rette mig hvis jeg har misforstået noget.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester