باستخدام الربيع ، والتعيين إلى الجذر في web.xml ، لم يتم العثور على الموارد الثابتة
-
22-09-2019 - |
سؤال
ما أحاول القيام به هو طلبات الخريطة إلى جذر Servlet (المصطلحات الصحيحة؟). أنا في النقطة التي يتم فيها تعيين عناوين URL لتصحيح العرض ، لكن جميع المحتوى الثابت - CSS ، JavaScript ، الصور - لا يمكن العثور على جزء من الصفحة.
لذا في web.xml ، تبدو علامة servlet الخاصة بي هكذا
<servlet-mapping>
<servlet-name>springapp</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
وحدة التحكم الخاصة بي تبدو مثل هذا:
@RequestMapping("/shop")
public class TheShopController extends MyBaseController {
public static String VIEW = "Tile.Shop";
@Override
@RequestMapping(method = RequestMethod.GET)
protected ModelAndView processRequest(HttpServletRequest req, HttpServletResponse resp) {
ModelAndView mav = new ModelAndView(VIEW);
return mav;
}
}
MyBaseController بسيط للغاية. تبدو هكذا:
public abstract class MyBaseController extends AbstractController {
protected Logger log = Logger.getLogger(getClass());
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse resp)
throws Exception {
ModelAndView mav = processRequest(req, resp);
return mav;
}
protected abstract ModelAndView processRequest(HttpServletRequest req, HttpServletResponse resp);
}
أنا أستخدم البلاط في طبقة عرضي. التكوين الخاص بي على النحو التالي:
/web-inf/tiles-defs.xml
كما ذكرت ، تم العثور على وجهات النظر ولكن لا يمكن العثور على الموارد الثابتة التي هي منفذ للصفحة. فيما يلي بعض التسجيل النموذجي وضع:
2010-01-24 17: 25: 01،777 Debug [http-8080-7] servlet.dispatcherservlet (dispatcherservlet.java:690)-Dispatcherservlet with name 'springapp get request for [/springapp/static/csount.csss. ] 2010-01-24 17: 25: 01،778 تحذير [http-8080-4] servlet.dispatcherservlet (dispatcherservlet.java:962)-لم يتم العثور على رسم خرائط لطلب http مع uri [/springapp/static/css/shop.css] في Dispatcherservlet مع اسم "Springapp" 2010-01-24 17: 25: 01،778 تصحيح [http-8080-6] servlet.frameworkservlet (frameworkservlet.java:677)-أكمل بنجاح طلب 2010-01-24 17: 25: 01،778 Warn [http-8080-5] servlet.dispatcherservlet (dispatcherservlet.java:962)-لم يتم العثور على رسم الخرائط لطلب http مع uri [/springapp/static/css/offers.css] في Dispatcherservlet مع اسم springapp '2010-01-01-24 17: 25: 01،778 تحذير [http-8080-3] servlet.dispatcherservlet (dispatcherservlet.java:962)-لم يتم العثور على رسم خرائط لطلب http مع uri [/springapp/static/css/scrollable-buttons.css] 'سبري نغاب
الذهاب الىhttp: // localhost: 8080/springapp/shop يعمل بشكل جيد ولكن CSS والصور مفقودة.
أعتقد أن استخدام البلاط هو تعقيد الأشياء بطريقة ما ، لكنني مترددة في التخلص منها. أنا أتساءل عما إذا كنت بحاجة إلى ضبط تكوين دقة العرض ، يجب أن يتم توحيده بطريقة أو بأخرى؟ من ذوي الخبرة في القيام بذلك.
المحلول
تكمن المشكلة في أن طلبات المحتوى الثابت تذهب إلى مرسال ServatcherSvlet ، لأنه تم تعيينه <url-pattern>/</url-pattern>
. إنها مشكلة شائعة جدًا في التطبيقات التي تحتوي على عناوين URL "المريحة" (أي ، دون أي بادئة في DispatcherServlet
رسم الخرائط).
هناك العديد من الطرق الممكنة لحل هذه المشكلة:
منذ الربيع 3.x الطريقة المفضلة للوصول إلى الموارد الثابتة هي الاستخدام <mvc:resources>
:
web.xml
:
<servlet-mapping>
<servlet-name>springapp</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
تكوين الربيع:
<!-- Handles GET requests for /resources/** by efficiently serving static content
in the ${webappRoot}/resources dir -->
<mvc:resources mapping="/resources/**" location="/resources/" />
أنظر أيضا تبسيط MVC في ربيع 3
1. استخدم مرشح إعادة كتابة URL
يرى mvc-basic
مثال هنا
2. تعيين بادئة ل default
سيرفليت:
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/static/*</url-pattern>
</servlet-mapping>
وهذا هو ، طلب ل /static/images/image.png
سيعود الملف المسمى /images/image.png
ومع ذلك ، فإن هذه الطريقة غير متوافقة عبر حاويات Servlet المختلفة (لا تعمل في رصيف) ، انظر الحلول هنا
3. تعيين ملحقات المحتوى الثابت ل default
سيرفليت:
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.png</url-pattern>
<url-pattern>*.js</url-pattern>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
4. لا تستخدم عناوين URL المريحة ، استخدم عناوين URL مع البادئة:
<servlet-mapping>
<servlet-name>springapp</servlet-name>
<url-pattern>/app</url-pattern>
</servlet-mapping>
5. لا تستخدم عناوين URL المريحة ، استخدم عناوين URL مع التمديد:
<servlet-mapping>
<servlet-name>springapp</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
نصائح أخرى
هل فكر أحد في استخدام هذا:
<!-- Allows for mapping the DispatcherServlet to "/" by forwarding static resource requests to the container's default Servlet -->
<mvc:default-servlet-handler/>
إليكم أحدث مستندات الربيع:http://static.springsource.org/spring/docs/3.1.2.release/spring-framework-reference/htmlsingle/spring-framework-reference.html#mvc-default-servletler
كبديل لرقم الحل المقترح (2 ، servlet الافتراضي الذي يتصرف بشكل مختلف عن حاوية servlet إلى حاوية servlet) ، أوصي بإلقاء نظرة على موارد servlet (org.springframework.js.resource.ResourceServlet
) من مشروع Spring Webflow.
لمزيد من التفاصيل ، يرجى إلقاء نظرة على كيفية التعامل مع المحتوى الثابت في الربيع MVC؟
لدي نفس المشكلة ولكن بدلاً من استخدام الربيع ، أقوم بعمل مرشح صغير يعيد توجيه الجذر إلى صفحة البدء مثل ذلك:
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
String pageName = req.getServletPath();
if(pageName.equals("/")) {
res.sendRedirect( req.getContextPath() + "/start" );
} else {
chain.doFilter(request, response);
}
ربما تكون خدعة لكنها تبدو وكأنها تعمل بشكل جيد مع رمز صغير. اذهب هنا لمزيد من معلومات التصفية http://www.oracle.com/technetwork/java/filters-137243.html