[JSP] object over querystring

Pagina: 1
Acties:

  • Krooswijk.com
  • Registratie: Mei 2000
  • Laatst online: 17-08-2024
hallo, ik heb het volgende probleem:

vanuit process.jsp wordt een zoekvraag naar een web service gestuurd welke een result xml retourneert. deze xml struct wordt omgezet naar een vector van zoekresultaten. deze vector moet nu naar result.jsp worden doorgezonden om daar te kunnen worden weergegeven.

nu heb ik wel vorige topics gevonden over communicatie tussen servlets en jsp pagina's maar zonder goeie antwoorden daar.

Java:
1
2
3
4
5
6
7
8
<%
    ....
    Vector queryOutput = responseMessage.getResponseContent( );
%>

<jsp:forward page="<%= bundle.getString( "query.success.forward" ) %>">
  <jsp:param name="queryOutput" value="<%= queryOutput %>" />
</jsp:forward>


uit de foutmelding blijkt dus dat de vector niet als parameter meegezonden kan worden.
hoe kan ik dit wel doen. ik kan het in een bean zetten, maar omdat het vluchtige informatie is, wil ik deze liever op deze manier meezenden.

  • Standeman
  • Registratie: November 2000
  • Nu online

Standeman

Prutser 1e klasse

parameters kunnen alleen een String bevatten. Nogal logisch omdat die data via een post of een get gaat.

Wat je wel kan doe is het object in je sessie zetten en dan in je servlet uitvragen.

The ships hung in the sky in much the same way that bricks don’t.


  • zneek
  • Registratie: Augustus 2001
  • Laatst online: 08-02-2025
Krooswijk.com schreef op vrijdag 17 maart 2006 @ 12:51:
hallo, ik heb het volgende probleem:

vanuit process.jsp wordt een zoekvraag naar een web service gestuurd welke een result xml retourneert. deze xml struct wordt omgezet naar een vector van zoekresultaten. deze vector moet nu naar result.jsp worden doorgezonden om daar te kunnen worden weergegeven.

nu heb ik wel vorige topics gevonden over communicatie tussen servlets en jsp pagina's maar zonder goeie antwoorden daar.

Java:
1
2
3
4
5
6
7
8
<%
    ....
    Vector queryOutput = responseMessage.getResponseContent( );
%>

<jsp:forward page="<%= bundle.getString( "query.success.forward" ) %>">
  <jsp:param name="queryOutput" value="<%= queryOutput %>" />
</jsp:forward>


uit de foutmelding blijkt dus dat de vector niet als parameter meegezonden kan worden.
hoe kan ik dit wel doen. ik kan het in een bean zetten, maar omdat het vluchtige informatie is, wil ik deze liever op deze manier meezenden.
Dan zul je zelf iets moeten implementeren wat een Vector omzet naar String en wel op zo'n manier dat de pagina waar naar geforward wordt de originele Vector weer op kan bouwen. Waarbij ik direct kan opmerken dat dat erg vervelend wordt als je niet weet wat er in die vector zit. Ik denk dat je beter af bent als je die Vector in de HttpSession of misschien in de Request zet, en in de pagina waar je naar toe forward dit weer uit de HttpSession of Request peutert.

[edit] spuit11 :) zelfde boodschap langer verhaal als mijn bovenbuurman hier :)

[ Voor 7% gewijzigd door zneek op 17-03-2006 13:08 ]


  • DaRKie
  • Registratie: December 2001
  • Laatst online: 23:05
objecten kan je niet als parameter doorsturen, deze kunnen namelijk enkel text bevatten. Je moet een object als attribute doorsturen.

edit:
dergelijke dingen in de sessie steken zou ik zeker afraden, tenzij je graag een overvolle sessie hebt wat tot performance issues kan leiden (je kan ze er uithalen natuurlijk, maar dat is extra werk)

Dit zou het moeten doen:
<jsp:attribute>

[ Voor 49% gewijzigd door DaRKie op 17-03-2006 13:12 ]


  • Krooswijk.com
  • Registratie: Mei 2000
  • Laatst online: 17-08-2024
in de tussentijd heb ik inderdaad gezien dat het puur en alleen een string kan bevatten. het vector<>string en string<>vector verhaal is inderdaad te omslachtig.

ik heb een
Java:
1
response.setAttribute( "queryOutput", queryOutput )
toegevoegd, maar krijg dan de foutmelding dat deze aanroep met een vector ook niet correct is, dus dan zou deze ook alleen voor strings gelden, maar wat is dan nog het verschil tussen setParameter en setAttribute...

en dan uiteraard de forward als volgt:
Java:
1
<jsp:forward page="<%= bundle.getString( "query.success.forward" ) %>" />


maar jullie hebben dus wel ervaring dat het zo zou moeten werken...

[ Voor 26% gewijzigd door Krooswijk.com op 17-03-2006 13:22 ]


  • zneek
  • Registratie: Augustus 2001
  • Laatst online: 08-02-2025
Krooswijk.com schreef op vrijdag 17 maart 2006 @ 13:14:
in de tussentijd heb ik inderdaad gezien dat het puur en alleen een string kan bevatten. het vector<>string en string<>vector verhaal is inderdaad te omslachtig.

ik heb een
Java:
1
response.setAttribute( "queryOutput", queryOutput )
toegevoegd, maar krijg dan de foutmelding dat deze aanroep met een vector ook niet correct is, dus dan zou deze ook alleen voor strings gelden, maar wat is dan nog het verschil tussen setParameter en setAttribute...

en dan uiteraard de forward als volgt:
Java:
1
<jsp:forward page="<%= bundle.getString( "query.success.forward" ) %>" />


maar jullie hebben dus wel ervaring dat het zo zou moeten werken...
Ik denk dat je request.setAttribute("queryOutput",queryOutput ); moet doen.

  • DaRKie
  • Registratie: December 2001
  • Laatst online: 23:05
het verschil is dat parameters van de html kant naar het achterliggende geheel gestuurd worden (dus enkel text)
attributen is de omgekeerde richting, en kunnen dus zeker weten objecten hebben:
http://java.sun.com/j2ee/...ttribute(java.lang.String, java.lang.Object)

Ik zie dat je response gebruikt om de attribute te zetten, moet dat niet request zijn? (jsp's zitten al wat verder weg bij mij, maar volgens mij loopt alle data via de request)

(ik doe waarschijnlijk iets verkeerd maar ik krijg de link niet klikbaar :))

[ Voor 77% gewijzigd door DaRKie op 17-03-2006 13:29 ]


  • Krooswijk.com
  • Registratie: Mei 2000
  • Laatst online: 17-08-2024
link werkt prima, ik had er inmiddels wel al request van gemaakt, maar tevergeefs...

de site waar jij naar linkt gaat over HttpServlets. Klopt het (voor mijn beeldvorming) dat de standaard objecten request en response binnen jsp dan servlets zijn?

krijg trouwens deze foutmelding (met en zonder Vector cast):

Type mismatch: cannot convert from Object to Vector
voor (inmiddels) deze regel:
Java:
1
2
3
4
5
6
7
<%
...
Vector queryOutput = responseMessage.getResponseContent( );
request.setAttribute( "queryOutput", (Vector)queryOutput );
%>

<jsp:forward page="<%= bundle.getString( "query.success.forward" ) %>" />

[ Voor 50% gewijzigd door Krooswijk.com op 17-03-2006 13:37 ]


  • DaRKie
  • Registratie: December 2001
  • Laatst online: 23:05
in servlets en jsp's gebruik je deze:
http://java.sun.com/j2ee/...p/HttpServletRequest.html, maar ServletRequest is de super interface van de http versie

kan je de fout/nieuwe code eens copy pasten? Want zo kunnen we ook niet zeggen wat er fout gaat nu

als ik mij niet vergis, wordt een jsp omgezet naar een servlet (intern)

edit:
ben dus juist :)
The Life Cycle of a JSP Page

A JSP page services requests as a servlet. Thus, the life cycle and many of the capabilities of JSP pages (in particular the dynamic aspects) are determined by Java Servlet technology and much of the discussion in this chapter refers to functions described in Chapter 10.

When a request is mapped to a JSP page, it is handled by a special servlet that first checks whether the JSP page's servlet is older than the JSP page. If it is, it translates the JSP page into a servlet class and compiles the class. During development, one of the advantages of JSP pages over servlets is that the build process is performed automatically.
EDIT2:
Type mismatch: cannot convert from Object to Vector
voor (inmiddels) deze regel:
ben je zeker dat de fout in die regel gebeurt? De fout zegt dat je een object in een vector wilt steken, in die regels gebeurt het omgekeerde, vector in een object(lukt altijd)

Volgens mij zit de fout waar je de attribute uitleest en in een vector wilt steken, daar moet je casten, niet in die regels dat jij aangeeft.

Of hier natuurlijk:
Java:
1
Vector queryOutput = responseMessage.getResponseContent( )


Ik weet niet wat de signature is van die methode, maar het kan zijn dat die dus een object teruggeeft en je daar moet casten.

[ Voor 77% gewijzigd door DaRKie op 17-03-2006 13:46 ]


  • Krooswijk.com
  • Registratie: Mei 2000
  • Laatst online: 17-08-2024
casting verplaatsen levert dezelfde melding...

een keer compleet:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%
...
    /**
     *    retrieve output hashmaps to vector for displaying results
     */
    Vector queryOutput = responseMessage.getResponseContent( );

    request.setAttribute( "queryOutput", (Vector)queryOutput );
%>

<%--
=====================================================================
                P A G E  F O R W A R D I N G
=====================================================================
--%>
<jsp:forward page="<%= bundle.getString( "query.success.forward" ) %>" />

levert
code:
1
2
3
4
5
6
7
8
9
10
11
12
org.apache.jasper.JasperException: Unable to compile class for JSP

An error occurred at line: 61 in the jsp file: /QueryResponse.jsp
Generated servlet error:
Type mismatch: cannot convert from Object to Vector


    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:375)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)


en deze variant

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%
...
    /**
     *    retrieve output hashmaps to vector for displaying results
     */
    Vector queryOutput = responseMessage.getResponseContent( );
%>

<%--
=====================================================================
                P A G E  F O R W A R D I N G
=====================================================================
--%>
<jsp:forward page="<%= bundle.getString( "query.success.forward" ) %>">
  <jsp:attribute name="queryOutput" value="<%= queryOutput %>" />
</jsp:forward>


levert deze foutmelding:
code:
1
2
3
4
5
6
org.apache.jasper.JasperException: /QuerySuccess.jsp(103,0) Forward has invalid attribute: queryOutput
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:375)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

[ Voor 14% gewijzigd door Krooswijk.com op 17-03-2006 13:56 ]


  • DaRKie
  • Registratie: December 2001
  • Laatst online: 23:05
Object is de super class van alles, dus een vector kan zonder problemen in een object gestoken worden want een vector is een object. Een object is echter geen vector.

Lijn 61 is welke regel in jou code blok?

jsp:attribute is dus verkeerd, dat zet een attribuut van een hoger gelegen tag, dus in jou geval "forward", maar de naam die jij geeft bestaat niet als attribute voor die tag, daarmee die fout

[ Voor 32% gewijzigd door DaRKie op 17-03-2006 14:02 ]


  • Krooswijk.com
  • Registratie: Mei 2000
  • Laatst online: 17-08-2024
oh ja dat wilde ik nog erbij vermelden, lijn 61 is waar het hele blok <% begint, dus ergens in dit jsp blok gaat er iets fout, exacter geeft ie niet. Eerst was deze code samen met de aangeroepen pagina en was de parameter direct oproepbaar en hoefde dus niet meegezonden te worden. Toen werkte alles, nu vindt er een loskoppeling plaats en wil ik de param overzenden dan gaat er iets mis. Dus ben wel van mening dat het om die regels moet gaan.

  • DaRKie
  • Registratie: December 2001
  • Laatst online: 23:05
het eerste moet normaal echt wel werken, dus als je deze regel weghaalt dan werkt het wel:
Java:
1
request.setAttribute( "queryOutput", (Vector)queryOutput );


Wat gebeurt er dan als je dit doet:
Java:
1
request.setAttribute( "queryOutput", new Vector() );

  • Krooswijk.com
  • Registratie: Mei 2000
  • Laatst online: 17-08-2024
ok ik had nog een cast foutje in de aangeroepen pagina:
Het ontvangen attribuut wordt nu wel naar de aangeroepen pagina verstuurd:
Java:
1
Vector queryOutput = (Vector)request.getAttribute( "queryOutput" );

pas na een restart van de pc werkte het goed.

Alleen nu bij het uitlezen van de ontvangen Vector b.v. later in de file heb ik size van de resultaten vector nodig.
Java:
1
<P><%= queryOutput.size( ) %> resultaten gevonden:</P>

geeft ie een nullpointerexception...
lijkt toch niet helemaal goed te zijn gegaan

[ Voor 5% gewijzigd door Krooswijk.com op 17-03-2006 14:32 ]


  • DaRKie
  • Registratie: December 2001
  • Laatst online: 23:05
Krooswijk.com schreef op vrijdag 17 maart 2006 @ 14:30:
ok ik had nog een cast foutje in de aangeroepen pagina
wat ik dus al een paar posts geleden zei :)

je moet de size eenst uitlezen voor je hem doorstuurt

wat soms helpt als je niet meteen de nieuwe jsp versie ziet, is de tmp class files verwijderen die gegenereerd zijn
Pagina: 1