【问题标题】:Spring MVC Controller with JSON and JSP带有 JSON 和 JSP 的 Spring MVC 控制器
【发布时间】:2012-10-18 17:51:39
【问题描述】:

控制器中的同一个方法能否同时用于 JSP 和其他 MIME 类型(如 XML 和 JSON)?

我知道以下在 Spring MVC 中解析视图的方法。

  1. 返回带有视图名称的String 并将属性添加到ModelModelMap
  2. 返回带有视图名称和模型的ModelAndView
  3. 返回带有@ResponseBody 注释的Object

我在处理 JSP 时使用 1 或 2,当我想返回 JSON 或 XML 时使用 3。

我知道我可以使用两种方法并使用 @RequestMapping(headers="accept=application/xml")@produces 注释来定义它们处理的 MIME 类型,但是否可以只用一种方法来做到这一点?

控制器逻辑非常简单,映射两个返回相同精确模型的不同方法似乎是不必要的重复,或者这只是它的完成方式?

【问题讨论】:

  • @ebaxt 我知道您可以使用RequestMapping 允许一种方法使用 JSON 响应,而另一种方法使用 JSP 响应。问题是如何在同一方法中同时处理 JSON 和 JSP。
  • 啊 - 抱歉,没听清楚 :)
  • @ebaxt 根据您的评论和使用多种方法的示例数量,这似乎不是它的本意。通常情况下,我认为这是我与框架作斗争以做似乎正确的事情的一个例子(即使有一个明显的解决方案)。
  • 只是想知道您是否按照我下面的回答尝试过使用ContentNegotiatingViewResolver

标签: spring rest spring-mvc


【解决方案1】:

是的,这在 Spring MVC 3.x 中是直截了当的……

您基本上只为普通的 JSP 页面视图编写控制器方法,然后在 Dispatcher servlet 配置中配置 ContentNegotiatingViewResolver bean,它查看请求的 mime 类型(或文件扩展名)并返回适当的输出类型.

按照此处的说明进行操作:Spring 3 MVC ContentNegotiatingViewResolver Example

【讨论】:

  • 谢谢!这有效,这就是我最终使用的。我还发现设置我的MappingJacksonJsonViewmodelKeys 字段以防止它渲染整个模型很有用,这样只有modelKeys 中定义的键以JSON 呈现,而模型的其余部分可用于JSP 视图。
【解决方案2】:

我最近有同样的要求,下面是我的代码。 validateTicket 返回 jsp 名称, sendForgotPassword 邮件返回 json。我的春季版本是 4.0.0.RELEASE。当然,如果我需要返回复杂的 json,那么我肯定会注册 Jackson 转换器 - 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\"}";
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 2015-02-01
    • 2012-07-06
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    相关资源
    最近更新 更多