8 Stimmen

Restlet für die Rückgabe von JSPs auf Google App Engine konfigurieren?

Ich habe eine Restlet-Anwendung entwickelt. Ich möchte eine JSP-Datei auf eine URL-Anfrage durch Restlet zurückgeben. Wie kann ich dies erreichen, ohne eine Weiterleitung zu verwenden?

z.B.. Nehmen wir an, ich habe die Datei "contact.jsp" auf mydomain.com und ich möchte, dass die Leute auf contact.jsp zugreifen können unter http://mydomain.com/contact

In Restlet hätte ich also:

router.attach("/contact", MyResource.class);

Aber wie kann ich die Seite "contact.jsp" zurückgeben? Ich weiß, dass eine Weiterleitung funktionieren würde, aber ich möchte nicht, dass die Benutzer die ".jsp" in " http://mydomain.com/contact.jsp "... oder gibt es eine andere Strategie, die sogar ohne Restlet funktionieren würde? Vielleicht eine Änderung meiner web.xml-Datei?

Bearbeiten (2009-08-14):

Meine unten gepostete Antwort funktioniert nicht mit App-Engine und Restlet. Sie funktioniert jedoch, wenn ich Restlet nicht einbeziehe oder Restlet ein Url-Muster von "/*" erlaubt.

Ideal wäre es, eine Unterklasse des Routers zu haben, die dies ermöglicht:

router.attach("/contact", "/contact.jsp");

Danke!

Bearbeiten (2009-08-17):

Ich bin überrascht, dass ich noch keine Antworten erhalten habe, seit ich ein Kopfgeld ausgesetzt habe. Könnte sich jemand dazu äußern und mich wissen lassen, ob meine Frage/das Problem nicht klar ist?

Bearbeiten (2009-08-17):

Interessante Beobachtung. Wenn ich die von "Rich Seller" weiter unten beschriebene Methode verwende, funktioniert sie, wenn sie in der Google App-Engine bereitgestellt wird und nicht lokal. Außerdem, wenn ich aufrufe http://mydomain.com/contact.jsp auf Google App-Engine umgeht Restlet und geht direkt zum JSP. Aber lokal übernimmt Restlet die Aufgabe. Das ist, http://localhost:8080/contact.jsp geht nicht an die JSP, sondern an Restlet. Reagieren verteilte App-Engine-Anwendungen anders auf URLs als ihr lokales Gegenstück?

2voto

Rich Seller Punkte 81404

Restlet unterstützt derzeit keine JSPs direkt. Sie sind außerhalb des Servlet-Containers nur schwer zu handhaben.

Es gibt eine Diskussion über Nabble zu diesem Thema, die Sie vielleicht nützlich finden, im Moment sieht es so aus, als müssten Sie entweder eine Umleitung auf die JSP zurückgeben, die wie üblich in der web.xml abgebildet ist, oder sie so hacken, dass sie die JSP verarbeiten und den Stream als Darstellung zurückgeben.

Die Antwort mit dem Datum "23. April 2009; 03:02pm" im Thread beschreibt, wie Sie den Hack durchführen können:

if (request instanceof HttpRequest &&
    ((HttpRequest) request).getHttpCall() instanceof ServletCall) {

    ServletCall httpCall = (ServletCall) ((HttpRequest) request).getHttpCall();

    // fetch the HTTP dispatcher
    RequestDispatcher dispatcher = httpCall.getRequest().getRequestDispatcher("representation.jsp");

    HttpServletRequest proxyReq = new HttpServletRequestWrapper(httpCall.getRequest());

    // Overload the http response stream to grab the JSP output into a dedicated proxy buffer
    // The BufferedServletResponseWrapper is a custom response wrapper that 'hijacks' the
    // output of the JSP engine and stores it on the side instead of forwarding it to the original
    // HTTP response.
    // This is needed to avoid having the JSP engine mess with the actual HTTP stream of the
    // current request, which must stay under the control of the restlet engine.
    BufferedServletResponseWrapper proxyResp = new BufferedServletResponseWrapper(httpCall.getResponse());

    // Add any objects to be encoded in the http request scope
    proxyReq.setAttribute("myobjects", someObjects);

    // Actual JSP encoding
    dispatcher.include(proxyReq, proxyResp);

    // Return the content of the proxy buffer
    Representation rep = new InputRepresentation(proxyResp.toInputStream(),someMediaType); 

Der Quellcode für den BufferedServletResponseWrapper wird ein paar Einträge später veröffentlicht.

0 Stimmen

Welche Ausnahme erhalten Sie?

0 Stimmen

Ich bin nicht in der Nähe einer IDE, dies heute zu testen, so dass dies eine Vermutung ist. haben Sie die Servlet-Zuordnung in web.xml sowie der Dispatcher-Code definiert? dies vielleicht das Problem verursacht.

0 Stimmen

Nein, das einzige Servlet-Mapping, das ich in web.xml habe, ist Restlet.

1voto

JP Richardson Punkte 37290

Sieht nach einer einfachen web.xml-Konfiguration aus.

<servlet>
     <servlet-name>contactServlet</servlet-name>
     <jsp-file>/contact.jsp</jsp-file>
</servlet>

<servlet-mapping>
     <servlet-name>contactServlet</servlet-name>
     <url-pattern>/contact</url-pattern>
</servlet-mapping>

Dies funktioniert ohne Restlet in App-Engine. Aber sobald ich Restlet einbinde, funktioniert es nicht mehr, wenn ich mein Restlet-Url-Muster auf "/*" setze.

0 Stimmen

Es funktioniert, wenn Sie mit der Reihenfolge Ihrer Servlet-Zuordnungen herumspielen

1voto

Gmu Punkte 358

"Ich möchte eine JSP-Datei auf eine URL-Anfrage durch Restlet zurückgeben" - Meines Wissens werden JSPs in Servlets umgewandelt. Da Servlets orthogonol zu Restlets sind nicht sicher, wie Sie JSP-Datei durch Restlet zurückgeben können.

In der Annahme, dass Sie nach einer Möglichkeit fragen, JSP zusätzlich zu Restlet zu verwenden, lässt sich dies am besten dadurch erreichen, dass Sie Ihre Restlets einem Rootpath wie /rest anstelle von /* zuordnen und die .jsp wie üblich verwenden.

0 Stimmen

Hallo Gmu! Ich bin auch mit dem gleichen Problem konfrontiert, können Sie bitte erklären, "Dies ist am besten durch die Zuordnung Ihrer restlets zu einem rootpath" ein wenig mehr zu erreichen?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X