2012-10-18 26 views
3

控制器中的同一個方法是否可用於JSP和其他MIME類型(如XML和JSON)?具有JSON和JSP的Spring MVC控制器

我知道以下解決Spring MVC視圖的方法。

  1. 返回String與視圖的名稱,並@ResponseBody註釋

我將屬性添加到ModelModelMap

  • 返回ModelAndView與視圖名稱和型號
  • 返回Object當我處理JSP時使用1或2,當我想返回JSON或XML時使用3。

    我知道我可以使用兩種方法,並使用@RequestMapping(headers="accept=application/xml")@produces註釋來定義它們處理的MIME類型,但是可以僅使用一種方法來完成此操作?

    控制器邏輯非常簡單,它似乎有不必要的重複有兩個不同的方法映射哪些返回相同的確切模型,或者這只是它的方式?

  • +0

    見http://stackoverflow.com/questions/6568414/content-negotiation-in-spring-mvc – ebaxt

    +0

    @ ebaxt我知道你可以使用'RequestMapping'來允許一個方法用JSON響應,另一個用JSP來響應。問題在於如何以同樣的方法處理JSON和JSP。 – vopilif

    +0

    啊 - 對不起,沒有抓住:) – ebaxt

    回答

    3

    是的,這是直線前進Spring MVC中3.X ...

    你基本上寫你的控制器方法只是正常的JSP頁面瀏覽量,然後配置你的調度servlet配置一個ContentNegotiatingViewResolver豆,這查看請求的MIME類型(或文件擴展名)並返回適當的輸出類型。

    按照這裏的說明:Spring 3 MVC ContentNegotiatingViewResolver Example

    +0

    謝謝!這工作,這是我最終使用。我還發現設置我的'MappingJacksonJsonView'的'modelKeys'字段可以避免呈現整個模型,這樣只有'modelKeys'中定義的鍵以JSON呈現,而模型的其餘部分可用於JSP視圖。 – vopilif

    0

    我最近有同樣的要求,下面是我的代碼。 validateTicket返回jsp名稱,sendForgotPassword郵件返回json。我的春天版本是4.0.0.RELEASE。當然,如果我需要返回複雜JSON話,我肯定會註冊傑克遜轉換器 - http://docs.spring.io/spring/docs/4.0.x/javadoc-api/org/springframework/http/converter/json/MappingJackson2HttpMessageConverter.html

    <?xml version="1.0" encoding="UTF-8"?> 
    <beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> 
    
    
    <context:component-scan base-package="foo.bar" /> 
    <bean id="viewResolver" 
        class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
        <property name="viewClass" 
         value="org.springframework.web.servlet.view.JstlView" /> 
        <property name="prefix" value="/WEB-INF/jsp/" /> 
        <property name="suffix" value=".jsp" /> 
    </bean> 
    </beans> 
    
    @Controller 
    @RequestMapping("/forgot-password") 
    public class ForgotPasswordController { 
    
    @RequestMapping(value="/reset-password", method = RequestMethod.GET) 
    public String validateTicket(@RequestParam String ticket, @RequestParam String emailAddress) { 
        return "resetPassword"; 
    } 
    
    @RequestMapping(value="/send-mail", method = RequestMethod.POST, produces="application/json") 
    public @ResponseBody String sendForgotPasswordMail(@RequestParam String emailAddress) throws LoginException { 
        return "{\"success\":\"true\"}"; 
    } 
    } 
    
    相關問題