باستخدام الربيع ، والتعيين إلى الجذر في web.xml ، لم يتم العثور على الموارد الثابتة

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

سؤال

ما أحاول القيام به هو طلبات الخريطة إلى جذر 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

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