Avatar billede tomred Nybegynder
18. januar 2003 - 17:49 Der er 17 kommentarer og
2 løsninger

Resin - Method not implemented

Har en form med et input-felt. Der POST'es til en servlet der forwarder til samme form igen.

Første gang formen submittes går det godt, men næste gang der submittes får jeg fejlen '501 Method not implemented'.

Udfra loggen ses det at første submit tolkes korrekt af Resin, nemlig som en POST
  POST /login HTTP/1.1
  HTTP/1.1 200 OK
hvorimod næste submit forsøger at kalde en funktion der er enslydende med navnet på mit input-felt på formen
  HVADSKERDERHER= /login HTTP/1.1
  HTTP/1.1 501 Method not implemented

Problemet opstår kun når der rent faktisk er et felt på formen.
Jeg har testet på Tomcat 4.0.3 og her er der ingen problemer, så umiddelbart har jeg mistanke om at det er Resin der 'kløjs' i forwarden.
Nogen der har en forklaring på problemet? Og evt. om det er en bug i Resin (Jeg kan ikke opstøve den på buglisten)?

Jeg kan lave en sendRedirect istedet for forward, men det er ikke det jeg (umiddelbart) ønsker.

Problemet kan genskabes udfra nedenstående kode. Jeg har ikke vedhæftet resin.conf eller web.xml. Lad mig høre om det alligevel kunne være en konfigurationsproblem.

Håber der er en der kan give en forklaring!

******* JSP fil *******
<html>
<BODY>
<form action="login" method="POST">
    <input type="text" name="HVADSKERDERHER">
    <input class="button" type="submit" value="Login">
</form>
</BODY>
</html>

******* Servlet *******
import javax.servlet.*;
import javax.servlet.http.*;

public class Login extends HttpServlet
{
  public void doPost( HttpServletRequest request,  HttpServletResponse response ) throws ServletException
  {
    try {
    getServletConfig().getServletContext().getRequestDispatcher("/login.jsp").forward(request, response);
    } catch (Exception e) {}
  }
}
Avatar billede arne_v Ekspert
18. januar 2003 - 18:03 #1
[jeg har ikke selv Resin, så jeg famler mig lidt frem]

Et interessant spørgsmål er:

du åbner login.jsp første gang
du klikker submit
login servler forwarder til login.jsp

hvordan ser HTML så ud i view source ?

Hvis der står:
  <form action="login" method="POST">
så går det galt i input til servlet anden gang.

Hvis der står:
  <form action="login" method="HVADSKERDERHER">
så er det forwarden fra servlet til JSP der er gået galt.

[det løser ikke problemet at vide, men det kan give lidt spor
om præcis hvor det går galt]
Avatar billede tomred Nybegynder
18. januar 2003 - 18:08 #2
Supergodt med din hurtige respons!

HTML siger POST efter den første forward.

Måske er der noget der hænger fra første response/request som evt. kunne resettes?
Avatar billede disky Nybegynder
18. januar 2003 - 18:13 #3
Øh hvorfor bruger du en servlet til dette ?

Der er ingen grund til at bruge servlets til andet end at generere binært data med, f.eks. gif billeder osv.


Prøv med:
try {
    response.sendRedirect("/login.jsp");
    } catch (Exception e) {}


Det virker i hvertefalde, når man bruger det i en jsp side istedet for i en servlet.
Avatar billede arne_v Ekspert
18. januar 2003 - 18:19 #4
Det er vist ret almindeligt at lave POST til servlets der
forwarder til JSP.

Kode i servlet og HTML i JSP !

Det kunne være interessant at vide om redirect virker, men
forward er det meste rigtige - og bør også virke.
Avatar billede tomred Nybegynder
18. januar 2003 - 18:32 #5
Fint nok med sendRedirect, men som jeg skriver er det ikke den løsning jeg ønsker på problemet. Jeg har aldrig haft problemer med at forwarde fra mine servlets før ... først efter en tur på Resin.

Disky: Du har ret mht. anvendelsen af servlets, men ovenstående problem er taget ud af en større sammenhæng hvor der rent faktisk er rigtig god grund til at bruge servlets. Jeg har blot barberet eksemplet ned til et minimum hvor problemet kan genskabes.
Avatar billede disky Nybegynder
18. januar 2003 - 18:54 #6
nej arne

Design i JSP
Kode i klasser
Data i databaser

Servlets er en mere besværlig måde at gøre det en jsp kan, netop fordi JSP er en overbygning på en servlets, de bliver ligesom lavet om til servlets inden kompiling.

Det eneste servlets reelt bliver brugt til idag er eventuelt en controller i et MVC pattern.

Men mange nybegyndere går døde på det mere besvær en servlet giver.


Tomred:
Må man spørge hvad det stammer fra ?
Avatar billede arne_v Ekspert
18. januar 2003 - 19:32 #7
disky>

Udefra konteksten så vil jeg da mene, at den servlet faktisk er en controller !

(og jeg er absolut tilhænger af model 2 fremfor model 1)
Avatar billede arne_v Ekspert
18. januar 2003 - 20:23 #8
Jeg har lige downloadet og installeret Resin 2.1.6 !

Jeg kan nemt genskabe problemet.

Jeg har observeret at det er præcis hver anden gang:
  #1 virker
  #2 fejler
  back
  #3 virker
  #4 fejler
  etc.etc.
Avatar billede arne_v Ekspert
18. januar 2003 - 20:24 #9
Dybt mystisk.

Det må være en bug i Resin.

Men det er dog sært, at den ikke er fundet af andre.
Avatar billede disky Nybegynder
18. januar 2003 - 20:59 #10
Jeg har lige prøvet med følgende .jsp fil

<BODY>
<form action="/servlet/login" method="POST">
    <input type="text" name="HVADSKERDERHER">
    <input class="button" type="submit" value="Login">
</form>
</BODY>
</html>



Måtte lige rette for at path til servlet passede.

Og jeg kan kalde siden lige så mange gange i træk jeg ønsker, den fejl du siger den kommer med har jeg ikke oplevet.
Jeg bruger resin 2.0.2
Avatar billede arne_v Ekspert
18. januar 2003 - 23:13 #11
Bingo.

Jeg har lige fået en version til at virke på 2.1.6 !

import javax.servlet.*;
import javax.servlet.http.*;

public class Login extends HttpServlet
{
  public void doPost( HttpServletRequest request,  HttpServletResponse response ) throws ServletException
  {
    try {
    request.getParameterMap(); // <---------------------------
        getServletConfig().getServletContext().getRequestDispatcher("/login.jsp").forward(request, response);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return;
  }
}

Da jeg satte den markerede linie ind begyndte det at virke.

Det er stadig en fejl i Resin 2.1.6, men måske kan du bruge workarounden.

Den sætning laver jo ingen ulykker.
Avatar billede disky Nybegynder
18. januar 2003 - 23:17 #12
Nu husker en af jer lige og melde det som en bug til Resin ikke ?
Avatar billede arne_v Ekspert
18. januar 2003 - 23:17 #13
Det er iævrigt ret nemt at se, hvad Resin programmørerne har
bøffet i.

Input for 2 requests er jo (skematisk):

POST /Login HTTP/1.1
Host: localhost

HVADSKERDERHER=xxx
POST /Login HTTP/1.1
Host: localhost

HVADSKERDERHER=yyy

De får ikke læst rigtigt fra bufferen og derfor venter POST data
fra den første request stadig i input bufferen, når de skal læse
anden request.

getParameterMap må ligesom tvinge Resin til at læse alt rigtigt.
Avatar billede arne_v Ekspert
18. januar 2003 - 23:24 #14
Det må tomred hellere gøre.
Avatar billede tomred Nybegynder
18. januar 2003 - 23:31 #15
Tak for jeres ihærdige indsats.
Jeg kører selv Resin 2.1.6 så rart at høre at du (arne) kan genskabe problemet her. Og ja, underligt nok hvis ikke andre har set problemet før!
Jeg prøver lige med en ældre version af Resin. Disky: Har du et godt bud på en version der er solid? 2.0.2?

Mht. applikationen er den implementeret som MVC. Jeg er stadig af den overbevisning at jsp's force er præsentation og al forretningslogik og persistering foregår via servlets (og underliggende beans). Men den diskussion har jo efterhånden været vendt et par gange i dette forum.

Arne vil du fyre et svar af? Så vil jeg fordele en klat af pointene efter bedste evne.
Avatar billede arne_v Ekspert
18. januar 2003 - 23:33 #16
Løste request.getParameterMap() ikke problemet hos dig ?
Avatar billede arne_v Ekspert
18. januar 2003 - 23:34 #17
Og jeg svarede da jeg troede at jeg havde en løsning/workaround med request.getParameterMap().
Avatar billede tomred Nybegynder
18. januar 2003 - 23:36 #18
Arne: Du løste problemet mens jeg sad og bryggede på sidste kommentar så min sidste respons giver ikke rigtig mening! Håber fordelingen af point faldt korrekt på plads.

Tak for hjælpen.
Avatar billede disky Nybegynder
18. januar 2003 - 23:38 #19
Jeg bruger 2.0.2 og har aldrig haft problemmer med den.

Servlets eneste begrundelse i dag, er som Controller i et MVC pattern, resten af logik'en smider man i normale klasser der ikke er så 'tunge' som servlets og lignende.
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

Seneste spørgsmål Seneste aktivitet
I dag 10:21 Ny printer, men hvilken Af mort1 i Printere
I går 19:41 USB på Linux Af Uvanga i Linux
12/0818:26 Hvilken type mus Af mort1 i PC
11/0813:21 ms Forms Af leahcim i Andet software
10/0821:30 Blokeret på Snapchat? Af LineP i Chat & Messaging