2011-11-04 29 views
7

Tôi đang cố chạy hai Servlet-class trong một web.xml duy nhất nhưng nó không hoạt động, mỗi servlet-class hoạt động tốt một cách độc lập.Thêm nhiều servlet vào một web.xml duy nhất

web.xml:

<servlet> 
    <servlet-name>spring-ws</servlet-name> 
    <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>transformWsdlLocations</param-name> 
     <param-value>true</param-value> 
    </init-param> 
    <load-on-startup>2</load-on-startup> 
</servlet> 

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

<session-config> 
    <session-timeout>240</session-timeout> 
</session-config> 

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/spring-ws-servlet.xml 
    /WEB-INF/health-page-servlet.xml</param-value> 
</context-param> 

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<servlet> 
    <servlet-name>health-page</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>health-page</servlet-name> 
    <url-pattern>/health.htm</url-pattern> 
</servlet-mapping> 

Đừng cho tôi biết nếu bạn có thể tìm một cái gì đó sai mà tôi đang làm.

tôi đã cố gắng liên kết dưới đây nhưng nó không làm việc cho tôi Can I use Spring MVC and Spring WS in one single application?

+0

Việc kê khai servlet là mất tích cho bạn "mùa xuân-ws" servlet – r0ast3d

Trả lời

5

Điều này sẽ không hoạt động. Mặt hàng được ánh xạ trên /* vượt qua tất cả yêu cầu. Bạn cần ánh xạ nó trên / để nó chỉ chặn các yêu cầu không khớp với tất cả các servlet hiện có khác (bao gồm servlet JSP được ánh xạ ngầm trên *.jsp và tất cả các tài nguyên tĩnh "bình thường" như tệp CSS/JS/image !). Xem thêm Difference between/and /* in servlet mapping url pattern.

Nếu có thể phục vụ tài nguyên tĩnh cũng được yêu cầu, thì hãy ánh xạ nó tốt hơn trên mẫu URL cụ thể hơn như /ws/* và tạo Filter để kiểm tra URI yêu cầu và sau đó chuyển tiếp tương ứng. Bộ lọc đó lần lượt có thể được ánh xạ một cách an toàn trên /*. Xem thêm câu trả lời này cho một ví dụ mã cụ thể hơn: How to access static resources when mapping a global front controller servlet on /*.

+0

Tôi nghĩ rằng ánh xạ sẽ được sử dụng từ ít nhất đến ít nhất là cụ thể? –

+0

@Dave: Không nếu có '/ *'. Một bản đồ như vậy chỉ nên được sử dụng trên các bộ lọc. – BalusC

+0

Vì vậy, điều đó được coi là khác với kết quả của thư mục, như/foo/*? –

0

bạn có một bản đồ cho/* trong phần mùa xuân-ws đó là nhận được yêu cầu. bạn cần tìm ra một chiến lược khác ... Thử đặt /health.htm trước khi/* ánh xạ.

+2

Trình tự đặc điểm kỹ thuật là không có liên quan . –

2

Tôi đang sử dụng cấu hình Java trong dự án của tôi và sau đang hoạt động tốt cho cùng một mục đích:

public class Initializer implements WebApplicationInitializer { 

    public void onStartup(ServletContext servletContext) throws ServletException { 
     AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); 
     ctx.register(ApplicationConfiguration.class); 
     ctx.setServletContext(servletContext); 

     MessageDispatcherServlet messageDispatcherServlet = new MessageDispatcherServlet(); 
     messageDispatcherServlet.setApplicationContext(ctx); 
     messageDispatcherServlet.setTransformWsdlLocations(true); 
     Dynamic dynamic = servletContext.addServlet("messageDispatcherServlet", messageDispatcherServlet); 
     dynamic.addMapping("/ws/*"); 
     dynamic.setLoadOnStartup(1); 

     dynamic = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx)); 
     dynamic.addMapping("/"); 
     dynamic.setLoadOnStartup(1); 
    } 
} 
Các vấn đề liên quan