2010-10-29 35 views
6

mùa xuân ứng dụng MVC của tôi có một ContentNegotiatingViewResolver đơn định nghĩa JsonView cho rendering resonses json:Chuyển tiếp đến một trang html tĩnh từ điều khiển

<mvc:annotation-driven/> 

<context:component-scan base-package="world.domination.test"/> 

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> 
    <property name="mediaTypes"> 
     <map> 
      <entry key="json" value="application/json"/> 
     </map> 
    </property> 
    <property name="defaultViews"> 
     <list> 
      <bean class="com.secondmarket.connector.springmvc.MappingJacksonJsonViewEx"/> 
     </list> 
    </property> 
</bean> 

Toàn bộ ứng dụng ngồi trên gốc url "myapp". Mọi thứ đều hoạt động như tôi cần.

Câu hỏi đầu tiên là: cách trả về trang tĩnh html khi truy cập url nhất định? Nói, khi truy cập vào Spring uri/myapp/test tôi muốn hiển thị một trang html /TestStuff.html nằm trong thư mục webapp gốc.

tôi đã đi trước và đã viết một bộ điều khiển đơn giản:

@Controller 
@RequestMapping("test") 
public class TestConnector { 

    @Autowired 
    private RestTemplate tpl; 

    @RequestMapping(method = RequestMethod.GET) 
    public String get() { 
     return "/TestStuff.html"; 
    } 

    @RequestMapping(method = RequestMethod.POST) 
    public String post(@RequestParam("url") String url, @RequestParam("data") String data) { 
     return tpl.postForObject(url, data, String.class, new HashMap<String, Object>()); 
    } 
} 

Các get() phương pháp có nghĩa vụ phải nói với Xuân để render một TestStuff.html, nhưng thay vào đó tôi nhận được một lỗi nói rằng quan điểm với tên "/TestStuff.html" bị thiếu.

Câu hỏi thứ hai thứ hai là cách tránh sự cần thiết phải đặt tiện ích mở rộng cho URL. Trong ví dụ của tôi, khi tôi sử dụng /myapp/test thay vì /myapp/test.html ContentNegotiatingViewResolver tôi sử dụng một cái nhìn json mà ám {} (dấu ngoặc nhọn trống)

Bất kỳ con trỏ được đánh giá cao.

+0

Từ cấu hình của bạn 'ContentNegotiatingViewResolver' Tôi không thể hiểu bạn đang cố gắng đạt được điều gì. Trình phân giải này được áp dụng khi cùng một tài nguyên có thể được hiển thị trong các biểu diễn khác nhau. Nếu một số tài nguyên được hiển thị bằng JSON, trong khi một số tài nguyên khác là HTML thì cần phải có một cấu hình khác của trình phân giải. – axtavt

Trả lời

5

Thay vì trả về "/TestStuff.html" từ bộ điều khiển của bạn, hãy thử trả về "chuyển hướng: /TestStuff.html".

Tùy chọn khác là tạo và đăng ký trình giải quyết chế độ xem cho các trang tĩnh của bạn. Có lẽ một cái gì đó như thế này:

<bean id="staticViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
    <property name="prefix" value="/WEB-INF/static/"/> 
    <property name="suffix" value=".html"/> 
</bean> 
+0

Điều này "chuyển hướng: /TestStuff.html" đang làm việc tốt (ít nhất là với Spring MVC 3.1.1) ... Nó đơn giản hơn việc phải thêm viewResolver vì tôi đã có một định nghĩa cho tất cả các trang JSP của tôi. –

0

Cách tốt nhất để làm điều này là sử dụng kết hợp với InternalResourceViewResolver MVC: thẻ view-controller (xem mùa xuân thích hợp Reference Manual để biết chi tiết). Chỉ cần bao gồm những điều sau đây vào ứng dụng tập tin bối cảnh XML của bạn (trong trường hợp này tập tin TestStuff.html tĩnh của bạn sẽ được đặt tại/WEB-INF/tĩnh-trang):

<bean> 
    <bean id="staticPagesViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix" value="/WEB-INF/static-pages/"/> 
    <property name="suffix" value=".html"/> 
</bean> 

<mvc:view-controller path="/test" view-name="TestStuff"/> 
Các vấn đề liên quan