سؤال

أنا أحاول أن أكتب تطبيق ويب باستخدام SpringMVC.عادة كنت مجرد خريطة بعض مختلقة امتداد الملف إلى الربيع تحكم الجبهة والعيش بسعادة ، ولكن هذه المرة أنا ذاهب للراحة مثل عناوين url مع أي ملف ملحقات اسم.

رسم كل شيء تحت سياق المسار إلى وحدة تحكم أمامية (دعنا نسميها "التطبيق") يعني لا ينبغي أن تأخذ الرعاية من الملفات الثابتة أيضا شيء أنا لا أفضل (لماذا إعادة اختراع آخر weel?), حتى بعض تركيبة مع هر الافتراضي بريمج (دعنا نسميها "هر") يبدو أن يكون وسيلة للذهاب.

لقد حصلت على أن تفعل شيئا مثل

<servlet-mapping>
  <servlet-name>app</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>tomcat</servlet-name>
  <url-pattern>*.ext</url-pattern>
</servlet-mapping>

وتكرار هذا الأخير لكل واحد من امتداد الملف من محتوى ثابت.أنا فقط أتساءل لماذا التالية الاجهزة التي معي هي ما يعادل واحد أعلاه لا تعمل.

<!-- failed attempt #1 -->
<servlet-mapping>
  <servlet-name>app</servlet-name>
  <url-pattern>/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>tomcat</servlet-name>
  <url-pattern>*.ext</url-pattern>
</servlet-mapping>

<!-- failed attempt #2 -->
<servlet-mapping>
  <servlet-name>app</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>tomcat</servlet-name>
  <url-pattern>/some-static-content-folder/*</url-pattern>
</servlet-mapping>

يمكن لأي شخص أن تسلط بعض الضوء ؟

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

المحلول

أعتقد أنني أعرف ما يجري.

في العمل الخاص بك web.xml لديك مجموعة بريمج أن يكون الافتراضي بريمج (/ حد ذاته هو الافتراضي بريمج يسمى إذا كان هناك أي مباريات أخرى) ، فإنه سيتم الرد على أي طلب لا يطابق آخر رسم الخرائط.

في فشل 1 الخاص بك /* رسم الخرائط لا يبدو أن مسار صالح الخرائط.مع /* التعيين في web.xml فهو يجيب على جميع الطلبات باستثناء المسار الآخر تعيينات.وفقا لمواصفات ملحق تعيينات ضمنية تعيينات التي يتم تجاوزها من قبل صريح تعيينات.هذا هو السبب في تعيين ملحق فشلت.كان كل شيء صراحة تعيينها إلى التطبيق.

في فشل 2, التطبيق هو المسؤول عن كل شيء باستثناء المحتوى الذي يتطابق مع محتوى ثابت رسم الخرائط.لإظهار ما يحدث في اختبار سريع قمت بإعداد.هنا هو مثال على ذلك. /some-static-content-folder/ يحتوي على test.png

محاولة الوصول إلى الاختبار.png حاولت:

/some-static-content-folder/test.png

و لم يتم العثور على ملف.ومع ذلك يحاول

/some-static-content-folder/some-static-content-folder/test.png

فإنه يأتي.لذلك يبدو أن القط الافتراضي بريمج (6.0.16 على الأقل) قطرات بريمج رسم الخرائط في محاولة للعثور على الملف باستخدام المسار المتبقي.وفقا لهذا المنصب بريمج لخدمة محتوى ثابت رصيف يعطي السلوك كنت أتوقع.

هل هناك سبب لا يمكنك أن تفعل شيئا مثل خريطة الدليل الجذر الخاص بك بقية المكالمات.شيء مثل التطبيق تعيين /rest_root/* من أنت مسؤول عن أي شيء يدور في rest_root المجلد ولكن في أي مكان آخر يجب أن يتم التعامل معها من قبل قط, إلا إذا جعل صريح آخر رسم الخرائط.أنا أقترح وضع الراحة بريمج إلى مسار الخرائط ، لأنه يعلن النية أفضل.باستخدام / أو /* لا يبدو مناسبا ، حيث لديك لتحديد الاستثناءات.استخدام ذلك مثال ، بقية تعيينات سيكون شيئا مثل

/المستخدمين/* للمستخدم بريمج

/وظائف/* الوظائف بريمج

رسم الخرائط من أجل

  1. صريحة (مسار التخطيط)
  2. ضمني (ملحق تعيينات)
  3. الافتراضي (/)

يرجى تصحيح أي شيء لدي خطأ.

نصائح أخرى

للإشارة ، فإن "محاولة فاشلة #2" هو الصحيح تماما في إصدار هر >= إلى 6.0.29.

كان نتيجة هر الأخطاء التي تحصل على إصلاحها في الإصدار 6.0.29:

https://issues.apache.org/bugzilla/show_bug.cgi?id=50026

<!-- Correct for Tomcat >= 6.0.29 or other Servlet containers -->
<servlet-mapping>
  <servlet-name>app</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>default</servlet-name>
  <url-pattern>/some-static-content-folder/*</url-pattern>
</servlet-mapping>

لقد حاولت أبدا إلى خريطة بريمج مثل هذا, ولكن أنا أن يقولون ان /* لا من الناحية الفنية على حد سواء تبدأ مع / وتنتهي /*, على الرغم من أن نفس الحرف تستخدم في كل المباريات.

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