سؤال

لدي تطبيق تطوير طور. أود إرجاع ملف JSP على طلب URL من خلال الرائد. كيف يمكنني تحقيق ذلك دون استخدام إعادة توجيه؟

أي دعنا نقول أن لدي ملف "contact.jsp" على mydomain.com وأريد أن يكون الناس قادرين على الوصول إلى contact.jsp في http://mydomain.com/contact.

وهكذا، في الرد، أود أن:

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

ولكن كيف يمكنني إرجاع صفحة "contact.jsp"؟ أعلم أن إعادة التوجيه ستعمل، لكنني لا أريد المستخدمين رؤية ".jsp" في ".http://mydomain.com/contact.jsp."... أو هل هناك استراتيجية أخرى من شأنها أن تعمل دون استخدام الرينلت؟ ربما بعض تعديل ملف Web.xml الخاص بي؟

تحرير (2009-08-14):

إجابتي المنشورة أدناه لا تعمل على محرك التطبيق والديدين. ومع ذلك، فإنه يعمل، إذا لم أقم بتضمين الرؤية، أو السماح بالدفع للحصول على نمط عنوان URL من "/ *"

ما سيكون مثاليا هو الحصول على فرعية من جهاز التوجيه الذي يسمح لي بذلك:

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

شكرًا!

تحرير (2009-08-17):

لقد فوجئت أنه لم يكن لدي أي ردود منذ أن نشرت فضل. هل سيعلق شخص ما وأخبرني إذا كانت سؤالي / مشكلة ليست واضحة؟

تحرير (2009-08-17):

ملاحظة مثيرة للاهتمام. عند استخدام الطريقة التي وصفها "البائع الغني" أدناه، يعمل عند نشرها على محرك تطبيق Google وليس محليا. بالإضافة إلى ذلك، إذا اتصلت http://mydomain.com/contact.jsp. على Google App-Engine، فإنه يتجاوز الرؤية ويذهب مباشرة إلى JSP. ولكن، محليا، يرتفع الرؤية. إنه، http: // localhost: 8080 / contact.jsp لا يذهب إلى JSP ويذهب إلى Restlet. هل تستجيب تطبيقات محركات التطبيق المنتشرة بشكل مختلف إلى عناوين URL كظرفي محلي؟

هل كانت مفيدة؟

المحلول

"أود إرجاع ملف JSP على طلب URL من خلال الرائد" - فهمي يتم تحويل JSP إلى Servlets. نظرا لأن Suvlets هي Orthogonol لإعادة التقاء غير متأكد من كيفية إرجاع ملف JSP من خلال الرائد.

على افتراض أنك تسأل عن طريقة لاستخدام JSP بالإضافة إلى RENTLELT، يتم تحقيق ذلك بشكل أفضل من خلال تعيين إعادة تناولك إلى جذور مثل / الراحة بدلا من / * واستخدام .jsp كالمعتاد.

نصائح أخرى

لا يدعم الرينت حاليا JSPS مباشرة. من الصعب التعامل معها خارج حاوية Servlet.

هناك مناقشة حول nabble. حول هذه المشكلة التي قد تجدها مفيدة، في الوقت الحالي، يبدو أنك بحاجة إلى إرجاع إعادة توجيه إلى JSP المعين بشكل طبيعي في Web.xml، أو اختراقه لمعالجة JSP وإرجاع الدفق كتمثيل.

الاستجابة مؤرخة "23 أبريل 2009؛ 03:02 مساء" في الخيط يصف كيف يمكنك القيام بالاختراق:

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

يتم نشر مصدر المؤشر BufferedServletResponseWrapper زوجين من الإدخالات في وقت لاحق.

يشبه تكوين 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>

هذا يعمل دون مطعم في محرك التطبيق. ولكن بمجرد إدراج الرؤية، لا يعمل الأمر إذا قمت بتعيين نمط Reslet الخاص بي إلى "/ *"

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top