`

springmvc<一>一种资源返回多种形式【ContentNegotiatingViewResolver】

 
阅读更多
springmvc<一>一种资源返回多种形式【ContentNegotiatingViewResolver】




restful服务中一个重要的特性就是一种资源可以有多种表现形式,在springmvc中可以使用ContentNegotiatingViewResolver这个视图解析器来实现这种方式。

描述资源的三种形式

    一、使用扩展名

http://localhost:8080/test/user.xml   以xml格式呈现

http://localhost:8080/test/user.json  以json格式呈现

http://localhost:8080/test/user     以默认视图呈现,如jsp

    二、使用http request header的Accept



GET /user HTTP/1.1

Accept:application/xml   请求时设置返回形式是xml,如使用ajax请求,则需要设置contentType:application/xml



GET /user HTTP/1.1

Accept:application/json  请求时设置返回形式是json,如使用ajax请求,则需要设置contentType:application/json

    三、使用参数



http://localhost:8080/test/user?format=json

http://localhost:8080/test/user?format=xml



上面了解了同一种资源的三种呈现方式,即json、xml、jsp,那么我们要如何使用ContentNegotiatingViewResolver类配置,使客户端请求的方式不同,返回同一种资源的三种方式呢?

ContentNegotiatingViewResolver配置

ContentNegotiatingViewResolver是视图解析器,我们在使用jsp这个视图的时候也配置了一个视图解析器InternalResourceViewResolver,他们都是视图解析器,后者着重在配置一个默认的视图解析即jsp;ContentNegotiatingViewResolver本身不会解析,他会分配其他的viewResolver去解析,并选择一个看起来像是客户端请求需要返回的一种 View 返回。

下面是ContentNegotiatingViewResolver的具体配置


复制代码
<!--springmvc中根据后缀不同返回不同格式的配置
        如,XXX.json  返回json格式
           XXX.xml   返回xml格式
           xxx       返回jsp
        -->
    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <!--这里是解析器的执行顺序,如果有多个的话,配置的数值越小,则越早执行-->
        <property name="order" value="1" />
        <!--
        这里是是否启用扩展名支持,默认就是true
                    例如  /user/{userid}.json
             -->
        <property name="favorPathExtension" value="true"></property>

        <!--这里是是否启用参数支持,默认就是true
        例如  /user/{userid}?format=json
             -->
        <property name="favorParameter" value="false"></property>
        <!--这里是否忽略掉accept header,默认就是false
                   例如     GET /user HTTP/1.1
        Accept:application/json
        -->

        <property name="ignoreAcceptHeader" value="true"></property>
        <!--
       
        这里是扩展名到mimeType的映射,
        例如 /user/{userid}.json  中的   .json  就会映射到   application/json
        -->
        <property name="mediaTypes">
            <map>
                <entry key="json" value="application/json" />

                <entry key="xml" value="application/xml" />       
            </map>
        </property>
<!--视图-->
        <property name="defaultViews">
            <list>
            <!--json视图-->
                <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"></bean>
            <!--xml视图-->
                <bean class="org.springframework.web.servlet.view.xml.MarshallingView"
                    <constructor-arg>
                        <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
                            <property name="classesToBeBound">
                                <list>
                                    <value>com.cn.my.entity.Course</value>
                                    <value>com.cn.my.entity.CourseList</value>
                                </list>
                            </property>
                        </bean>
                    </constructor-arg>
                </bean>
            </list>
        </property>
    </bean>

复制代码

order:如果存在多个viewResolver则order值小的被使用,如果没有合适的viewResolver则会使用另外的;

favorPathExtension:是否支持扩展名,默认为true(支持),扩展名指的xxx.json、xxx.xml等形式

favorParameter:是否启用参数支持,默认为true(支持),即xxx?format=json、xxx?format=xml等形式,这里的参数名默认为format,可以通过配置改变。

ignoreAcceptHeader:是否忽略accept header,默认是false(不忽略),即请求时指定的contentType:application/json等,由于我这里要使用扩展名的形式返回,所以把另外两项都关闭了,可视不同情况,使用不同设置;

mediaTypes:配置扩展名到mimeType的映射,这里配置了json和xml的映射;

defaultViews:配置视图,这里配置了json和xml的视图,json使用的jackson;

最后,我还配置一个另外一个视图解析器,InternalResourceViewResolver,


复制代码
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="order" value="2" />
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <property name="suffix" value=".jsp"></property>
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
    </bean>

复制代码

这是jsp的视图解析器,order属性配置为了2,在无法匹配到json、xml的情况下,会返回jsp的视图。

下面是controller的方法


复制代码
package com.cn.my.controllor;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import com.cn.my.entity.Course;
import com.cn.my.entity.CourseList;

@Controller
@RequestMapping("/mul")
public class MultiView {

    @RequestMapping("/simple/{coursId}")
    public String method1(@PathVariable("coursId") String coursId,ModelMap model){
        Course c=new Course();
        c.setId(coursId);
        c.setContent("这是测试内容");
        c.setName("李四");
        model.put("course", c);
        return "course";
    }
}

复制代码

这里使用的restful服务中的uri的格式,用到了@PathVariable注解,这里方法返回的String,且没有@ResponseBody注解,在前边的返回json一文中有返回json的配置,需要@ResponseBody注解,详细的可以参看前边,同时在方法参数中有ModelMap,为什么这里要返回一个字符串呢,目的是为了统一,我们知道如果要返回到jsp视图,那么这里要返回的一个代表逻辑视图名的字符串,为了使三种方式统一,这里返回的是字符串,如果不返回到jsp也可以返回一个实际的对象。

下面看测试结果,

请求:http://localhost:8081/springmvc/mul/simple2/1212.json



请求:http://localhost:8081/springmvc/mul/simple2/1212.xml



请求:http://localhost:8081/springmvc/mul/simple2/1212



最后一个jsp的视图,本来是要在jsp页面中输出内容的,我这里没做,只是输出了一段话。请谅解!



从上边的测试结果来看,我们分别使用了三种不同的请求方式去请求同一个资源,返回了各自的形式,这种方式很适合用在不同的系统调用同一个系统时,可能别的系统处理数据的方式不一样,我们使用上边的配置可以实现一套代码,返回不同的形式。

最后

在配置默认的jsp解析器的时候也可以照下面的配置方式,


复制代码
<!--springmvc中根据后缀不同返回不同格式的配置
        如,XXX.json  返回json格式
           XXX.xml   返回xml格式
           xxx       返回jsp
        -->
    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <!--这里是解析器的执行顺序,如果有多个的话,配置的数值越小,则越早执行-->
        <property name="order" value="1" />
        <!--
        这里是是否启用扩展名支持,默认就是true
                    例如  /user/{userid}.json
             -->
        <property name="favorPathExtension" value="true"></property>

        <!--这里是是否启用参数支持,默认就是true
        例如  /user/{userid}?format=json
             -->
        <property name="favorParameter" value="false"></property>
        <!--这里是否忽略掉accept header,默认就是false
                   例如     GET /user HTTP/1.1
        Accept:application/json
        -->

        <property name="ignoreAcceptHeader" value="true"></property>
        <!--
       
        这里是扩展名到mimeType的映射,
        例如 /user/{userid}.json  中的   .json  就会映射到   application/json
        -->
        <property name="mediaTypes">
            <map>
                <entry key="json" value="application/json" />

                <entry key="xml" value="application/xml" />       
            </map>
        </property>
       
        <!--视图解析器-->
        <property name="viewResolvers">
            <list>
               
                <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
       
                    <property name="prefix" value="/WEB-INF/jsp/"></property>
                    <property name="suffix" value=".jsp"></property>
                    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
                </bean>
            </list>
          
        </property>
<!--视图-->
        <property name="defaultViews">
            <list>
            <!--json视图-->
                <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"></bean>
            <!--xml视图-->
                <bean class="org.springframework.web.servlet.view.xml.MarshallingView"
                    <constructor-arg>
                        <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
                            <property name="classesToBeBound">
                                <list>
                                    <value>com.cn.my.entity.Course</value>
                                    <value>com.cn.my.entity.CourseList</value>
                                </list>
                            </property>
                        </bean>
                    </constructor-arg>
                </bean>
            </list>
        </property>
    </bean>
分享到:
评论

相关推荐

    基于SSM(Spring+SpringMVC+MyBatis)框架开发的仓库管理系统+源代码+文档说明

    # SSM-WMS基于SSM(Spring+SpringMVC+MyBatis)框架开发的仓库管理系统&lt;br&gt;开发中&lt;br&gt;数据库&lt;br&gt;Mysql&lt;br&gt;&lt;br&gt;后端&lt;br&gt;Spring&lt;br&gt;SpringMVC&lt;br&gt;MyBatis&lt;br&gt;Slf4j&lt;br&gt;Log4j&lt;br&gt;Shiro&lt;br&gt;Ehcache&lt;br&gt;Fastjson&lt;br&gt;&lt;br&gt;...

    SpringMVC中json转换所需要的Maven仓库的jar包

    该资源为SpringMVC中json转换所需要的Maven仓库,如果maven下载包的时候速度太慢,可以使用我的这个资源,把这个直接考到本地Maven仓库即可。 对应的Maven依赖如下: &lt;dependency&gt; &lt;groupId&gt;org.codehaus.jackson&lt;/...

    SpringMVC课堂笔记

    &lt;servlet-name&gt;springmvc&lt;/servlet-name&gt; &lt;servlet-class&gt;org.springframework.web.servlet.DispatcherServlet&lt;/servlet-class&gt; &lt;init-param&gt; &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt; &lt;param-value&gt;/...

    开源的APIdoc框架Springfox.zip

     &lt;artifactId&gt;swagger-springmvc&lt;/artifactId&gt;  &lt;version&gt;1.0.2&lt;/version&gt; &lt;/dependency&gt; &lt;!--jackson依赖--&gt; &lt;dependency&gt;  &lt;groupId&gt;com.fasterxml.jackson.core&lt;/groupId&gt;  &lt;artifactId&gt;jackson-...

    SpringMVC-SpringBoot项目搭建.docx

    &lt;artifactId&gt;springmvc&lt;/artifactId&gt; &lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt; &lt;packaging&gt;war&lt;/packaging&gt; &lt;!-- 其他配置... --&gt; &lt;/project&gt; ``` 在这个示例中,`packaging`属性设置为`war`,表明这是一个Web应用...

    mac下mvn搭建web工程

    &lt;groupId&gt;eyas.springmvc&lt;/groupId&gt; &lt;artifactId&gt;springmvc&lt;/artifactId&gt; &lt;packaging&gt;war&lt;/packaging&gt; &lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt; &lt;name&gt;springmvc Maven Webapp&lt;/name&gt; &lt;url&gt;http://maven.apache.org...

    springMVC+mybitis+mongodb+maven整合

    &lt;groupId&gt;org.springframework&lt;/groupId&gt; &lt;artifactId&gt;spring-webmvc&lt;/artifactId&gt; &lt;version&gt;4.3.23.RELEASE&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework&lt;/groupId&gt; &lt;artifactId&gt;...

    springMVC+MyBatis整合Maven代码

    &lt;param-value&gt;/WEB-INF/springmvc-servlet.xml&lt;/param-value&gt; &lt;/init-param&gt; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt; &lt;/servlet&gt; &lt;listener&gt; &lt;listener-class&gt;org.springframework.web.context....

    SpringMVC知识点.doc

    SpringMVC 是一款基于 Java 的轻量级 Web 开发框架,它是 Spring 框架的重要组成部分,主要用于构建 MVC(Model-View-Controller)模式的 Web 应用程序。本篇文章将详细阐述 SpringMVC 的核心概念、工作流程、以及...

    Java实训教程 Java软件开发实战 Java开发框架介绍 SpringMVC_1_开发环境搭建 共41页.pptx

    SpringMVC是Spring框架的一个重要组成部分,它是一种基于Java的轻量级Web应用框架,主要用于简化Web层的开发工作。SpringMVC遵循MVC设计模式,使得模型、视图和控制器能够很好地分离,便于开发和维护。 #### 二、...

    Spring+SpringMVC+Mybatis框架整合例子

    在IT行业中,开发高效、可维护的Web应用是至关重要的,而Spring、SpringMVC和Mybatis这三大框架的整合正是实现这一目标的有效途径。这个"Spring+SpringMVC+Mybatis框架整合例子"旨在帮助开发者快速搭建一个完整的...

    SSM三大框架整合详细总结(Spring+SpringMVC+MyBatis).pdf

    &lt;spring.version&gt;4.0.2.RELEASE&lt;/spring.version&gt; &lt;mybatis.version&gt;3.2.6&lt;/mybatis.version&gt; &lt;slf4j.version&gt;1.7.7&lt;/slf4j.version&gt; &lt;log4j.version&gt;1.2.17&lt;/log4j.version&gt; &lt;/properties&gt; &lt;dependencies&gt; &lt;!...

    SpringMVC笔记

    &lt;h1&gt;Hello, SpringMVC!&lt;/h1&gt; &lt;/body&gt; &lt;/html&gt; ``` 7. **运行应用** - 部署到Tomcat服务器上,启动服务器,通过浏览器访问`http://localhost:8080/your-app-context`查看结果。 通过以上步骤,我们创建了一个...

    SpringMVC整合Freemarker例子

    Map&lt;String, Object&gt; model = new HashMap&lt;&gt;(); model.put("message", "Hello, SpringMVC + Freemarker!"); return new ModelAndView("hello", model); } } ``` 在上述示例中,"hello"是视图名称,对应的...

    intellij maven springmvc demo

    它提供了一种模型-视图-控制器(MVC)架构,使得开发者可以将业务逻辑、数据处理和用户界面分离,从而提高代码的可维护性和复用性。Maven作为项目管理和构建工具,能够自动化地管理项目的依赖关系,简化构建过程。 ...

    Spring+SpringMVC+MyBatis整合教程

    - **支持多种视图技术**:除了 JSP,SpringMVC 还支持 Velocity、FreeMarker 等视图技术。 - **易于测试**:控制器类可以通过模拟的 HTTP 请求来进行单元测试。 **1.3、MyBatis** MyBatis 是一个支持普通 SQL 查询...

    IDEA SpringMVC集成mybatis

    一个标准的SpringMVC项目通常包含以下几个目录:`src/main/java`(源代码),`src/main/resources`(资源文件),`src/main/webapp`(Web应用资源)。在`src/main/webapp`下,`index.jsp`是主页面,`META-INF`存放...

    SpringMVC入门->网站的初级框架

    总的来说,SpringMVC提供了一种高效且可扩展的方式来构建Web应用,尤其适合大型复杂项目。通过URL路由、模型-视图分离、依赖注入等特性,SpringMVC使得开发者能更专注于业务逻辑,而不是底层的HTTP处理。在...

    使用Maven构建Spring MVC项目的简单示例

    最后,创建一个对应的JSP页面,例如`src/main/webapp/WEB-INF/views/hello.jsp`,展示返回的信息: ```jsp &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;Hello, Spring MVC&lt;/title&gt; &lt;/head&gt; &lt;body&gt; ${message} &lt;/body&gt; ...

    SpringMVC中文件(图片)上传和Json支持需要的相关jar包

    &lt;artifactId&gt;commons-fileupload&lt;/artifactId&gt; &lt;version&gt;1.4&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;commons-io&lt;/groupId&gt; &lt;artifactId&gt;commons-io&lt;/artifactId&gt; &lt;version&gt;2.11.0&lt;/version&gt; &lt;/...

Global site tag (gtag.js) - Google Analytics