2012-04-19 31 views
5

Tôi đã thiết lập servlet spring-mvc của mình để khớp với các yêu cầu * .page. Tôi đã thiết lập hoan nghênh-file-list trong web.xml được index.pagetệp chào mừng trong web.xml với mùa xuân không hoạt động?

này hoạt động khi tôi đi vào thư mục gốc của máy chủ web của tôi:

http://me.com không được chuyển đến http://me.com/index.page một cách chính xác.

Tuy nhiên, nó không chuyển hướng khi tôi sử dụng subdirectoris:

http://me.com/dashboard không không được chuyển đến http://me.com/dashboard/index.page

Có cách nào để làm việc lập bản đồ này?

tập tin của tôi web.xml (trích):

<welcome-file-list> 
    <welcome-file>index.page</welcome-file> 
</welcome-file-list> 

<servlet-mapping> 
    <servlet-name>spring-mvc</servlet-name> 
    <url-pattern>*.page</url-pattern> 
</servlet-mapping> 

webdefault.xml của tôi (từ cầu cảng):

<init-param> 
     <param-name>dirAllowed</param-name> 
     <param-value>false</param-value> 
    </init-param> 
    <init-param> 
     <param-name>welcomeServlets</param-name> 
     <param-value>true</param-value> 
    </init-param> 
    <init-param> 
     <param-name>redirectWelcome</param-name> 
     <param-value>false</param-value> 
    </init-param> 

Trả lời

3

Nó sẽ chỉ làm việc cho thực, thư mục vật lý, không sẽ không làm việc cho các ánh xạ servlet tùy ý mô phỏng cấu trúc thư mục.

Spring MVC cho phép ánh xạ URL rất phức tạp, vì vậy bạn muốn xử lý tốt hơn tình huống này với @RequestMapping

+0

Hi Bozho. Bạn có chắc không? Tài liệu http://docs.oracle.com/cd/E13222_01/wls/docs81/webapp/web_xml.html#1026980 làm cho thư mục có vẻ như được hỗ trợ. –

+0

có thể là cách họ triển khai nó trong WebLogic. Nhưng Jetty có lẽ giải thích các tiêu chuẩn khác nhau. Hãy thử nó trong một ứng dụng hoàn toàn mới, không có mùa xuân, chỉ để kiểm tra – Bozho

+0

Nó hoạt động trong một ứng dụng mùa xuân mới. Tuy nhiên, sự khác biệt là tôi có các tệp thực trong thư mục thực, thay vì trỏ đến các servlet. Có lẽ đó là vấn đề ... –

0

Đây là điều mà bạn cần phải có thể đặt trong máy chủ web của bạn, và vì vậy, có lẽ máy chủ cụ thể

Đối Apache HTTP Server bạn có thể đạt được điều này bằng cách thiết lập chỉ thị DirectoryIndex như sau: DirectoryIndex index.page

Rõ ràng, ai đó đã hỏi câu hỏi này và đã chấp nhận câu trả lời tại web.xml default file in directory (for jetty, or tomcat)? - Xem nó có phù hợp với bạn hay không.

+0

Xin chào Ryan. Đó là những gì tôi đang làm vào lúc này, nhưng tiếc là nó chỉ hoạt động ở thư mục gốc của bối cảnh, chứ không phải trong các thư mục con. –

12

Các <welcome-file> nên đại diện cho một tập tin vật lý tồn tại trong một thư mục tùy ý mà bạn muốn phục vụ bất cứ khi nào enduser yêu cầu một thư mục (như rễ /, nhưng nó cũng có thể là bất kỳ thư mục khác như /foo/). Bạn chỉ cần hiểu rằng servletcontainer sẽ kiểm tra sự tồn tại vật lý của nó trước khi thực hiện chuyển tiếp, nếu nó không tồn tại thì một lỗi HTTP 404 không tìm thấy trang sẽ được trả về.

Trong trường hợp cụ thể của bạn, bạn không có tệp index.page thực trong thư mục gốc của mình. Bạn có thực sự là một tệp index.jsp trong thư mục gốc của bạn. index.page chỉ là một URL ảo. Vì vậy, các servletcontainer sẽ không thể tìm ra index.page tập tin vật lý và do đó lỗi với một 404.

Bạn có thể workaround này bằng cách lừa servletcontainer bằng cách đặt một index.page tập tin vật lý hiện bên cạnh các tập tin index.jsp trong cùng một thư mục . Tệp đó chỉ có thể được giữ hoàn toàn trống. Các servletcontainer sẽ tìm thấy tập tin và sau đó chuyển tiếp đến index.page mà sau đó sẽ gọi servlet điều khiển mà lần lượt sẽ thực sự phục vụ index.jsp như xem. Điều đó sẽ hoạt động tốt.

+0

Xin chào BalusC. Có một tham số đặc biệt trong webdefault.xml trong Jetty có tên là welcomeServlets. Nếu bạn đặt nó thành true, thì Jetty sẽ tìm một servlet thỏa mãn tệp chào đón nếu một tệp vật lý không tồn tại. Tôi đã đặt nó thành true, và nó hoạt động cho ngữ cảnh gốc, nhưng không làm việc cho các thư mục con một cách không may. –

+0

Tạo một tập tin trống để lừa container là một chút thiên tài. Cảm ơn! – Kal

+0

Bạn là một thiên tài. –

2

Để tránh tự chuyển tiếp tệp chào mừng, tốt hơn nên thêm ánh xạ cho nó.

<servlet-mapping> 
    <servlet-name>spring-mvc</servlet-name> 
    <url-pattern>index.html</url-pattern> 
    </servlet-mapping> 

Và trong trường hợp cấu hình java bạn có thể ghi đè lên hai phương pháp trong lớp mà kéo dài WebMvcConfigurerAdapter

@Override 
public void addViewControllers(ViewControllerRegistry registry) { 
    registry.addViewController("/").setViewName("/index"); 
} 

@Override 
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { 
    configurer.enable(); 
} 

Nếu bạn muốn phục vụ index.html một cách rõ ràng, biến nó thành một nguồn lực ghi đè lên một phương pháp trong cùng một lớp như sau:

@Override 
public void addResourceHandlers(ResourceHandlerRegistry registry) { 
    registry.addResourceHandler("/index.html").addResourceLocations("/WEB-INF/views/index.html"); 
} 

Tất nhiên addResourceLocations phải tuân theo thư mục được chọn để giữ quan điểm của bạn.

Xem these samples

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