24. marts 2010 - 14:43Der 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.
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
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?
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?
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?
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?
"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.
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.
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".
"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".
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:
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?
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?
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?)?
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?
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?
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.