26. marts 2010 - 19:53Der er
22 kommentarer og 1 løsning
Sende data til servlet fra midlet og omvendt
Jeg har nogle servletter, som alle har adgang til en database. Jeg vil gerne have adgang til denne database fra en midlet. Indtil videre er det lykkedes mig, at sendes besked fra midletten til servletten, hvorefter servletten henter data fra databasen, og sender den data tilbage til midletten, som så viser den data.
So far - so good.
Men nu vil jeg gerne sende værdier fra midletten over til en servlet, som så sætter den værdi ind i databasen, eller den foretager en forespørgsel på databasen ud fra værdien. Men jeg kan ikke få det til at virke. Den sidste del, som virker, der sendes KUN data fra servletten til midletten, hvilket sker, når servletten bliver aktiveret. Før dataen kan sendes over nettet, skal den ændres til byte[]. Dette virker også fint fra servletten, og fortolkningen virker også fint på midletten. Men når jeg skal gøre det den anden vej rundt, så giver det problemer. Og det er forskellige problemer, alt efter hvilken taktik jeg benytter. Jeg er ikke helt klar over, om det er når jeg konverterer værdien til byte[], eller når jeg forsøger at sende arrayet fra midletten til servletten, eller om det er når servletten skal modtage data, og få noget fornuftigt ud af det (og gerne sendes udtræk fra databasen tilbage til midletten).
Jeg har ikke ét konkret forsøg, som jeg kan vise, da jeg har prøvet en masse forskellige udgaver. Så hvis der er nogle, som kan vise mig et rigtig godt fungerende eksempel og evt. en vejledning, så vil det bare være super.
Jeg var ikke klar over, at man kan sende data fra/til midlet som form-data...?
Men det er A'eren, jeg har forsøgt indtil videre. Eller...jeg har forsøgt at konvertere dataene til et byte[], og så sende dem. Men jeg kan ikke få det til at virke...
#3: Ja, du siger noget. Sådan kan man selvfølgelig også vende argumenterne. Den havde jeg ikke lige set. Det må jeg lige teste....
#4: Nej, jeg har ikke fået checket det i den anden tråd. Men jeg tvivler nu på, at det vil virke. I alle de implementeringer, jeg har lavet, har der skullet stå noget i det omtalte felt...men man ved selvfølgelig aldrig :-)
#3: Jeg ser store muligheder, hvis denne metode virker. Men der findes vel ikke request.getParameter og request.setAttribute i java ME (hvad du ved af)?
Det skal jeg i hvert fald have undersøgt. For det vil lette data-tranmissionen betydeligt. Så slipper man for at åbne url'er, og sende data gennem OutputStream og InputStream, ligesom konvertering så vel ikke er aktuelt længere.
Ja, det har servletten. Det vil jeg også gerne udnytte. Men jeg havde ikke fornemmelsen for, at midletten havde samme muligheder. Jeg gik ud fra, at en midlet er kraftigt reduceret ift. teknikker og teknologier som f.eks. en servlet har.
Jeg skriver body (jeg går ud fra, at du mener "indholdet" med ordet "body") manuelt i midletten. Men når der skal udveksles data mellem midletten og servletten, så havde jeg fået indtrykket, at det skulle ske gemme input/outputstream. Men hvis man kan benytte form (og dermed request.getParameter), så vil det vel være meget lettere, hvis man gemmer en værdi der, og den anden side læser derfra, sammenlignet med at sende værdien gemme byte[] i input/outputstream?
Her bliver det forklaret (nogenlunde), hvordan man benytter output/inout-stream. Men det ser også ud til, at man kan benytte setRequestProperty (se Mar 25, 2007 1:03 AM). Og så må man kunne læse det på den anden side af forbindelsen, som vi har snakket om tidligere. Resten af posten handler dog om input/output-stream af uforklarige årsager.
Jeg tænkte på, hvordan ved de 2 sider (selvletten og midletten) at de kan dele request-properties? Er det fordi, de har åbnet en forbindelse mellem sig? Men det er vel kun den ene side, som åbner (via hc = (HttpConnection) Connector.open("http://82.44.144.58:8080/Timetable/Login.do"); ). Hvordan kan ender vide, hvad den anden ende gemmer i requestParamtren? Er det http/post/get-protokollen, som står for dette? Er det egentlig bare noget avanceret noget, som man ikke skal tænke så meget over, men bare konstatere, at sådan virker det?
Nu har jeg prøvet at ændre i min implementering, så det ligner eksemplet i min sidste post. Nu lægger jeg strengen ind i requestProperty på midlet-siden, og når jeg tester for, om strengen ligger der (på midlet-siden), så ligger den der også. Men når jeg prøver at tilgå den på servlet-siden, så giver det exceptions. Og det eneste jeg prøver på servlet-siden er:
System.out.println("Test request:"); in = request.getInputStream(); String requestTest=request.getParameter("data").toString(); System.out.println("Servlet->requestParameter= "+requestTest);
Hmm, ifølge http://72.5.124.102/thread.jspa?threadID=5405431&tstart=345 så skal benytte "request.getReader()" eller "request.getInputStream()". Men når jeg forsøger det i servletten, så giver det også fejl - getReader(): ".java.lang.IllegalStateException: PWC3997: getReader() has already been called for this request"
Men den løsning, som virker lige nu, den er vel også fin nok. Jeg har tænkt over, hvordan denne request egentlig virker. Når modtageren af requesten har læst værdien deri, skal modtageren så null-stille feltet ligesom hvis den var cached/session? Eller lever værdien kun i dette roundtrip, eftersom den eksisterer i !request"?
Nu har jeg forsøgt, at overføre eksemplet til noget jeg kan bruge rent praktisk. Efter lidt nørklen er jeg næsten i mål.
Jeg har fundet ud af, at for at der kan sendes data gennem headeren, så skal der åbnes:
HttpConnection hc = null; hc = (HttpConnection) Connector.open(url);
manuelt. Hvis man blot kalder servletten gennem url'en, så åbnes der vist ikke en tilstrækkelig forbindelse? Jeg gik ellers ud fra, at i selve tcp/ip-kaldet var en header, og det var heri informationen lå gemt? Hvis man SKAL lave en HttpConnection, SKAL man så også:
os = hc.openOutputStream(); os.write("random data");
for at der reelt sendes noget data over forbindelsen, hvorved headeren sendes med?
Det var de seneste tekniske overvejelser. Det praktisk spørgsmål, der mangler, før jeg er i mål med mit nye eksempel er, at jeg nu på servlet-siden gør dette:
#19: Jeg brugte intellisence til at udfylde metode-kaldene. Og derved valgte jeg "request.getHeaders()" hvilket naturligvis resulterer i en enumerator. Hvis jeg skriver "request.getHeader()" - altså uden 's' - så virker det igen :-)
Men jeg vil da gerne stadig have svar på mine tekniske overvejelser i #19...?
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.