[JSP][Servlets] Rare uitvoer

Pagina: 1
Acties:

  • Kapoen
  • Registratie: Mei 2002
  • Laatst online: 14:20
Via een combinatie van JSP en Servlets tracht ik een cookie te maken die
onthoud welke kleur een bezoeker van mijn website het liefste ziet.
(Geen echte site, gewoon een probeersel feitelijk)

Volgende code komt uit het .jsp bestandje:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<html>
<head>
<title>Kies een kleur</title>

<body>
<h1>Kies een kleur</h1>
<p>

<FORM METHOD="POST" ACTION="KiesKleurig.class">

<%@page import="org.jdom.*"%>
<%@page import="org.jdom.input.*"%>
<%@page import="java.util.*"%>

<%
    
  SAXBuilder b = new SAXBuilder(false);
  Document d = b.build(application.getRealPath("kleuren.xml"));
  Element k = d.getRootElement();
  
  Element leeg;
  
  List x = k.getChildren();
  int teller = x.size();  
    
  for(int i = 0; i < teller; i++) {
   leeg = ((Element)x.get(i));
   out.println("<INPUT TYPE=\"radio\" NAME=\"kleuren\" VALUE=" + 
   leeg.getText() + ">" + leeg.getQualifiedName() +  "<BR>");
    
  }
     
%>
<p>
<INPUT TYPE=submit VALUE="kies">
</FORM>

</body>
</head>
</html>


en dat geeft dit als uitvoer:
http://student.khleuven.be/~9940228/screen1.jpg

Dit formuliertje werkt prima. Maar als ik de uitvoer van dit formuliertje wil tonen op het scherm verschijnt er dit:
http://student.khleuven.be/~9940228/screen2.jpg

Deze uitvoer bekom ik via volgende servlet:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import javax.servlet.*;
import javax.servlet.http.*;
import java.text.*;
import java.io.*;
import java.util.*;

public class KiesKleurig extends HttpServlet {

    public void doPost(HttpServletRequest aanvraag, HttpServletResponse antwoord) 
        throws ServletException, IOException {

        String kleur;
        
        // alles klaarzetten om een antwoord te geven aan de cliënt
        antwoord.setContentType("text/html");
        PrintWriter uitvoer = antwoord.getWriter();
         
        
        kleur = aanvraag.getParameter("kleuren");
     
        // antwoord sturen
        uitvoer.println("<HTML>");
        uitvoer.println("<HEAD>");
        uitvoer.println("<TITLE></TITLE>");
        uitvoer.println("</HEAD>");
        uitvoer.println("<BODY><H1>Refresh deze pagina!</H1>");
        uitvoer.println(kleur + "\n");
        uitvoer.println("</BODY></HTML>");
     
        uitvoer.close();    
     
    }
}


Zoals je ziet zou normaal onder de <H1>...</H1> de gekozen kleur
moeten verschijnen, maar ook hier verschijnt er in de plaats een hoop rare tekens.

Ik heb reeds geprobeerd de printwriter te vervangen door een StringBuffer, echter met hetzelfde resultaat.

Wat doe ik hier fout?

Oja, mijn excuses voor de lijvigheid van deze post, maar ik wou geen enkel detail overslaan :)

Clowns to the left of me, Jokers to the right


Verwijderd

Bestudeer eens hoe serverside java precies werkt. Wat jij nu doet is aannemen dat .class bestanden automatisch door de webserver geintepretreteerd worden, maar dat is niet zo. In ieder geval moet je een servlet container als tomcat, resin of jrun geïnstalleerd hebben. Dan moeten de servlet classes ook nog in een bepaalde directory geplaatst worden en dan ook nog op een speciale manier aangeroepen worden (/servlet/ServletNaam meestal).

Wat je hier nu ziet is de inhoud van het class bestand (gecompileerde code, onleesbaar dus)

  • Kapoen
  • Registratie: Mei 2002
  • Laatst online: 14:20
Deze applicatie draait op resin en de .class file staat juist geplaatst.
(als ik de .class verplaats dan krijg ik een mooie 404 gepresenteerd
van resin)

Verder heb ik deze code gemaakt volgens een voorbeeld dat te vinden
is in 'Java How To Program' 3rd edition van Deitel&Deitel.

Ook daar werkt men op dezelfde wijze.

Het zou best kunnen dat het programma per se die .class file wilt
afdrukken, maar waarom wordt de <H1> dan wel juist geïnterpreteerd?

Heb ondertussen voor de zekerheid toch nog eens de resin documentatie
op nageslagen en daar maakt men melding dat .class in /WEB-INF/classes
moeten, maar men zegt er bij dat dit niet verplicht is aangezien je het pad
kan aangeven naar dit bestand (doe ik trouwens ook met 'kleuren.xml' in
deze code)

Clowns to the left of me, Jokers to the right


Verwijderd

Kapoen schreef op 12 november 2002 @ 19:51:
Deze applicatie draait op resin en de .class file staat juist geplaatst.
(als ik de .class verplaats dan krijg ik een mooie 404 gepresenteerd
van resin)
Wellicht goed geplaatst, maar fout aangeroepen.
Het zou best kunnen dat het programma per se die .class file wilt
afdrukken, maar waarom wordt de <H1> dan wel juist geïnterpreteerd?
Omdat er ook in die class file wel alle ascii strings voorkomen, waaronder dus ook die <h1> + tekst.
Heb ondertussen voor de zekerheid toch nog eens de resin documentatie
op nageslagen en daar maakt men melding dat .class in /WEB-INF/classes
moeten, maar men zegt er bij dat dit niet verplicht is aangezien je het pad
kan aangeven naar dit bestand (doe ik trouwens ook met 'kleuren.xml' in
deze code)
Ik gebruik zelf resin. Als ik een webapplicatie heb in zeg c:\resin\doc\myapp, dan moeten de servlets in c:\resin\doc\myapp\WEB-INF\classes geplaatst worden. Als ik een TestServlet.class in plaats, moet ik die aanroepen via http://localhost/myapp/servlet/TestServlet in deze aanroep zit iig nooit de .class extentie. Kijk naar de voorbeeld webapps die bij resin zitten en hoe ze aangeroepen worden, dan moet je er uit kunnen komen.

  • Kapoen
  • Registratie: Mei 2002
  • Laatst online: 14:20
ok nu werkt mijn programma

hartelijk dank _/-\o_ _/-\o_

oja, weet je per toeval een manier om die 'localhost' te vermijden
in het adres naar die .class file? Zou leuk zijn om een
applicatie te kunnen kopiëren naar een ander adres zonder meteen
weer in de code te moeten vliegen :).

Clowns to the left of me, Jokers to the right


Verwijderd

Kapoen schreef op 12 November 2002 @ 20:13:
ok nu werkt mijn programma

hartelijk dank _/-\o_ _/-\o_

oja, weet je per toeval een manier om die 'localhost' te vermijden
in het adres naar die .class file? Zou leuk zijn om een
applicatie te kunnen kopiëren naar een ander adres zonder meteen
weer in de code te moeten vliegen :).
Persoonlijk sla ik altijd de volledige url naar mijn servlet in een setting ergens op, aangezien je ook nog creatief kunt web.xml-en (mijn hoofdservlet roep je bijvoorbeeld niet aan met /servlet/package.MyServlet maar gewoon via /MyServlet) en om die mogelijkheid open te houden sla ik dus de complete url op, je servlet werkt zo locatie onafhankelijk.

Maar als je het echt wilt, kun je je hostname wel ergens in het request object oprvragen schat ik zo in, daarvoor moet je even zoeken in de API van HttpServletRequest.

  • Bobco
  • Registratie: Januari 2001
  • Laatst online: 30-10-2023

Bobco

I used to dream about Verona.

Verwijderd schreef op 13 November 2002 @ 08:17:
Maar als je het echt wilt, kun je je hostname wel ergens in het request object oprvragen schat ik zo in, daarvoor moet je even zoeken in de API van HttpServletRequest.
Zelf gebruik ik de Oracle appserver. Hierin is het mogelijk om binnen een webapplicatie gewoon naar een andere resource te wijzen door verwijzingen als "/servlet/eneservlet" en "/servlet/andereservlet". De appserver zoekt zelf uit wat de root van de applicatie is en plakt die er onder water voor. Werkt prima met dingen als forwarding en zo. Je hebt dan ook geen problemen als een applicatie van host A naar host B moet verhuizen.

With the light in our eyes, it's hard to see.

Pagina: 1