可以在一个控制器中的方法相同的方法被用于JSP和其他的MIME类型(如XML和JSON)?
我知道下面的方法来解决Spring MVC的意见。
- 返回一个
String
与视图名称和属性添加到Model
或ModelMap
- 返回
ModelAndView
与视图名称和型号 - 返回一个
Object
具有@ResponseBody
注解
我用1或2,当我处理的JSP和3时,我想返回JSON或XML。
我知道我可以使用两种方法并用@RequestMapping(headers="accept=application/xml")
或@produces
注解来定义他们处理其MIME类型,但有可能做到这一点的只有一个方法?
控制器逻辑非常简单,似乎是不必要的重复有映射两种不同的方法,返回完全相同的模型,或者是它这样做只是简单的方法是什么?
是的,这是直线前进Spring MVC中3.X ...
基本上你写你的控制器方法只是正常的JSP页面访问量,然后在配置ContentNegotiatingViewResolver
在调度servlet配置豆,它看起来在请求的MIME类型(或文件扩展名),并返回相应的输出类型。
按照这里的说明: 春3 MVC ContentNegotiatingViewResolver例
我最近有同样的要求,下面是我的代码。 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\"}";
}
}