2010-12-13 31 views
13

web.xml đoạnspring mvc cách bỏ qua DispatcherServlet cho các tệp * .html?

<!-- Handles all requests into the application --> 
<servlet> 
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/spring/app-config.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

Nó hoạt động tốt nhưng tôi muốn KHÔNG để cho các Dispatcher Servlet xử lý * yêu cầu .html. Làm thế nào để tôi làm điều đó? Cảm ơn.

+1

Điều này có thể giúp đỡ một số: http://stackoverflow.com/questions/1234298/can-springmvc-be-configured-to-process-all- yêu cầu-nhưng-loại trừ-static-content-d – AHungerArtist

+0

@AHungerArtist Cảm ơn bạn đã liên kết. Tôi tìm thấy câu trả lời tốt hơn nhiều trong đó. –

Trả lời

5

Lập bản đồ trên url-pattern cụ thể hơn.

<servlet-mapping> 
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name> 
    <url-pattern>/spring/*</url-pattern> 
</servlet-mapping> 

Tạo một Filter được ánh xạ trên /*.

<filter-mapping> 
    <filter-name>Your Dispatcher Filter</filter-name> 
    <url-pattern>/*</url-pattern> 
<filter-mapping> 

Phương thức nào sau đây theo phương pháp doFilter().

String uri = ((HttpServletRequest) request).getRequestURI(); 
if (uri.endsWith(".html")) { 
    chain.doFilter(request, response); // Just let it go (assuming that files are in real not placed in a /spring folder!) 
} else { 
    request.getRequestDispatcher("/spring" + uri).forward(request, response); // Pass to Spring dispatcher servlet. 
} 
+0

Điều này gần như làm việc cho tôi ... bằng cách sử dụng getRequestURI sẽ trả về một đường dẫn bao gồm cả đường dẫn ngữ cảnh. Giả sử ngữ cảnh của bạn là/ctx, một yêu cầu đến/ctx/foo sẽ được gửi đến/ctx/spring/ctx/foo Tôi nghĩ getServletPath() + getPathInfo() (nếu pathInfo! = Null) hoạt động tốt hơn – VoidPointer

+0

Việc này giải quyết được vấn đề của tôi. Cảm ơn BalusC, Bạn thật tuyệt vời –

0

Hãy thử thêm này để cấu hình XML mùa xuân của bạn:

<!-- This will override the default DefaultAnnotationHandlerMapping that is created, 
    - and not map file extensions automagically --> 
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
    <property name="useDefaultSuffixPattern" value="false"/> 
</bean> 

này sẽ ngăn chặn mùa xuân từ tự động lập bản đồ các yêu cầu với .html để điều khiển của bạn. Ví dụ. @RequestMapping(value = "/products/widgets", method = RequestMethod.GET) thường sẽ bẫy một URI của /products/widgets.html cũng như /products/widgets. Việc thêm các lực lượng XML ở trên kết hợp chính xác các mẫu URI theo Mùa xuân (chỉ có các mẫu URI mới khớp).

23

Trong Spring MVC 3.x có default servlet handler để giải quyết vấn đề này.

chỉ cần thêm này để cấu hình mùa xuân XML:

<mvc:default-servlet-handler/> 
+0

Tuyệt vời. Tôi nhớ cấu hình này nhưng tôi không thể nhớ chính xác mã. Cảm ơn bạn. – bnguyen82

+0

Rất tốt, cảm ơn bạn – Ramp

+0

Bạn đã lưu ngày của tôi. Cảm ơn bạn – Bhaskara

2
<url-pattern>/*</url-pattern> 

thể bắt như /index, /*.html, /*.jsp ..., và cung cấp cho DispatcherServlet.

<url-pattern>/</url-pattern> 

Chỉ có thể bắt /index, /main ..., không có hậu tố.

+0

Wow, đơn giản nhất. – Aakash

2

Giải pháp của Lari (ở trên) là rất tốt, và làm việc cho tôi, nhưng bạn phải rất cẩn thận với thứ tự mà bạn viết hướng dẫn, nó phải có trong đầu của tài liệu !!!

Trong trường hợp của tôi là một cái gì đó như:

<mvc:annotation-driven /> 
<mvc:default-servlet-handler/> 

<context:annotation-config /> 
<context:component-scan base-package="org.civitana.controller" /> 
+0

Giải pháp rất đẹp, giải quyết được vài vấn đề khác nữa! – Aakash

Các vấn đề liên quan