Avatar billede kkaen Nybegynder
24. marts 2010 - 14:43 Der er 24 kommentarer og
1 løsning

Problem med Request.getParameter

Jeg har en jsp-side, hvorpå der er en form. Der bliver overført en række felter, når der trykkes på submit. Men jeg vil gerne have mulighed for KUN at udfylde 1 felt, hvorpå resten af felterne bliver udfyldt automatisk ved tryk på en anden submit, som forårsager et opslag i en database.

Men det har givet problemer lige fra begyndelsen af. Jeg gik ud fra, at der kun kunne være 1 submit-knap tilknyttet en form. I det mindste så der kan henledes til en anden jsp-side, hvor der ikke checkes for de resterende felter. Derfor har jeg nu lavet en ny form, på samme jsp-side. Men problemet fortsætter.

Koden for begyndelsessiden er:

<table border="1" style="font-family: Arial, 'sans-serif'">
  <tr>
      <td style="vertical-align: top">
          <input value="Forskydelse" type="button"  style="visibility: hidden">
          <form method="POST" action="new.jsp" name="loginForm2" enctype="multipart/form-data" name="form2" id="form2">
            Tal til db-forespoergsel:<br>
          <input type="text" name="EditValue" id="EditValue" size="15" style="width: 100px">
          <br>
          <button name="getDbData" type="submit" style="font-family: Arial, 'sans-serif'"><b>Hent data</b></button>
          <button name="deleteData" type="submit" style="font-family: Arial, 'sans-serif'"><b>Slet data</b></button>
          </form>
        </td>
      </tr>
</table>

Koden for new.jsp:

<body>
<%
  System.out.println("In new.jsp");
  if (request.getParameter("EditValue") != null) {
      System.out.println("EditValue NOT null");
  } else {
      System.out.println("EditValue IS null");
  }

  String value = request.getParameter("EditValue");
  //her skal der modificeres på DB alt efter hvad "value" er
%>
</body>

Jeg kan ikke se, hvad problemet kan være. Er der nogle, som har et godt hint?
Avatar billede arne_v Ekspert
24. marts 2010 - 14:52 #1
Du har to muligheder:

A) den solide loesning fra 2002

form1.jsp - udfyld et felt og submit til form2.jsp

form2.jsp - viser resten af felterne men med defualt udfra den valgte vaerdi af den foerste

B) en 2010 loesning

Opdater felterne via AJAX
Avatar billede arne_v Ekspert
24. marts 2010 - 14:57 #2
Med hensyn til AJAX, saa er der flere veje.

1) manuel AJAX

Generelle AJAX Framework skan ogsaa bruges med JSP.

2) AJAX taglib

For ren JSP er der f.eks. http://ajaxtags.sourceforge.net/, som er lidt tricky at bruge, men som godt kan bringes til at virke.

3) JSF og AJAX komponenter

JSF med f.eks. Richfaces er er ret cool.
Avatar billede kkaen Nybegynder
24. marts 2010 - 14:57 #3
AJAX må jeg hellere holde mig fra...indtil videre.

Jeg kan forstå ud fra hvad du har skrevet i A), at der ikke kan være 2 forms på samme jsp-side. Det vil så sige, at jeg bliver nødt til at submit'e gennem samme submit-knap, og så må jeg blot foretage mit check på om der er angivet noget i de andre felter på en anden måde?
Avatar billede kkaen Nybegynder
24. marts 2010 - 15:03 #4
Jeg har også overvejet, om jeg skulle hæfte parametren på url'en manuelt. Så kunne jeg lave en knap, som virker som et simpelt link, hvor der så bliver puttet parametren på samt den indtastede værdi helt til slut. Men kan sådan et link godt overføres som "GET", så man ikke kan se værdien? Det er egentlig ikke så vigtigt, for brugeren er jo godt klar over værdien i forvejen. Så vil det være en mulig løsning, hvis man laver sådan en knap?
Avatar billede kkaen Nybegynder
24. marts 2010 - 15:04 #5
Jeg har også overvejet, om jeg skulle hæfte parametren på url'en manuelt. Så kunne jeg lave en knap, som virker som et simpelt link, hvor der så bliver puttet parametren på samt den indtastede værdi helt til slut. Men kan sådan et link godt overføres som "GET", så man ikke kan se værdien? Det er egentlig ikke så vigtigt, for brugeren er jo godt klar over værdien i forvejen. Så vil det være en mulig løsning, hvis man laver sådan en knap?
Avatar billede kkaen Nybegynder
24. marts 2010 - 15:04 #6
Jeg har også overvejet, om jeg skulle hæfte parametren på url'en manuelt. Så kunne jeg lave en knap, som virker som et simpelt link, hvor der så bliver puttet parametren på samt den indtastede værdi helt til slut. Men kan sådan et link godt overføres som "GET", så man ikke kan se værdien? Det er egentlig ikke så vigtigt, for brugeren er jo godt klar over værdien i forvejen. Så vil det være en mulig løsning, hvis man laver sådan en knap?
Avatar billede kkaen Nybegynder
24. marts 2010 - 15:09 #7
"Du kan godt have 2 forme paa samme JSP side, men da du alligevel skal have et server roundtrip ved submit af den foerste kan jeg ikke se nogen grund til at have 2 forme paa samme side. "

Jeg har sat en masse javascript ind, som laver check på, om man har udfyldt nok af felterne i formen, og om de er udfyldt korrekt.
Når man så udfylder dette ene felt, så man kan hente værdier fra db, så er alle disse check overflødige. Derfor skal der ledes udenom javascript-funktionen, hvilket hurtigt kunne gøres ved oprettelse af en ny form.
Avatar billede arne_v Ekspert
24. marts 2010 - 15:05 #8
Du kan godt have 2 forme paa samme JSP side, men da du alligevel skal have et server roundtrip ved submit af den foerste kan jeg ikke se nogen grund til at have 2 forme paa samme side.
Avatar billede arne_v Ekspert
24. marts 2010 - 15:06 #9
Du kan godt angive en parameter i action url for en form.

Men den kan ses.

Hvis du vil gemme en parameter, saa kan du lave et hidden field.
Avatar billede kkaen Nybegynder
24. marts 2010 - 15:11 #10
Hidden field har jeg også forsøgt mig med (det tog flere timer). Problemet er så, at den indtastede værdi så skal over i det "hidden field" (?), hvilket jeg forsøgte med javascript. Men jeg gav som sagt op efter et par timer...

Jeg prøvede at debugge mig frem, så et hidden field havde en værdi tilknyttet som default. Men når den læsende jsp så skulle læse værdien, så påstod den, at værdien var "null".
Avatar billede kkaen Nybegynder
24. marts 2010 - 15:27 #11
Det undrer mig bare, hvorfor jeg pludselig ikke kan checke med

request.getParameter("feltnavn");

Så får jeg hele tiden "null". Er det fordi, jeg har flere forms på spørgesiden, eller hvad kan det være?
Avatar billede arne_v Ekspert
24. marts 2010 - 18:04 #12
Jeg er lidt forvirret over hvad du vil have.

Men nu har jeg gjordt noget som jeg nok kommer til at fortryde.

Proev og koer dette lille eksempel og fortael om det er noget i den stil du vil have.

<%!
private String lookup(String postnr) {
    if(postnr.equals("6000")) {
        return "Kolding";
    } else if(postnr.equals("7000")) {
        return "Fredricia";
    } else if(postnr.equals("7100")) {
        return "Vejle";
    } else {
        return "Ukendt";
    }
}
%>
<%
String[] sublbl = { "ERROR", "Udfyld resten", "Udfør", "Ret data" };
int step = 0;
if(request.getParameter("postnr") == null || request.getParameter("postnr").equals("")) {
    step = 1;
} else if(request.getParameter("by") == null || request.getParameter("by").equals("")) {
  step = 2;
} else {
  step = 3;
}
%>
<form method="post">
Postnr.: <input type="text" name="postnr" value="<%=step > 1 ? request.getParameter("postnr") : ""%>">
<br>
By : <% if(step > 1) { %><input type="text" name="by" value="<%=step > 2 ? request.getParameter("by") : lookup(request.getParameter("postnr"))%>"><% } %>
<br>
<input type="submit" value="<%=sublbl[step]%>">
</form>
<% if(step > 2) { %>
Du har indtastet <%=request.getParameter("postnr")%> og <%=request.getParameter("by")%>.
<% } %>
Avatar billede arne_v Ekspert
24. marts 2010 - 18:05 #13
Og koden er naturligvis saa grim at selv rimeligt haardhudede ASP classic og PHP 4 programmoerer vil vaere rystet, men ...
Avatar billede kkaen Nybegynder
25. marts 2010 - 09:01 #14
"programmoerer vil vaere rystet, men ... " ->
If it works - don't fix it!

Men "Skrevet ons. d. 24. marts 2010 kl. 18:04:57" tror jeg nu ikke, har så meget med mit problem at gøre.

Men hvis det er forvirrende, det jeg har skrevet indtil videre, så tager vi den da bare en gang til :-)

På en jsp-side har jeg en masse felter i en form. Disse felter skal ved "submit" sættes ind i en databse. Den del virker.
Så vil jeg gerne lave en yderligere knap, som henter informationer fra databasen, og sætter dem ind i de dertilhørende felter i formen.

Jeg gik ud fra, at når man ville have mere end 1 submit-knap på en jsp-side, så skulle man have tilsvarende antal forms. Derfor oprettede jeg en ny form (som skulle stå for hent af data) inde i den eksisterende form. Da jeg ikke kunne få dette til at virke, har jeg også prøvet at sætte den nye form udenfor den første form, men virker heller ikke.

I "action" har jeg angivet en anden jsp-side, som står for det funktionelle, hvorefter der ledes tilbage til den oprindelige jsp-side. Og det der undrer mig meget er, at når jeg nu submitter til den anden jsp-side, så er requesten på værdien hele tiden "null".
Avatar billede kkaen Nybegynder
25. marts 2010 - 09:15 #15
Nu har jeg forsøgt, at oprette et nyt felt inde i den oprindelige form (formen virkede fint nok tidligere), og så glemme alt om mere end 1 form. Når jeg så prøver at læse værdien på den jsp-side, der submit'es til via:

String value=request.getParameter("typedValue");
System.out.println(value);

Så får jeg en
"org.apache.jasper.JasperException: java.lang.StringIndexOutOfBoundsException: String index out of range: -2"

Jeg har tidligere fået en exception med "index out of range: -2", men den greb jeg blot som en exception, hvorefter jeg fik tingene til at virke, som de skulle. Men siger denne fejl noget om årsagen?
Avatar billede kkaen Nybegynder
25. marts 2010 - 09:47 #16
Da det bliver værre og værre, har jeg nu prøvet at lave 2 helt nye jsp-sider, hvor jeg KUN vil implementere problemet.

Siderne ser således ud:

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <form method="POST" action="receiveData.jsp" enctype="multipart/form-data" name="form2" id="form2">
            Data for punkt til ændring:<br>
            <input type="text" name="dataField" size="20">
            <br>
            <button name="getData" type="submit" style="font-family: Arial, 'sans-serif'"><b>Hent data</b></button>
        </form>
    </body>
</html>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<%
            try {
                String value = request.getParameter("dataField").toString();
                System.out.println("Value= " + value);
            } catch (NullPointerException ex) {
                System.out.println("Exception= " + ex.getMessage());
            }%>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
    </body>
</html>


Men der modtages stadigvæk ikke nogen værdi. Overser jeg noget helt grundlæggende her eller er det opsætningen af hele mit system, der kan have en fejl?
Avatar billede kkaen Nybegynder
25. marts 2010 - 11:03 #17
Genialt - nu har jeg fået skidtet til at virke (ad en omvej godt nok).

I stedet for at lade formen stå for det tekniske, så jeg jeg smidt noget javascript ind som mellemled.

Nu ser det således ud (kun den nye kode på jsp-siden):

Client:

<SCRIPT type="text/JavaScript">
    function testResults (form) {
        var TestVar = form.dataField.value;
        var url="http://localhost:21179/Server/receiveData.jsp?dataField=";
        window.location = url+TestVar;
    }
</SCRIPT>

    <form method="POST" action="receiveData.jsp" name="loginForm2" enctype="multipart/form-data" id="form2">
        Data for punkt til ændring:<br>
        <input type="text" name="dataField" size="20">
        <br>
        <button name="getData" type="button" onclick="testResults(this.form)" style="font-family: Arial, 'sans-serif'"><b>Hent data</b></button>
    </form>

Server:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<%
            try {
                String value=(String)request.getParameter("dataField");
                System.out.println("Value= " + value);
            } catch (NullPointerException ex) {
                System.out.println("Exception= " + ex.getMessage());
            }%>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
    </body>
</html>

Men det kan vel ikke være rigtigt, at man skal tage sådan en omvej, for at få det til at virke (for det er vel en omvej? En form burde da kunne klare det?)?
Avatar billede arne_v Ekspert
25. marts 2010 - 18:58 #18
Virker #16 hvis du sletter:
  enctype="multipart/form-data"
?
Avatar billede kkaen Nybegynder
29. marts 2010 - 09:45 #19
Nu har jeg prøvet at slette:
enctype="multipart/form-data"

Men problemerne fortsætter på sin vis.
Efter jeg har slettet det førnævnte, så kan jeg vist godt trække værdier ud af request.getParameter().

For at få et ordentligt overblik over requesten, har jeg lavet dette:
Enumeration enumerationVar=request.getParameterNames();
while(enumerationVar.hasMoreElements()){
  String paramName = (String)enumerationVar.nextElement();
  String[] paramValues = request.getParameterValues(paramName);
  for(int index=0; index<paramValues.length; index++){
    System.out.println("Enumeration= "+paramValues[index]);
  }
}
Og her bliver elementerne skrevet ud - når jeg ikke vælger at uploade filer samtidig. Når jeg vælger at uploade filer samtidig, så får jeg denne fejl:
SEVERE: org.apache.commons.fileupload.FileUploadBase$InvalidContentTypeException: the request doesn't contain a multipart/form-data or multipart/mixed stream, content type header is application/x-www-form-urlencoded

Og da applikationer er afhængig af, at der kan uploades filer samtidig med dette roundtrip, har jeg indsat enctype="multipart/form-data" igen. Og så kommer der pludselig ingen data med i Enumeration enumerationVar=request.getParameterNames(); eller andre steder.

Jeg har læst andre steder på nettet, at jeg vist ikke er den eneste, som har problemer med at en form pludselig ikke fungerer længere, når der skal uploades filer. Men jeg har ikke kunnet finde nogen løsning på det...eller en forklaring.
Den eneste mulige løsning, jeg har kunnet finde, er:
http://www.javazoom.net/jzservlets/uploadbean/uploadbean.html

Men dette er vel ikke en tilfredsstillende løsning i det lange løb?
Avatar billede kkaen Nybegynder
29. marts 2010 - 11:24 #20
Nu har jeg modificeret lidt i diverse javascript-funktioner. Men jeg er egentlig ikke sikker på, at de har haft en afgørende indflydelse.

Men nu kan jeg få form-værdier over på næste side. Dette gøres ved:

if (item.isFormField()) {
  String name = item.getFieldName();
  String value = item.getString();
}

Men denne funktion har været på siden hele tiden. Og da problemet stadig var der, der gik scopet slet ikke ned til denne del af koden på siden. Muligvis pga. "org.apache.jasper.JasperException: java.lang.StringIndexOutOfBoundsException: String index out of range: -2"

Men jeg er sådan set stadig i vildrede omkring hvorfor problemet var der, og hvad løsningen egentlig var? Det kan vel ikke være fordi, jeg forsøgte at trække form-værdierne ud gennem request.getParameter(), og at det så forårsagede en exception?
Avatar billede arne_v Ekspert
29. marts 2010 - 18:43 #21
Ah.

Nu naermer vi os jo sagens kerne.

enctype="multipart/form-data" bruger man normnalt ikke, men man skal bruge dem til fil upload.

request.getParameter duer ikke sammen med den.

Men du kan hente text parametrene ud paa anden vis med Apache FileUpload.
Avatar billede arne_v Ekspert
29. marts 2010 - 18:45 #22
Et lille stykke kode fra lageret:

<%@page import="org.apache.commons.fileupload.*,java.util.*,java.io.*"%>
<%
DiskFileUpload upload = new DiskFileUpload();
List files = upload.parseRequest(request);
for(int i = 0; i < files.size(); i++) {
  FileItem file = (FileItem)files.get(i);
  if(file.getFieldName().equals("beskrivelse")) {
      String beskrivelse = file.getString();
      out.println("beskrivelse=" + beskrivelse);
  }
  if(file.getFieldName().equals("fil")) {
      String filename = "C:\\test.upl";
      file.write(new File(filename));
  }
}
%>

beskrivelse er en type="text" og fil er en type="file".
Avatar billede kkaen Nybegynder
12. april 2010 - 15:07 #23
Arne_v -> lægger du lige et svar, så vi kan få dette spørgsmål lukket?
Avatar billede arne_v Ekspert
12. april 2010 - 20:06 #24
OK
Avatar billede arne_v Ekspert
26. april 2010 - 03:11 #25
så mangler du bare at acceptere
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