Avatar billede nylle Nybegynder
12. februar 2003 - 13:33 Der er 8 kommentarer og
2 løsninger

java, beans og resultset

Jeg ønsker at finde en løsning på hvordan jeg på den mest hensigtsmæssige måde for behandlet data jeg skal benytte i en jsp-side.

Jeg er ved at udvikle en dynamisk sidemenu som består af hovedkategorier med dertilhørende underkategorier som befinder sig i en jsp-side kaldet leftFrame.jsp - disse kategorier er linket sammen via nøgler og ligger i en MySQL database.

Mit design er bygget op omkring det såkaldte MVC-pattern eller model 2 princip med jsp, servlets og beans, men specielt hvad der vedrører databasen og connections virker lidt akavet.

Min kode er ikke helt veludviklet men jeg indsætter alligevel koden for at få en bedre fornemmelse af systemet.
Flowet forløber således: Min servlet kontaktes som det allerførste og præsentere en index-side bestående af 3 frames - en top, en left og en mainFrame som alle blot er jsp-sider. Min leftFrame kalder en metode i en bønne (KategoriBean) som udfører noget business logik hvad angår mine kategorier. Jeg føler det som overkill at benytte den abstrakte klasses(DBConnBean)'s metoder. Men dette fordi andre og nye bønner kan komme til løbende når systemet udviddes.

******************leftFrame.jsp***************************
<head><title>Kategori_test</title></head>
<body>
    <%
    System.out.println("Før metodekald til bønnen i leftFrame.jsp");
   
    ResultSet reSetHK = kategori.getResultSetHK();
   
    out.println("<table>");       
    while (reSetHK.next())
    {
        out.println("<tr><td><a href='hentUnderKat.jsp?id=" +reSetHK.getInt("HKID")+ "'>" +reSetHK.getString("Navn")+ "</a></td></tr>");
    }
    out.println("</table>");
   
    /*   
    ResultSet reSetUK = kategori.getResultSetUK();
   
    out.println("<table>");       
    while (reSetUK.next())
    {
        out.println("<tr><td><a href='hentUnderKat.jsp?id=" +reSetUK.getString("Navn")+ "'>" +reSetUK.getString("Navn")+ "</a></td></tr>");
    }
    out.println("</table>");
    */   
    %>
</body>
</html>

***********************abstract class DBConnBean***********
import java.sql.*;
import java.io.*;
import java.util.*;
import javax.servlet.http.*;

public abstract class DBConnBean //implements HttpSessionBindingListener
{
    private Connection conn;
    private Statement stmt;
    private ResultSet results;
       
    private static final String driver = "com.mysql.jdbc.Driver";
    private static final String dbURL = "jdbc:mysql://localhost/metnet_portal_database_min";
    private static final String login = "root";
    private static final String password = "root";
   
    //Konstruktøren opretten en database connection
    public DBConnBean()
    {
        try
        {   
            Class.forName(this.driver).newInstance();           
            this.conn = DriverManager.getConnection(this.dbURL, this.login, this.password);
            this.conn.setAutoCommit(true);
            this.stmt = conn.createStatement();
        }
       
        catch (ClassNotFoundException e)
        {
            System.err.println ("DBConnBean: Driver er ikke tilgængelig" + e.getMessage());           
            this.conn = null;
        }       
        catch (SQLException e)
        {
            System.err.println("DBConnBean: Driveren blev ikke indlæst");
            System.err.println("SQL Problem : " + e.getMessage());
            System.err.println("SQL State  : " + e.getSQLState());
            System.err.println("Vendor Error: " + e.getErrorCode());
            this.conn = null;
        }           
        catch (InstantiationException e)
        {
            System.err.println(e.getMessage());
        }       
        catch (IllegalAccessException e)
        {
            System.err.println(e.getMessage());
        }
    }
   
    //Metode som returnere en database connection
    public Connection getConnection()
    {
        return this.conn;
    }
   
    //Metode som gemmer data i databasen permanent
    public void commit() throws SQLException
    {
        conn.commit();   
    }

    //Metode som sætter databasen til den oprindelige tilstand f.eks.
    //hvis en insert-statement ikke blev korrekt udført
    public void rollback() throws SQLException
    {
        this.conn.rollback();   
    }

    //metode som sætter AutoCommit til enten true eller false
    public void setAutoCommit (boolean autoCommit) throws SQLException
    {
        this.conn.setAutoCommit(autoCommit);
    }
   
    //Metode som returner et resultset dvs. data der reurneres på
    //baggrund af en select statement
    public ResultSet executeQuery(String sql) throws SQLException
    {
        return this.results = stmt.executeQuery(sql);
    }
   
    //Metoden har til formål at opdatere databasen med nye data. Metoden
    //returnere en int som fortæller hvor mange poster der er ændret/oprettet/slettet   
    public int executeUpdate(String sql) throws SQLException
    {
        return this.stmt.executeUpdate(sql);   
    }

********************class KategoriBean*********************
import java.sql.*;
import java.io.*;
import java.util.*;
import javax.servlet.http.*;
import Portalen_Nylle_Classes.DBConnBean;

public class KategoriBean extends DBConnBean
{
    private ResultSet rsHK;
    private ResultSet rsUK;
   
    public KategoriBean()
    {
        super();       
    }
   
    //Metoden henter Hovedkategorierne ved hjælp af DBConnBean
    public void selectHovedKategori() throws SQLException
    {   
        System.out.println("metoden selectHovedKategori");   
       
        String hKat;       
        hKat = "SELECT * FROM hovedkategori";
       
        try
        {           
            rsHK = this.executeQuery(hKat);           
        }       
        catch(SQLException sqle)
        {
        System.out.println("Error executeing update " +sqle);
    }
      //return hKatResult;
    }
   
    public ResultSet getResultSetHK() throws SQLException
    {
        System.out.println("metoden getResultSetHK");
       
        this.selectHovedKategori();
        return this.rsHK;   
    }
   
    //Metoden henter Underkategorierne ved hjælp af DBConnBean
    public void selectUnderKategori() throws SQLException
    {
        System.out.println("metoden selectUnderKategori");   
       
        String uKat;
        uKat = "SELECT underkategori.Navn FROM underkategori, hovedkategori where hovedkategori.HKID = '" +rsHK.getInt("HKID")+ "' and underkategori.HKID = hovedkategori.HKID";
   
        try
        {           
            this.rsUK = this.executeQuery(uKat);           
        }       
        catch(SQLException sqle)
        {
        System.out.println("Error executeing update " +sqle);
    }
      //return uKatResult;
    }
   
    public ResultSet getResultSetUK() throws SQLException
    {
        System.out.println("metoden getResultSetUK");
       
        this.selectUnderKategori();
        return rsUK;   
    }
}


Jeg ønsker gerne svar mht. mit design og opbygningen hvis der findes en bedre måde, men det vigtigste er at jeg kan få kategorierne ud af databasen og behandle og få kategorierne vist i min leftframe således at når jeg klikker på en hovedkategori så vil underkategorierne blive vist under den hovedkategori som der blev klikket på.

på forhånd tak for hjælpen
hilsen Nylle =0)
Avatar billede disky Nybegynder
12. februar 2003 - 13:42 #1
Jeg vil fjerne alt java kode fra JSP siderne, enten ved brug af Custom Tags, eller ved kun at tillade metode kald til underliggende java beans.

Det er ikke smart design, at have en jsp side som jo egentligt bare er html, hvorpå der er både html og samtidigt java kode det out.println()'er html kode.

Hvis du på et tidspunkt skal ændre design er det tæt på umuligt at gøre det på en nem måde.

Lav en database klasse der håndtere alt database kommunikation for dig, så du bare sender en streng der indeholder SQL querien og den returnerer så et resultset som du kan behandle i den klasse der har brug for dataen.

Det eneste du så har på din jsp side er så enten en tag eller via f.eks. en for løkke looper du igennem alle poster i dit resultset, og via get metoder henter du dataen fra din bean.
Din bean står står for al data validering, formattering osv, så din JSP kun lave præsentationen.

Custom tags er dog bedre, men lidt mere arbejdskrævende.

DU kan selvfølgelig også lave delux udgaven, hvor dine java beans udsender XML som via XSL bliver omformet til HTML,WML....

Håber det hjalp lidt, ellers bare spørg løs.
Avatar billede arne_v Ekspert
12. februar 2003 - 13:52 #2
2 hurtige skud fra hoften (nok lidt uden for hvad du søger):

1) Din JSP er ret "java-tung" - nogle steder kunne du bruge
  mere HTML og <%= something %> til at indsætte java variable.

2) Jeg er ikke overbevist om det smarte i en abstrakt database
  connection klasse som dine business logik klasser extender.

  Jeg tror at en ikke-abstrakt singleton-klasse som bruges af
  dine business logik klasser.

  [så er der hele diskussionen omkring connection pools, DataSource via
  JNDI etc. - men den springer jeg lige over her - du kan finde diskussionen
  i indlæg fra de sidste dage]
Avatar billede nylle Nybegynder
12. februar 2003 - 14:04 #3
Jeg kender ikke meget til custom tags på nuværende tidspunkt men vil inden længe tro det vil blive en nødvendighed, men mht. brug af bønner er det netop det jeg ønsker at min KategoriBean skal håndtere et resultset men hvis du ser på min kode denne bønne benytter jeg to motoder: getResultSetHK() og selectHovedKategori() - kan dette ikke gøres smartere og hvad med at ligge dette over i et array??

Det jeg skal benytte er to resultset et for hovedkategorierne og et for underkategorierne som jeg ønsker at traversere i jsp-siden(leftFrame).
Avatar billede nylle Nybegynder
12. februar 2003 - 14:16 #4
Men arne v jeg er desværre ikke nogen kæmpe haj til hele denne web-verden endnu men jeg er helt bevist om at mine jsp-sider skal indeholde et minimum af javakode og dette skal selfølgelig også fjernes. Mht. databasen skal jeg også inden ikke så længe begynde at se på connection pools som du nævner.

men iøjeblikket ønsker jeg "blot" at få de to forskellige katorier præsenteret og linket sammen i jsp-siden.
Avatar billede disky Nybegynder
12. februar 2003 - 14:25 #5
Det minimum af jsp kode har du overskredet.

Hold dig udelukkende til metode kald, resten gemmer du i dine klasser.

Så er det langt mere overskueligt.
Avatar billede nylle Nybegynder
12. februar 2003 - 14:42 #6
Jeg mangler en lidt mere udførlig eller konkret forklaring på mit indledende problem og jeg ved at i (arne og disky) har mere i posen :=)
Avatar billede disky Nybegynder
12. februar 2003 - 14:52 #7
jeg har nogle eksempler der hjemme, men dem kan jeg ikke nå herfra.
Avatar billede nosjns Nybegynder
12. februar 2003 - 15:00 #8
Du burde overveje at placere menu i memory (servlet context), så du kun skal hente kategorierne engang. Du vil undgå en masse kald til databasen. Når du tilføjer nye kategorier skal du huske at hente dem op i memory igen.
Avatar billede arne_v Ekspert
12. februar 2003 - 15:53 #9
Lav en ikke-abstrakt generel database klasse.

Lav en bean klasse som indeholder alle data for en række.

Lav en klasse som bruger den generelle database klasse til
at hente oplysningerne fra databasen og gemme dem i en collection
af din bean klasse.

I din JSP kan du så:

<table>
<%
Iterator it = businessobjekt.getAllBean().iterator();
while(it.hasNext()) {
    Bean bean = (Bean)it.next();
%>
<tr>
<td><%=bean.getX()%></td>
<td><%=bean.getY()%></td>
</tr>
<%
}
%>

Stadigvæk ikke creme de la creme, men du har fået lavet nogle
fornuftige klasser og har fået pyntet lidt på din JSP.
Avatar billede arne_v Ekspert
19. februar 2003 - 23:03 #10
nylle>

Er du kommet videre ?
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



IT-JOB