带有JSON和JSP的Spring MVC控制器

时间:2012-10-18 17:51:39

标签: spring rest spring-mvc

控制器中的相同方法是否可以用于JSP和其他MIME类型(如XML和JSON)?

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

  1. 返回包含视图名称的String,并将属性添加到ModelModelMap
  2. 使用视图名称和型号
  3. 返回ModelAndView
  4. 使用Object注释
  5. 返回@ResponseBody

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

    我知道我可以使用两种方法并使用@RequestMapping(headers="accept=application/xml")@produces注释来定义它们处理的MIME类型,但是只能在一种方法中执行此操作吗?

    控制器逻辑非常简单,看起来像是不必要的重复,有两个不同的方法被映射,返回相同的模型,或者这只是它的完成方式?

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

我最近有同样的要求,下面是我的代码。 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\"}";
}
}