控制器中的相同方法是否可以用于JSP和其他MIME类型(如XML和JSON)?
我知道在Spring MVC中解析视图的以下方法。
String
,并将属性添加到Model
或ModelMap
ModelAndView
Object
注释@ResponseBody
醇>
当我处理JSP时使用1或2,当我想返回JSON或XML时使用3。
我知道我可以使用两种方法并使用@RequestMapping(headers="accept=application/xml")
或@produces
注释来定义它们处理的MIME类型,但是只能在一种方法中执行此操作吗?
控制器逻辑非常简单,看起来像是不必要的重复,有两个不同的方法被映射,返回相同的模型,或者这只是它的完成方式?
答案 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\"}";
}
}