2009-11-23 37 views
10

Cách đơn giản để giải quyết đường dẫn đến tệp JSP không nằm trong thư mục gốc JSP của ứng dụng web là gì bằng cách sử dụng khung nhìn của SpringMVCsResolvers? Ví dụ, giả sử chúng ta có cấu trúc ứng dụng web sau đây:Spring MVC: Cách giải quyết đường dẫn đến thư mục con của thư mục gốc 'JSP' trong ứng dụng web

web-app 
    |-WEB-INF 
    |-jsp 
     |-secure 
     |-admin.jsp 
     |-admin2.jsp 
     index.jsp 
     login.jsp 

Tôi muốn sử dụng một số thành phần out-of-the-box để giải quyết các tập tin JSP trong thư mục gốc jspan toàn thư mục con. Tôi có một tập tin *-servlet.xml định nghĩa:

một out-of-the-box, InternalResourceViewResolver:

<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property> 
    <property name="prefix" value="/WEB-INF/jsp/"></property> 
    <property name="suffix" value=".jsp"></property> 
</bean> 

một ánh xạ xử lý:

<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
<property name="mappings"> 
    <props> 
    <prop key="/index.htm">urlFilenameViewController</prop> 
    <prop key="/login.htm">urlFilenameViewController</prop> 
    <prop key="/secure/**">urlFilenameViewController</prop> 
    </props> 
</property> 
</bean> 

một out-of-the-box UrlFilenameViewController bộ điều khiển:

<bean id="urlFilenameViewController" class="org.springframework.web.servlet.mvc.UrlFilenameViewController"> 
</bean> 

Vấn đề tôi có là yêu cầu Không thể giải quyết JSP trong thư mục an toàn an toàn vì chỉ jspViewResolver chỉ có tiền tố được xác định là /jsp/ chứ không phải /jsp/secure/.

Có cách nào để xử lý các thư mục con như thế này không? Tôi muốn giữ cấu trúc này vì tôi cũng đang cố gắng sử dụng Bảo mật mùa xuân và có tất cả các trang bảo mật trong thư mục con là một cách hay để thực hiện việc này.

Có lẽ một cách đơn giản để đạt được điều này nhưng tôi mới làm quen với Spring và Spring MVC framework nên mọi con trỏ sẽ được đánh giá cao.

+0

Lưu ý không liên quan, nhưng bạn không cần phải chỉ định 'JstlView' làm' viewClass' nữa, Spring sẽ tìm ra theo mặc định. – skaffman

Trả lời

0

Bạn cần phải thiết lập thuộc tính như sau:

<property name="prefix" value="/WEB-INF/jsp/"/> 

và sau đó bạn có thể truy cập các URI secure/admin1.jsp

+0

Xin lỗi rằng tiền tố là lỗi đánh máy, tôi đã sửa nó ngay bây giờ. Tuy nhiên, nếu tôi đã bảo mật/admin1.jsp (hoặc secure/admin1.htm), điều đó sẽ giải quyết tìm kiếm trong /WEB-INF/jsp/admin1.jsp và không bao gồm thư mục bảo mật vì đây không phải là một phần của tiền tố (Tôi xin lỗi) – chrisjleu

+0

Bạn đang sử dụng phiên bản mùa xuân nào? Nó sẽ hoạt động trong 2.5.x –

+0

Tôi đang sử dụng 2.5.6.SEC01. Tôi đã thử nó nhưng vấn đề có vẻ là trong cách ánh xạ trong SimpleUrlHandlerMapping được quy định trong ví dụ của tôi. Mọi yêu cầu đến/an toàn/** sẽ dẫn đến Spring mong đợi tệp JSP cư trú trong/WEB-INF/jsp /, khi tất nhiên tệp thực sự nằm trong/WEB-INF/jsp/secure /. Tôi đã phát hiện ra một giải pháp thích hợp phục vụ cho mục đích của tôi nhưng nó có những hạn chế của nó. Tôi cũng sẽ tiếp tục đăng bài đó. – chrisjleu

1

Bạn có thể thử đưa ra tên của các quan điểm trong điều khiển như

<property name="formView" value="secure/admin"/> 
<property name="successView" value="secure/admin2"/> 

có tiền tố và hậu tố được ánh xạ như bên dưới

<bean id="viewResolver" 
    class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix" value="/WEB-INF/jsp/" /> 
    <property name="suffix" value=".jsp" /> 

Điều này cuối cùng sẽ bản đồ để /WEB-INF/jsp/secure/admin.jsp và /WEB-INF/jsp/secure/admin2.jsp

+0

Không chắc tôi hiểu cách các thuộc tính formView và successView áp dụng ở đây khi tôi muốn sử dụng UrlFilenameViewController. – chrisjleu

+0

formView và successView là các tên khung nhìn mà bạn có thể đưa vào bộ điều khiển của mình, nếu bạn muốn có các khung nhìn có thể cấu hình được. Điều này là 2 mặc định có sẵn cho bạn trong trường hợp bạn sử dụng SimpleFormController. –

+0

Không có gì liên quan đến biểu mẫu, chúng chỉ là các trang JSP có ít nội dung và mặc dù có hai trang trong ví dụ tôi đưa ra nhưng không giới hạn hai trang. Tôi thậm chí không sử dụng một bộ điều khiển * form * và tôi nghĩ rằng điều này sẽ lạm dụng các thuộc tính formView và successView nếu tôi cố gắng sử dụng nó theo cách bạn đề xuất. Thậm chí không chắc chắn nó sẽ hoạt động như thế nào. – chrisjleu

1

Bạn cần phải thiết lập thuộc tính alwaysUseFullPath ở trong handler là true:

<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
    ... 
    <property name="alwaysUseFullPath" value="true" /> 
</bean> 

Điều này sẽ buộc các handler để sử dụng '//an toàn' một phần của URI và sau đó là phân giải sẽ bao gồm nó khi tìm kiếm một JSP trong WEB-INF/jsp.

+0

Không may mắn với điều này. Vẫn đang tìm trong thư mục JSP gốc. – chrisjleu

2

Tôi chưa thể khám phá giải pháp chính xác cho câu hỏi tôi đã hỏi nhưng tôi có cách giải quyết phù hợp với các yêu cầu cụ thể của tôi. Vấn đề dường như nằm trong bản đồ bàn tay.Nếu được chỉ định như trong ví dụ trong bài đăng, mọi yêu cầu đến các trang trong thư mục bảo mật sẽ dẫn đến việc không tìm được tệp JSP thực tế trong thư mục /WEB-INF/JSP/ khi tệp thực tế nằm ở /WEB-INF/jsp/secure/.

Tuy nhiên, nếu quy định như sau:

<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
    <property name="mappings"> 
    <props> 
    <prop key="/login.htm">loginFormController</prop> 
    <prop key="**/*.htm">urlFilenameViewController</prop> 
    </props> 
    </property> 
</bean> 

Sau đó, tất cả các trang được giải quyết một cách chính xác. Yêu cầu đến /login.html sẽ chuyển đến một trình điều khiển biểu mẫu cụ thể nhưng yêu cầu tất cả các trang khác, bất kể chúng nằm trong thư mục gốc JSP hay thư mục phụ sẽ được tìm thấy. Đối với tôi điều này là tốt bởi vì những gì tôi thực sự tìm kiếm là một cách để tránh chỉ định một bộ điều khiển cho mỗi trang trong ứng dụng (hmmm ... có lẽ tôi nên làm rõ điều đó trong bài đầu tiên - và có lẽ có những cách tốt hơn để làm điều này anyway (?)). **/*.htm hoạt động như một trường hợp bắt tất cả và bất kỳ trang nào mà tôi muốn được xử lý bởi một bộ điều khiển khác có thể được chỉ định rõ ràng trên thuộc tính này, như được minh họa bởi /login.htm.

2

Hãy thử với UrlFilenameViewController hoặc return new ModelAndView("secure/login");

1

Dường như thế này nên làm việc, theo các tài liệu:

http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/web/servlet/mvc/UrlFilenameViewController.html

Các configs bạn đã cho thấy dường như phù hợp với các ví dụ trong doc . Nếu servlet điều phối Spring MVC của bạn được ánh xạ tới "/" thì các yêu cầu tới "{context} /secure/whatever.jsp" sẽ được dịch để xem tên "an toàn/bất cứ điều gì". Có lẽ nó có liên quan đến ký tự đại diện "**"? Hoặc có thể một số cấu hình khác của bạn không đúng? Bạn có thể đưa phần web.xml của mình vào nơi bạn thiết lập servlet Spring dispatcher và cũng bao gồm đường dẫn đầy đủ mà bạn đang yêu cầu trong trình duyệt của mình không? Một cách khác để tìm ra vấn đề là tải xuống mã nguồn Spring MVC và đưa nó vào ứng dụng của bạn, sau đó sử dụng trình gỡ rối để xem chính xác những gì đang diễn ra trong cả hạt SimpleUrlHandlerMapping và UrlFilenameViewController để cố xác định lỗi. Bạn sẽ có thể nhanh chóng xác định nơi mà mọi thứ đang đi sai theo cách đó.

0

Tất cả các thư mục phụ có thể được truy cập bằng cách sử dụng thẻ hoang dã trong prefix

Từ điều khiển bạn chỉ có thể trở lại jsp tên như chuỗi và jsp sẽ được hiển thị ngay cả khi nó đang được các thư mục con của/WEB -INF/jsp/like/WEB-INF/jsp/abc

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