Avatar billede jgp Nybegynder
30. april 2003 - 13:34 Der er 23 kommentarer og
1 løsning

Løb form felter igennem, på submit side

Hej,

Jeg er igang med at oversætte en ASP applikation til en JSP applikation. Dog er jeg ret ny til JSP, og det er her I kommer ind i billedet. Håber I kan hjælpe mig:

Jeg har følgende ASP kode, som jeg kunne tænke mig oversat til JSP. Jeg behøver nødvendigvis ikke den endelige kode, blot en ide til hvordan jeg kan komme igang vil være rar.

'** Run through items in submitted form **'
For Each Itm In Request.Form
  colums = colums & itm & ", "
  For i = 1 to Request.Form(itm).Count
    If IsNumeric(Request.Form(itm)(i)) Then
      input = input & Request.Form(itm)(i) & ", "
    Else
      input = input & "'" & Replace(Request.Form(itm)(i), "'", "chr(39)") & "', "
    End If
  Next
Next

'** Build and execute SQL **'
If colums <> "" Then
  SQL = "INSERT INTO kundeunder ("&Left(colums, Len(colums)-2)&") VALUES("&Left(input, Len(input)-2)&");"
  conn.execute(SQL)
End If

På forhånd tak.
Johannes
Avatar billede jgp Nybegynder
30. april 2003 - 13:35 #1
Det skal måske lige siges, at det der volder min hjerne problemer er hovedsagligt For Each Itm... delen. Den har jeg inden ide om hvordan man laver i JSP
Avatar billede arne_v Ekspert
30. april 2003 - 13:41 #2
Map m = request.getParameterMap();
Iterator it = m.keySet().iterator();
while(it.hasNext()) {
  String paramname = (String)it.next();
  String paramvalue = (String)m.get(paramname);
}

var ihvertfald en mulighed.
Avatar billede arne_v Ekspert
30. april 2003 - 13:43 #3
Alternativ:

Enumeration e = request.getParameterNames();
while(e.hasMoreEelements()) {
  String paramname = (String)e.nextElement();
  String paramvalue = (String)request.getParameter(paramname);
}
Avatar billede jgp Nybegynder
30. april 2003 - 14:27 #4
Tak for det hurtige svar.

Jeg får denne fejl:
Method getParameterMap() not found in interface javax.servlet.http.HttpServletRequest.
                Map m = request.getParameterMap();
Jeg har importet <%@ page import="javax.servlet.http.HttpServletRequest" %>.
Avatar billede arne_v Ekspert
30. april 2003 - 14:34 #5
Det lyder mystisk. Jeg checker lige for stave-fejl.

Hvad server bruger du ?

(Du behøver ikke den import - den er der automatisk)
Avatar billede arne_v Ekspert
30. april 2003 - 14:43 #6
Jeg forstår stadig ikke fejlen.

Jeg fandt dog en anden fejl:

paramvalue er i det første tilfælde String[] og ikke String.

Jeg har nu testet følgende loop.jsp på Tomcat:

<%@page import="java.util.*"%>
<form method="post" action="loop.jsp">
<input type="text" name="f1">
<br>
<input type="text" name="f2">
<br>
<input type="submit" value="submit">
</form>
<%
Map m = request.getParameterMap();
Iterator it = m.keySet().iterator();
while(it.hasNext()) {
  String paramname = (String)it.next();
  String[] paramvalue = (String[])m.get(paramname);
%>
<%=paramname%> <%=paramvalue[0]%>
<br>
<%
}
Enumeration e = request.getParameterNames();
while(e.hasMoreElements()) {
  String paramname = (String)e.nextElement();
  String paramvalue = (String)request.getParameter(paramname);
%>
<%=paramname%> <%=paramvalue%>
<br>
<%
}
%>
Avatar billede arne_v Ekspert
30. april 2003 - 14:44 #7
(og det virker)
Avatar billede jgp Nybegynder
30. april 2003 - 15:17 #8
Jeg bruger WebSphere.

Får stadig fejlen:
org.apache.jasper.JasperException: Unable to compile class for JSPE:\WebSphere\AppServer\temp\hd app serverWebApp\BU\_test_5F_submit_jsp_0.java:95: Method getParameterMap() not found in interface javax.servlet.http.HttpServletRequest.
                Map m = request.getParameterMap();
                                              ^
Avatar billede arne_v Ekspert
30. april 2003 - 15:20 #9
Kan du bruge den anden metode i.s.f. ?
Avatar billede arne_v Ekspert
30. april 2003 - 15:23 #10
Så vidt jeg kan se på:
http://java.sun.com/products/servlet/2.2/javadoc/javax/servlet/http/HttpServletRequest.html
http://java.sun.com/products/servlet/2.3/javadoc/javax/servlet/http/HttpServletRequest.html

så er getParameterMap ny i Servlet 2.3 - og Servlet 2.3 er J2EE 1.3 - og
WebSphere 4 er kun J2EE 1.2 !

Så alt har sikkert sin logiske forklaring.

Men getParameterNames er i Servlet 2.2 / J2EE 1.2 / WebSphere 4.
Avatar billede jgp Nybegynder
30. april 2003 - 15:44 #11
Så får jeg nogen lunde samme fejl, bare:

Method hasMoreEelements() not found in interface java.util.Enumeration.
                while(e.hasMoreEelements()) {
                                        ^
Avatar billede jgp Nybegynder
30. april 2003 - 15:45 #12
aha, et e formeget i: hasMoreEelements()) = hasMoreElements())

Jeg roder videre med det.
Avatar billede jgp Nybegynder
30. april 2003 - 15:50 #13
Hej Arne,

Det ser ud til at spille max. Er det okey jeg venter med at lukke spørgsmålet og ive dig pointne til imorgen? (Vil gerne have det med SQL sætningen til at virke også, og går snart hjem)

Forløbig mange tak for hjælpen.
Mvh Johannes
Avatar billede arne_v Ekspert
30. april 2003 - 15:54 #14
Selvfølgelig er det OK.

Skal du også have lidt hjælp til SQL'en ?
Avatar billede arne_v Ekspert
30. april 2003 - 15:55 #15
Kender du lidt til JDBC ?
Avatar billede jgp Nybegynder
30. april 2003 - 16:18 #16
Kender og kender. Jeg ved hvad det er, men har næsten ikke arbejdet med den.

Jeg har fået lavet min SQL string. Jeg mener at jeg har en classe som jeg kan bruge til at execute den med.

Skriver imorgen, hvis jeg skulle få prøv for hjælp. Tak igen :-)
Johannes
Avatar billede jgp Nybegynder
01. maj 2003 - 16:38 #17
FYI: Jeg nåede desvære ikke videre i dag. Håber/regner med jeg får tid imorgen.
Avatar billede jgp Nybegynder
02. maj 2003 - 09:18 #18
Så er jeg på banen igen.

Min kode ser nu sådan her ud:
<%@ page import="java.util.*" %>

<%
int tmp = 0;
String value = "";
String field = "";
String sql = "";

Enumeration e = request.getParameterNames();
while(e.hasMoreElements()) {
  String paramname = (String)e.nextElement();
  String paramvalue = (String)request.getParameter(paramname);
  if (!paramvalue.equalsIgnoreCase("")) {
    field += paramname + ",";
    try {
      tmp = Integer.parseInt(paramvalue);
      value += paramvalue + ",";
    }
    catch (NumberFormatException nfe) {
      value += "'" + whd.Utilities.toHTMLString(paramvalue) + "',";
    }
  }
}
if (field.length() > 1) {
  field = field.substring(0, field.length()-1);
  value = value.substring(0, value.length()-1);
  sql = "INSERT INTO kundeunder (" + field + ") VALUES(" + value + ")";
}
%><%=sql%>

Du er velkommen til a kommenterer, hvis der er noget "grim" kode.

Jeg har en SQLutil classe, som jeg før har brugt til at eksekverer SQL med. Dog er denne noget stor i forhold til hvad man eksemple behøver at bruge i ASP. Ved godt det lyder lidt ladt, men er der en nem måde at eksekverer min sql variable imod min database?

Igen tak forhjælpen, du behøves selvfølig ikke nødvendigvis at svare på dette tillægsspørgsmål for at du får dine point :-)

Mvh
Johannes
Avatar billede arne_v Ekspert
02. maj 2003 - 09:44 #19
Det skal nok virke.

Men kan naturligvis altid finde nogle ting som kune gøres anderledes.

Men smag og behag er som bekendt forskellig.

Så ingen forslag til forbedringer men 2 spørgsmål:

1)  Kender du JDBC PreparedStatement ? (med den behøver man ikke
    tænke på strenge med ' i)

2)  Er du opmærksom på at numerisk/tekst data værdier og
    numerisk/tekst tabel felter ikke behøves at følges ad ?
Avatar billede arne_v Ekspert
02. maj 2003 - 09:49 #20
Nu kender jeg jo ikke din SQLutil klasse, så det er svært at sige.

Der er rigtigt mange måder at lade JSP gemme i en database.

Du kan have JDBC kald direkte i din JSP side.

Du kan have en lille Java klasse mellem din JSP side og
JDBC kaldene.

Du kan bruge JSTL som har nogle tags til database adgang.

Du kan bruge EJB.

Du kan bruge JDO.

Men gennemgående har Java verdenen nok prioriteret at der skal være
mange muligheder fremfor at det skal være simpelt i API definitionerne.
Avatar billede jgp Nybegynder
02. maj 2003 - 09:58 #21
1) Nej, tror ikke jeg kender til den.

2) Jeg forstår ikke helt spørgsmålet?

Jeg prøver at rode med min SQLutil klasse, den burde kunne klare denne opgave også.
Avatar billede arne_v Ekspert
02. maj 2003 - 10:04 #22
Normal Statement er:

Statement stmt = conn.createStatement();
stmt.executeUpdate("INSERT INTO T (F1, F2) VALUES (1, 'A'));
stmt.executeUpdate("INSERT INTO T (F1, F2) VALUES (2, 'BB'));

og det har naturligvis et problem med ' i tekster.

Prepared statement er:

PreparedStatement pstmt = conn.prepareStatement("INSERT INTO T (F1, F2) VALUES (?, ?));
pstmt.setInt(1, 1);
pstmt.setString(2,"a");
pstmt.execxuteUpdate();
pstmt.setInt(1, 2);
pstmt.setString(2,"bb");
pstmt.execxuteUpdate();

og der har ihvertfald 2 fordele:

1)  lille smule bedre performance fordi SQL strengen kun skal parses
    en gang

2)  ingen problemer med ' i tekster
Avatar billede arne_v Ekspert
02. maj 2003 - 10:08 #23
Jeg tænkte bare på at hvsi databasen havde felter:
  F1 - integer
  F2 - varchar(50)
men den blev kaldt med værdierne A og 1, så ville koden faktisk
generere:
  INSERT INTO T (F1, F2) VALUES('A', 1);
hvilket vil give fejl i executeUpdate.

Helt principielt bør tal/tekst jo afhænge af typerne i databasen
ikke af de angive værdier.

Mest en pricipiel betragtning. Formentligt ikke det store
praktiske problem.

Og det er ikke noget nyt i JSP udgaven - præcis det samme må gælde i ASP
udgaven.
Avatar billede jgp Nybegynder
02. maj 2003 - 10:30 #24
Kan godt se problemet med at jeg forvnter at tal/tekst værdierne er "på plads". Går ud fra jeg burde lave noget check på dette!

Jeg kan også godt se pointen med preparedstatements. Og jeg vil nok også selv vælger den løsning. I tilfældet her er der i forvejen lavet en masse klasser som jeg kan bruge, og det smarteste vil nok være at forsætte med at bruge de klasser.

1000 tak for alt hjælpen. Jeg mener at have løst alleudfordringerne for denne gang.
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