Avatar billede coolfisk Nybegynder
14. februar 2004 - 09:51 Der er 45 kommentarer

JSP og databaser

Har en jsp side, hvor der skal gemmes nogle data. Hvordan forbinder man en database til det? ved godt man kan hente værdien fra en form med getParameter, men hvordan lægger man den ned i en database. Har du nogle eksempler?

Kan man inportere en almindelig java klasse og anvende den funktioner?
Avatar billede arne_v Ekspert
14. februar 2004 - 09:54 #1
Normal JDBC.

Ja - det er både muligt og anbefalelsesværdigt.
Avatar billede arne_v Ekspert
14. februar 2004 - 09:55 #2
Jeg lavede engang denne lille demo side:

<%@ page import="java.sql.*" %>
<%
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con = DriverManager.getConnection("jdbc:odbc:TestMSAccess");
Statement stmt = con.createStatement();
if(request.getMethod().equals("POST")) {
    int F1 = Integer.parseInt(request.getParameter("F1"));
    String F2 = request.getParameter("F2");
    stmt.executeUpdate("INSERT INTO T1 VALUES (" + F1 + ",'" + F2 + "')");
}
%>
<!doctype html public "-//w3c/dtd HTML 4.01 Transitional//en">
<html>
<head>
<title>T1</title>
</head>
<body>
<h1>T1</h1>
<h2>Show data</h2>
<table border>
<%
ResultSet rs = stmt.executeQuery("SELECT * FROM T1");
while(rs.next()) {
%>
<tr>
<td><%=rs.getInt("F1")%></td>
<td><%=rs.getString("F2")%></td>
</tr>
<%
}
%>
</table>
<h2>Add data</h2>
<form method="post" action="db.jsp">
F1:<input type="text" name="F1" size="10">
<br>
F2:<input type="text" name="F2" size="20">
<br>
<input type="submit" value="Add">
</form>
</body>
</html>
Avatar billede arne_v Ekspert
14. februar 2004 - 09:56 #3
Hvis du laver java hjælpe klasser, så:
  * put dem i pakke
  * anbring class filerne i webapps/WEB-INF/classes/dinpakke
Avatar billede coolfisk Nybegynder
14. februar 2004 - 10:18 #4
hvordan bruger man så funktionerne fra en almindelig java klasse? Har selv databaseforbindelse i en seperat klasse = databaseforbindelse.java
Avatar billede arne_v Ekspert
14. februar 2004 - 10:29 #5
Mange måder:

<%
MinKlasse mitobjekt = new MinKlasse();
mitobjekt.noget();
%>

er en måde.
Avatar billede arne_v Ekspert
14. februar 2004 - 10:31 #6
<jsp:useBean id="mitobjekt" scope="request" class="MinKlasse" />

er en anden.
Avatar billede arne_v Ekspert
14. februar 2004 - 10:32 #7
Den sidste form er mest interesseant når man ændrer scope="request" til
f.eks. scope="session" !
Avatar billede coolfisk Nybegynder
14. februar 2004 - 10:33 #8
Hvad gør scope="session" ?
Avatar billede arne_v Ekspert
14. februar 2004 - 10:36 #9
scope="session" gør at mitobjekt hænger på sessionen d.v.s. at den
bevares mellem forskellige requests fra samme bruger.

Utroligt nyttigt i mange sammenhænge. Tænk bare på indkøbskurv.
Avatar billede arne_v Ekspert
14. februar 2004 - 10:37 #10
Med hensyn til database connection så vil jeg til professionel brug
anbefale en database connection pool.
Avatar billede coolfisk Nybegynder
14. februar 2004 - 10:46 #11
er ikke så meget inden i det, men hvad er en database connection pool. nogle eks?
Avatar billede arne_v Ekspert
14. februar 2004 - 10:50 #12
En database connection pool betyder at i.s.f. at man laver en connection til
databasen hver gang man skal lave noget, så laver man ved opstart N connections
og så låner man bare en connection, når man skla bruge en.

Det er godt for performance.

Hvis du bruger Tomcat, så har jeg skrevet en artikel "Java web applikationer med Tomcat" som beskriver hvordan man gør det med Tomcat.
Avatar billede coolfisk Nybegynder
14. februar 2004 - 10:52 #13
hvad hedder url, så kan jeg gennemlæse det
Avatar billede arne_v Ekspert
14. februar 2004 - 11:14 #14
Avatar billede coolfisk Nybegynder
15. februar 2004 - 10:12 #15
det eksempel du har lavet med en database... består den kun af en jsp side? Noget andet er selve databasen, hvad består den af? Kun et felt T1, som er number?
Avatar billede arne_v Ekspert
15. februar 2004 - 10:19 #16
CREATE TABLE T1(
  F1 INTEGER,
  F2 VARCHAR(50),
  PRIMARY KEY(F1)
);
Avatar billede coolfisk Nybegynder
15. februar 2004 - 13:19 #17
Har indsat din kode, på en JSP side. Oprette en tab med F1 INTEGER, F2 VARCHAR(50),og har lavet til tilgang til OBCD. men den melder fejlen:

500 Internal Server Error
java.sql.SQLException: No data found
    at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7060)
    at sun.jdbc.odbc.JdbcOdbc.SQLDriverConnect(JdbcOdbc.java:3028)
    at sun.jdbc.odbc.JdbcOdbcConnection.initialize(JdbcOdbcConnection.java:323)
    at sun.jdbc.odbc.JdbcOdbcDriver.connect(JdbcOdbcDriver.java:174)
    at java.sql.DriverManager.getConnection(DriverManager.java:512)
    at java.sql.DriverManager.getConnection(DriverManager.java:193)
    at _data._jspService(data.jsp:4)
    [/data.jsp]
    at oracle.jsp.runtime.HttpJsp.service(HttpJsp.java:139)
    at oracle.jsp.runtimev2.JspPageTable.service(JspPageTable.java:348)
    at oracle.jsp.runtimev2.JspServlet.internalService(JspServlet.java:509)
    at oracle.jsp.runtimev2.JspServlet.service(JspServlet.java:413)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
    at com.evermind[Oracle Application Server Containers for J2EE 10g (9.0.4.0.0)].server.http.ResourceFilterChain.doFilter(ResourceFilterChain.java:65)
    at oracle.security.jazn.oc4j.JAZNFilter.doFilter(JAZNFilter.java:356)
    at com.evermind[Oracle Application Server Containers for J2EE 10g (9.0.4.0.0)].server.http.ServletRequestDispatcher.invoke(ServletRequestDispatcher.java:614)
    at com.evermind[Oracle Application Server Containers for J2EE 10g (9.0.4.0.0)].server.http.ServletRequestDispatcher.forwardInternal(ServletRequestDispatcher.java:317)
    at com.evermind[Oracle Application Server Containers for J2EE 10g (9.0.4.0.0)].server.http.HttpRequestHandler.processRequest(HttpRequestHandler.java:784)
    at com.evermind[Oracle Application Server Containers for J2EE 10g (9.0.4.0.0)].server.http.HttpRequestHandler.run(HttpRequestHandler.java:270)
    at com.evermind[Oracle Application Server Containers for J2EE 10g (9.0.4.0.0)].server.http.HttpRequestHandler.run(HttpRequestHandler.java:112)
    at com.evermind[Oracle Application Server Containers for J2EE 10g (9.0.4.0.0)].util.ReleasableResourcePooledExecutor$MyWorker.run(ReleasableResourcePooledExecutor.java:192)
    at java.lang.Thread.run(Thread.java:536)
Avatar billede arne_v Ekspert
15. februar 2004 - 13:43 #18
Den fejl plejer at komme når man i en dårlig JDBC driver (og SUN ODBC-JDBC bridge er
ern dårlig JDBC driver) prøver at læse samme kolonne to gange
eller at læse kolonnerne i forkert rækkefølge.

Hvilken type database bruger du ?

Bruger du mit eksempel totalt uændret eller har du lige rettet lidt til ?
Avatar billede coolfisk Nybegynder
15. februar 2004 - 15:07 #19
Bruger dit eksempel uændret... det virker måske ikke?
bruger Microsoft Access Driver(*.mdb)
Avatar billede arne_v Ekspert
15. februar 2004 - 15:17 #20
Det virker perfekt hos mig.
Avatar billede coolfisk Nybegynder
15. februar 2004 - 15:25 #21
har via access lavet databasen. Kaldt den T1, hvor er er 2 kolonner:
F1 numer --- primær nøgle
F2 text(50)
Avatar billede arne_v Ekspert
15. februar 2004 - 15:34 #22
DSN hedder TestMSAccess ?

Er der data i tabellen ?
Avatar billede coolfisk Nybegynder
15. februar 2004 - 15:36 #23
der er data i tabellen og DSN hedder TestMSAccess
Avatar billede arne_v Ekspert
15. februar 2004 - 15:48 #24
Mystisk.

Jeg tester med Tomcat 4.1.29 og det ser ud som om du tester med OC4J.

Men der er intet server specifikt i den kode.
Avatar billede coolfisk Nybegynder
15. februar 2004 - 16:25 #25
<form method="post" action="db.jsp"> den laver vel ikke postyr? db.jsp er en anden side?
Avatar billede coolfisk Nybegynder
15. februar 2004 - 16:26 #26
al dataen skal være på samme jsp side?
Avatar billede coolfisk Nybegynder
15. februar 2004 - 16:26 #27
sry koden
Avatar billede arne_v Ekspert
15. februar 2004 - 16:28 #28
Min JSP sider er beregnet til at hedde db.jsp og dermed submitte til sig selv.
Avatar billede coolfisk Nybegynder
15. februar 2004 - 16:30 #29
hmm forstå ikke hvorfor den melder fejl :/
Avatar billede coolfisk Nybegynder
15. februar 2004 - 16:33 #30
bruger JDeveleper10g, kan der være en fejl der?
Avatar billede arne_v Ekspert
15. februar 2004 - 16:37 #31
Næppe.

Det er helt basal JDBC som det har virket i 5-6-7 år.
Avatar billede arne_v Ekspert
15. februar 2004 - 16:37 #32
Hvad sker der hvis du forsøger at køre JDBC koden i en lille standalone
applikation ?
Avatar billede coolfisk Nybegynder
15. februar 2004 - 16:38 #33
sender lige koden så du kan se om der er en fejl, kan være jeg har lavet kage i den:

data.jsp:

<%@ page import="java.sql.*" %>
<%
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con = DriverManager.getConnection("jdbc:odbc:TestMSAccess");
Statement stmt = con.createStatement();
if(request.getMethod().equals("POST")) {
    int F1 = Integer.parseInt(request.getParameter("F1"));
    String F2 = request.getParameter("F2");
    stmt.executeUpdate("INSERT INTO T1 VALUES (" + F1 + ",'" + F2 + "')");
}
%>
<!doctype html public "-//w3c/dtd HTML 4.01 Transitional//en">
<html>
<head>
<title>T1</title>
</head>
<body>
<h1>T1</h1>
<h2>Show data</h2>
<table border>
<%
ResultSet rs = stmt.executeQuery("SELECT * FROM T1");
while(rs.next()) {
%>
<tr>
<td><%=rs.getInt("F1")%></td>
<td><%=rs.getString("F2")%></td>
</tr>
<%
}
%>
</table>
<h2>Add data</h2>
<form method="post" action="data.jsp">
F1:<input type="text" name="F1" size="10">
<br>
F2:<input type="text" name="F2" size="20">
<br>
<input type="submit" value="Add">
</form>
</body>
</html>
Avatar billede arne_v Ekspert
15. februar 2004 - 16:43 #34
Jeg smed den ind i min Tomcat og den kørte fint.
Avatar billede arne_v Ekspert
15. februar 2004 - 16:44 #35
Er det en System DSN eller em User DSN du bruger ?
Avatar billede coolfisk Nybegynder
15. februar 2004 - 16:55 #36
går ind i control panel -
admin. tool -
Data Sources ODBC -
tilføjer Microft Access Driver under DSN
Avatar billede coolfisk Nybegynder
15. februar 2004 - 16:56 #37
er der andet man skal tilføje?
Avatar billede coolfisk Nybegynder
15. februar 2004 - 17:05 #38
User DSN
Avatar billede arne_v Ekspert
15. februar 2004 - 17:24 #39
Prøv lige med System DSN.

Hvis din JSP/servlet engine kører under et andet brugernavn så ...

Check også lige fil protection på MDB filen, hvis du bruger NTFS !
Avatar billede coolfisk Nybegynder
15. februar 2004 - 17:41 #40
det virker når man sætter den under System DSN.... Hvorfor det?
Avatar billede arne_v Ekspert
15. februar 2004 - 17:44 #41
En user dsn gælder kun  for en enkelt bruger.

Mit gæt er at Oracle JSP/Servlet engine kører som en anden bruger.
Avatar billede coolfisk Nybegynder
15. februar 2004 - 17:45 #42
mange tak :)
Avatar billede arne_v Ekspert
15. februar 2004 - 17:49 #43
Jeg opretter iøvrigt altid min DSN som system DSN på min PC.

Fordi det kun er mig der bruger den. Og jeg ikke gider bøvle med
hvad der nu kører under hvilke brugernavne.
Avatar billede arne_v Ekspert
06. marts 2004 - 15:41 #44
Lukke tid ?
Avatar billede arne_v Ekspert
25. juli 2004 - 23:13 #45
??
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