جافا Servlet: تمرير الطلب مرة أخرى إلى المعالجة الافتراضية

StackOverflow https://stackoverflow.com/questions/1090906

سؤال

أريد Servlet التعامل مع الطلبات إلى الملفات اعتمادا على البادئة والملحق، على سبيل المثال

بادئة _ *. XML

نظرا لأن رسم الخرائط في بداية وتنتهي مسار الطلب غير ممكن، فقد قمت بتعيين طلبات جميع * .xml إلى Serverlet الخاص بي. السؤال الآن هو: كيف يمكنني التسرب من Serverlet الخاص بي لملفات XML التي لا تبدأ ب "البادئة_"، بحيث يتم التعامل مع الطلب مثل طلب "عادي" إلى ملف XML؟

ربما هذا بسيط للغاية لكنني لا يبدو أنني قادر على العثور على هذا ...: - /

شكرا جزيلا مقدما

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

المحلول

أود أن أقترح بشدة استخدام إطار MVC مناسب لهذا. كما اكتشفت، فإن مرونة API Servlet القياسية محدودة للغاية عندما يتعلق الأمر بإرسال إرسال.

من الناحية المثالية، ستتمكن من استخدام رمز Servlet الحالي الخاص بك مع إطار MVC، مع الإطار الذي يقوم بإجراء DIPPCHING استنادا إلى نمط المسار، وخدماتك تقوم بمنطق الأعمال. لحسن الحظ، يسمح لك الربيع MVC بالقيام بذلك، باستخدام ServletForwardingController. سيكون التكوين الربيع خفيف الوزن للغاية.

لذلك سيكون لديك شيء من هذا القبيل في web.xml الخاص بك:

<servlet>
   <servlet-name>myServlet</servlet-name>
   <servlet-class>foo.MyServlet</servlet-class>
</servlet>

<servlet>
   <servlet-name>spring</servlet-name>
   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>

<url-mapping>
   <servlet-name>spring</servlet-name>
   <url-pattern>*</url-pattern>
</url-mapping>

سيكون لديك بعد ذلك ملف WEF-INF / Spring-Servlet.xml مثل هذا:

<beans>
    <bean name="/prefix*.xml" class="org.springframework.web.servlet.mvc.ServletForwardingController">
       <property name="servletName" value="myServlet"/>
    </bean>
</beans>

وهذا سيكون إلى حد كبير ذلك. ستذهب جميع طلبات / Prefix*.xml إلى MyServlet، وسوف يسقط جميع الآخرين إلى الحاوية.

نصائح أخرى

حل آخر (ربما يناسبك) هو إذا كنت تستخدم / تخطط لاستخدام Apache أمام مثيل حاوية الويب هذه، فيمكنك استخدام وحدة إعادة الكتابة من Apache. أعد كتابة عنوان URL إلى شيء أكثر سهولة في التعامل مع حاوية WebApp.

أتمنى أن يساعدك هذا. ديفيد.

لا تشير، ولكن بمجرد أن تصطاد كل طلبات * .xml يمكنك فحص الطلب مرة أخرى في التعليمات البرمجية الخاصة بك عبر httpservletrequest.getRequesturi ()

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String uri =req.getRequestURI();
        int i = uri.lastIndexOf('/');
        int j = uri.lastIndexOf('.', i);
        if (uri.substring(i+1, j).startsWith("prefix_")) {
            // your code
        }
    }

(رمز غير اختبار، فقط فكرة ...)

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