SpringMVC ContentNegotiatingViewResolver -- 根据请求资源名选择视图

前一篇文章介绍了如何利用@ResponseBody和HTTP Request Header中的Accept属性实现返回结果中自动选择XML或者JSON。

这里介绍另外一种办法,利用使用ContentNegotiatingViewResolver,这个视图解析器允许你用同样的内容数据来呈现不同的view。
它支持如下面描述的三种方式:
1)使用扩展名
http://localhost:8080/employees/nego/Jack.xml  返回结果为XML
http://localhost:8080/employees/nego/Jack.json 返回结果为JSON
http://localhost:8080/employees/nego/Jack  使用默认view呈现,比如JSP

2) HTTP Request Header中的Accept

3) 使用参数
http://localhost:8080/employees/nego/Jack?format=xml  返回结果为XML
http://localhost:8080/employees/nego/Jack?format=json 返回结果为JSON


我们使用方式1来实现。

1)添加Controller方法

	/**
	 * Jack.xml -- 返回XML
	 * Jack.json -- 返回JSON
	 * Jack -- 返回JSP:employee.jsp
	 */
	@RequestMapping(value="/nego/{name}", method=RequestMethod.GET)
	public String getEmployeeNegotiating(@PathVariable String name, ModelMap model) {
		model.addAttribute("emp", new EmployeeX(name, 16000));
		return "employee";
	}

employee.jsp如下

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Employee</title>
</head>
<body>
Name : ${emp.name} <br/>
Salary : ${emp.salary}
</body>
</html>

2)在spring-mvc.xml中添加如下配置

<!-- ViewResolver -->
    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <property name="order" value="1" />
        <property name="favorParameter" value="false" />
        <property name="ignoreAcceptHeader" value="true" />

        <property name="mediaTypes">
            <map>
                <entry key="json" value="application/json" />
                <entry key="xml" value="application/xml" />
            </map>
        </property>

        <property name="defaultViews">
            <list>
                <!-- JSON View -->
                <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" />
                <!-- JAXB XML View -->
                <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
                    <constructor-arg>
                        <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
                            <property name="classesToBeBound">
                                <list>
                                    <value>learning.webapp.model.EmployeeX</value>
                                </list>
                            </property>
                        </bean>
                    </constructor-arg>
                </bean>
            </list>
        </property>
    </bean>

    <!-- If no extension matched, use JSP view -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="order" value="2" />
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/views/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>

有几个重要的参数:

<property name="favorPathExtension" value="true"></property> 是否启用扩展名支持,默认是true

<property name="favorParameter" value="false"></property> 是否启用参数支持,默认是true

<property name="ignoreAcceptHeader" value="true"></property> 是否忽略掉accept header,默认就是false

我们使用扩展名,所以关掉后面两个。


3)在POM添加添加下面2个依赖

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.6.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-oxm</artifactId>
            <version>${spring.version}</version>
        </dependency>

打开浏览器,访问如下URL:



[参考资料]

1)http://www.cnblogs.com/zhaoyang/archive/2012/01/07/2315428.html

2)http://www.mkyong.com/spring-mvc/spring-3-mvc-contentnegotiatingviewresolver-example/

资料1中的ContentNegotiatingViewResolver处理流程图


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring MVC是一个基于Java的Web框架,它提供了很多简化Web开发的功能。其中一个常用的功能是处理HTTP请求和响应。而Jackson-databind是一个Java库,用于将Java对象与JSON(JavaScript Object Notation)之间进行相互转换。 在Spring MVC中,我们可以使用Jackson-databind来处理请求和响应中的JSON数据。具体来说,我们可以使用Jackson-databind的ObjectMapper类来将JSON数据转换为Java对象,或将Java对象转换为JSON数据。 例如,我们可以在Spring MVC中定义一个Controller,用于处理来自客户端的HTTP请求,并返回一个Java对象,然后使用Jackson-databind将该Java对象转换为JSON数据,以便客户端可以使用该数据进行相应的操作。 示例代码如下: ```java @Controller public class MyController { @GetMapping("/myendpoint") @ResponseBody public MyObject handleRequest() { // 处理请求,返回一个 MyObject 对象 MyObject obj = new MyObject(); obj.setProperty1("value1"); obj.setProperty2("value2"); return obj; } // 使用 Jackson-databind 将 MyObject 对象转换为 JSON 数据 @GetMapping(value = "/myendpoint", produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public ResponseEntity<String> handleRequest() throws JsonProcessingException { MyObject obj = new MyObject(); obj.setProperty1("value1"); obj.setProperty2("value2"); ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(obj); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); return new ResponseEntity<String>(json, headers, HttpStatus.OK); } } ``` 在上面的示例中,我们定义了一个Spring MVC的Controller,该Controller处理来自客户端的HTTP请求,并返回一个MyObject对象。随后,我们使用Jackson-databind将该对象转换为JSON数据,并将其返回给客户端。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值