2009-08-14 3 views
8

나는 Restlet 응용 프로그램을 개발했습니다. 내가 Restlet 통해 URL 요청 JSP 파일을 반환하고 싶습니다. 리디렉션을 사용하지 않고 어떻게이 작업을 수행 할 수 있습니까?Google App Engine에서 JSP를 반환하도록 Restlet을 구성 하시겠습니까?

즉 하는의 내가 mydomain.com에있는 파일 "contact.jsp"가 나는 사람으로 Restlet에 따라서 http://mydomain.com/contact

에서 contact.jsp에 액세스 할 수 있도록하려는 가정 해 봅시다, 내가 가진 것 :

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

그러나 어떻게 "contact.jsp"페이지를 반환 할 수 있습니까? 나는 리디렉션이 작동한다는 것을 알고 있지만 사용자가 "http://mydomain.com/contact.jsp"의 ".jsp"를보고 싶지 않거나 또는 restlet을 사용하지 않고도 사용할 수있는 또 다른 전략이 있습니까? 어쩌면 내 web.xml 파일을 수정 한 것일까 요?

편집 (2009-08-14) :

내 대답은 앱 엔진 및으로 Restlet에서 작동하지 않습니다 아래에 배치했다. 그러나 Restlet을 포함하지 않거나 Restlet에 "/ *"의 url 패턴을 허용하면 작동합니다.

이상적인 점은 내가 할 수있는 라우터의 하위 클래스를 갖는 것입니다.

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

고마워요!

편집 (2009-08-17) : 나는 현상금을 게시 이후 어떤 반응이 없었

나는 놀랐어요. 내 질문/문제가 명확하지 않은 경우 누군가 의견을 말하고 알려주겠습니까?

편집 (2009-08-17) :

흥미로운 관찰. 아래의 "Rich Seller"에 설명 된 방법을 사용할 때 Google App Engine에 배포 할 때 작동하며 로컬이 아닌 경우 작동합니다. 또한 Google App-Engine에서 http://mydomain.com/contact.jsp을 호출하면 Restlet을 우회하여 JSP로 곧바로 이동합니다. 그러나 로컬에서는 Restlet이 대신합니다. 즉, http://localhost:8080/contact.jsp은 JSP로 이동하지 않고 Restlet으로 이동합니다. 배포 된 app-engine 응용 프로그램은 URL에 로컬 대응자와 다르게 응답합니까?

답변

1

"Restlet을 통해 URL 요청시 JSP 파일을 반환하고 싶습니다."- JSP 이해가 서블릿으로 변환됩니다. 서블릿은 Restlet에 직교하므로 Restlet을 통해 JSP 파일을 반환하는 방법을 모릅니다.

Restlet과 함께 JSP를 사용하는 방법을 묻는 경우,/rest 대신/rest와 평소와 같이 .jsp를 사용하여 restpath를 rootpath에 매핑하는 것이 가장 좋습니다.

+0

안녕하세요 Gmu! 나는 또한 같은 문제에 직면하고있다, 당신은 "이것이 루트 패스에 당신의 재상장을 매핑함으로써 가장 잘 이루어졌다"라고 설명 할 수 있겠는가? – mabicha

1

간단한 web.xml 구성처럼 보입니다.

<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> 

이것은 Restlet in App-Engine 없이도 작동합니다. 그러나 Restlet을 포함 시키면 Reslet url-pattern을 "/ *"로 설정하면 작동하지 않습니다.

+0

서블릿 매핑의 순서가 바뀌면 작동합니다. – koma

2

Restlet은 현재 JSP를 직접 지원하지 않습니다. 서블릿 컨테이너 외부에서 처리하기가 어렵습니다.

유용 할 수있는이 문제에 대한 discussion on Nabble이 있습니다. web.xml에서 정상적으로 매핑 된 JSP로 리디렉션하거나 JSP를 처리하고 반환하기 위해 해킹해야하는 것처럼 보입니다. 표현으로서의 스트림

"2009년 4월 23일, 오후 3시 2분"일자 응답 스레드에서 당신이 해킹을 할 수있는 방법을 설명합니다 다음 BufferedServletResponseWrapper에 대한

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); 

소스는 항목의 몇 나중에 게시됩니다.

+0

작동하지 않을 수 있습니다. 예외가 계속 발생합니다. –

+0

어떤 예외가 있습니까? –

+0

"dispatcher.include"에 잡힐 것 같습니다 ... 그리고 나서 반복됩니다 .. –

관련 문제