`
liyonghui160com
  • 浏览: 777041 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

springmvc不同的url后缀返回不同格式的数据

阅读更多

 

 

       Spring3.x中定义一个控制器类,必须以@Controller注解标记。当控制器类接收到一个请求时,它会在自己内部寻找一个合适的处理方 法来处理请求。使用@RequestMapping注解将方法映射到一些请求上,以便让该方法处理那些请求。这种方法就像一般的类中的方法,方法名参数列 表和返回值并不像Struts2之类的框架有很强的限制。方法参数列表具体以及返回值具体都有哪些,这里先不细说。这篇博客的目的在于简单介绍如何快速上 手使用Spring MVC框架。

控制器在选择好适合处理请求的方法时,传入收到的请求(根据方法参数类型,可能以不同的类型传入),并且 调用该方法中的逻辑来进行处理(也可以是调用Service来真正处理)。方法逻辑可能也会在参数中添加或者删除数据。处理方法处理完之后,会委派给一个 视图,由该视图来处理方法的返回值。处理程序的返回值并不代表视图的具体实现,可以只是String类型,代表视图名,甚至是void(这时候 Spring MVC可以根据方法名或者控制器名找默认视图)。也不需要担心返回值只是视图名称的话,视图拿不到要显示的数据。因为方法参数对于视图来说也是可以拿到 的。比如说,如果处理方法以Map为参数,那么这个Map对于视图也是可以拿到的。

返回的视图名称会返回给DispatcherServlet,它会根据一个视图解析器将视图名称解析为一个具体的视图实现。这里说到的视图解析器是一个实现了ViewResolver借口的Bean,它的任务就是返回一个视图的具体实现(HTML、jsonp、json等等).

 

 

配置根据不同的url后缀返回不同格式的数据

 

                <entry key="json" value="application/json"/>
                <entry key="jsonp" value="application/javascript"/>
                <entry key="xml" value="application/xml"/>
                <entry key="html" value="text/html"/>

 

 

如 :www.xx.com/123.json     返回application/json格式数据

        www.xx.com/123.jsonp   返回application/javascript格式数据

 

servlet.xml配置如下:

 

<!-- 对模型视图名称的解析,在请求时模型视图名称添加前后缀 -->
    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <property name="order" value="1"/>

        <property name="mediaTypes">
            <map>
                <entry key="json" value="application/json"/>
                <entry key="jsonp" value="application/javascript"/>
            </map>
        </property>
        <property name="viewResolvers">
            <list>
                <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
                    <property name="prefix" value="/WEB-INF/manage/"/>
                    <property name="suffix" value=".jsp"/>
                </bean>
            </list>
        </property>
        <property name="defaultViews">
            <list>
                <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" >
                    <property name="disableCaching" value="false"></property>
                </bean>
                <bean class="com.xx.jos.application.core.common.defaultview.MappingJacksonJsonpView">
                    <property name="disableCaching" value="false"></property>
                </bean>
            </list>
        </property>
    </bean>

 

Spring 3.2.4.RELEASE的最新配置

 

<!--1、检查扩展名(如my.pdf);2、检查Parameter(如my?format=pdf);3、检查Accept Header-->
    <bean id= "contentNegotiationManager" class= "org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
        <!-- 扩展名至mimeType的映射,即 /user.json => application/json -->
        <property name= "favorPathExtension" value= "true" />
        <!-- 用于开启 /userinfo/123?format=json 的支持 -->
        <property name= "favorParameter" value= "true" />
        <property name= "parameterName" value= "format"/>
        <!-- 是否忽略Accept Header -->
        <property name= "ignoreAcceptHeader" value= "false"/>
        <property name= "mediaTypes"> <!--扩展名到MIME的映射;favorPathExtension, favorParameter是true时起作用  -->
            <value>
                json=application/json
                jsonp=application/javascript
            </value>
        </property>
        <!-- 默认的content type -->
        <property name= "defaultContentType" value= "text/html" />
    </bean>

    <!-- ========================= VIEW定义 ========================= -->
    <!-- 内容协商视图解析器;根据客户端不同的请求决定不同的view进行响应 -->
    <!-- 会自动根据解析的contentType来决定使用哪个视图解析器(默认使用整个web应用中的viewResolver) -->
    <bean class= "org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <property name="order" value="0"/>
        <!-- 内容协商管理器 用于决定media type -->
        <property name= "contentNegotiationManager" ref= "contentNegotiationManager"/>
        <!-- 默认视图 放在解析链最后 -->
        <property name="defaultViews">
            <list>
                <bean 	class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" >
                    <property name="disableCaching" value="false"></property>
                </bean>
                <bean class="com.xx.jos.application.core.common.defaultview.MappingJacksonJsonpView">
                    <property name="disableCaching" value="false"></property>
                </bean>
            </list>
        </property>
    </bean>

    <!-- bean name view resolver-->
    <bean class= "org.springframework.web.servlet.view.BeanNameViewResolver">
        <property name="order" value="1"/>
    </bean>
    <!-- 默认的视图解析器 在上边的解析错误时使用 (默认使用 html)- -->
    <bean id= "defaultViewResolver" class= "org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="order" value="2"/>
        <property name= "viewClass" value= "org.springframework.web.servlet.view.JstlView"/>
        <property name= "contentType" value= "text/html"/>
        <property name= "prefix" value= "/WEB-INF/manage/"/>
        <property name= "suffix" value= ".jsp"/>
    </bean>
    <!--在mvc:annotation-driven里面配置使用内容协商-->
    <mvc:annotation-driven content-negotiation-manager= "contentNegotiationManager"/>

 

 

 

 MappingJacksonJsonpView代码如下:

 

package com.xx.jos.application.core.common.defaultview;

import org.apache.log4j.Logger;
import org.springframework.web.servlet.view.json.MappingJacksonJsonView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;


public class MappingJacksonJsonpView extends MappingJacksonJsonView {

    /**
     * Default content type. Overridable as bean property. support   jsonp
     */
    public static final String DEFAULT_CONTENT_TYPE = "application/javascript";
    private Logger log = Logger.getLogger(MappingJacksonJsonpView.class);

    @Override
    public String getContentType() {
        return DEFAULT_CONTENT_TYPE;
    }

    /**
     * Prepares the view given the specified model, merging it with static
     * attributes and a RequestContext attribute, if necessary.
     * Delegates to renderMergedOutputModel for the actual rendering.
     * @see #renderMergedOutputModel
     */
    @Override
    public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {

        if("GET".equals(request.getMethod().toUpperCase())) {
            @SuppressWarnings("unchecked")
            Map<String, String[]> params = request.getParameterMap();
            try {
                if(params.containsKey("callback")) {
                    response.getOutputStream().write(new String(params.get("callback")[0] + "(").getBytes());
                    super.render(model, request, response);
                    response.getOutputStream().write(new String(");").getBytes());
                    response.setContentType("application/javascript");
                }
                else {
                    super.render(model, request, response);
                }
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }

        }

        else {
            super.render(model, request, response);
        }
    }
}

 

 

分享到:
评论

相关推荐

    SpringMVC+Oracle数据源demo项目完整代码

    Controller是业务逻辑处理单元,通常包含处理方法,这些方法接收请求参数,执行业务逻辑,然后返回ModelAndView对象,该对象包含了视图名和模型数据。视图解析器根据ModelAndView中的视图名解析出实际的视图,如JSP...

    一个简单的springMVC入门项目

    6. **转换器和格式化器**:SpringMVC允许自定义转换器和格式化器,用于处理不同类型的数据格式,如日期、货币等。 7. **数据绑定**:SpringMVC自动将HTTP请求参数绑定到Controller方法的参数上,反之亦然,将...

    springmvc_base1

    同时,可能还涉及到内容协商,以适应不同的设备或格式需求。 项目中可能包含以下关键部分: - `web.xml`:部署描述符,配置了DispatcherServlet和Spring MVC的初始化参数。 - `servlet-context.xml`:Spring MVC的...

    精通SpringMVC

    5. **View**:视图负责渲染模型数据,并将其返回给客户端。例如,JSP视图会将Model中的数据注入到JSP页面,然后生成HTML响应。 6. **注解驱动开发**:SpringMVC支持注解驱动的开发模式,使得代码更简洁,减少了XML...

    SpringMVC 使用JSON、XML视图

    在SpringMVC中,这两种格式可以用于从服务器向客户端返回数据,例如,响应Ajax请求或者提供API接口。 为了实现JSON和XML视图,SpringMVC依赖于一些第三方库,包括: 1. json-lib:这是一个纯Java的JSON处理库,...

    springmvc 改造

    改造可能需要定制化这些行为,比如自定义转换器或验证器,以适应特定的数据格式或业务规则。 7. **异常处理**: 应用程序可能需要统一处理各种异常情况。SpringMVC允许自定义异常处理器,改造时可能需要增加或修改...

    SpringMVC_Jar包

    SpringMVC是Spring框架的一个模块,专为构建Web应用程序而设计。它提供了模型-视图-控制器(MVC)架构,使开发者能够将业务逻辑、数据处理和用户界面分离,从而实现更清晰、更可维护的代码结构。下面将详细讨论...

    SpringMVC典型实例

    视图解析器会根据返回的视图名和前缀、后缀组合成实际的URL,然后将模型数据传递给视图进行渲染。 综上所述,"SpringMVC典型实例"涵盖了Web应用开发的多个核心部分,这些知识点对于理解和掌握SpringMVC框架以及构建...

    springMVC笔记

    例如,编写一个方法,并在方法上使用@RequestMapping注解来映射特定的URL请求,并通过返回值告诉SpringMVC调用哪个视图进行渲染。 通过这些步骤,可以构建一个基础的SpringMVC应用,实现了请求的接收和处理,并通过...

    springmvc的入门例子

    3. **返回View**:在`hello()`方法中,可能创建一个`ModelAndView`对象,设置模型数据和视图名称。视图名称通常对应于一个JSP页面,如"hello.jsp"。 4. **配置视图解析器**:在`servlet-context.xml`中配置视图解析...

    SpringMVC+mysql框架

    在SpringMVC中,开发者可以利用Model-View-Controller(MVC)模式来分离业务逻辑、数据模型和用户界面,使得代码更加结构化,易于维护。与MySQL数据库结合使用,可以构建出高效、可扩展的Web应用程序。 **SpringMVC...

    springMVC-个人学习笔记.docx下载

    `viewResolver` 配置了视图解析规则,这里前缀是 `/`,后缀是 `.jsp`,意味着视图名会被解析为 `/[视图名].jsp` 的 URL。 Controller 类似于 Struts2 的 Action,需要实现 `org.springframework.web.servlet.mvc....

    springmvc课堂笔记

    除了基本的功能外,SpringMVC还提供了一系列高级功能,如参数绑定、数据回显、文件上传、JSON数据交互等。 ##### 6.1 参数绑定 - **简单类型绑定**:直接将请求参数与控制器方法参数绑定。 - **POJO类型绑定**:...

    springmvc完整案例

    通过这个案例,你可以学习到如何配置SpringMVC,编写控制器,以及如何将数据和视图结合在一起,从而创建一个基本的Web应用。进一步学习和实践,你将能够掌握更复杂的SpringMVC应用场景,比如RESTful API设计、文件...

    springMvc

    3. **初始化Spring配置**:创建Spring的配置文件(如applicationContext.xml),配置Bean定义,包括Spring MVC的配置(如servlet-context.xml),以及数据源和MyBatis的配置。 4. **编写实体类(Entity)**:定义与...

    SpringMVC实现前端后台交互传递数据

    SpringMVC实现前端后台交互传递数据 本篇文章主要介绍了SpringMVC实现前端后台传递数据的方法,其中包括使用Controller接收和传递数据的多种方式,以及配置SpringMVC的基本步骤。 1. 使用Controller接收和传递数据...

    springMVC rest风格视图解析

    当我们需要根据请求的后缀名(如.json或.xml)返回不同格式的数据时,MessageConverter就派上用场了。Spring MVC默认提供了多个内置的MessageConverter,例如MappingJackson2HttpMessageConverter用于处理JSON,Jaxb...

    springboot + springMVC整合源码

    3. **编写Controller**:创建一个SpringMVC的Controller类,使用`@RestController`注解标记,这样可以返回JSON数据。使用`@RequestMapping`注解来定义处理HTTP请求的方法。例如,创建一个处理GET请求的"hello"接口:...

    springMVC 多视图配置(Jsp Freemarket Json)实例

    这个例子展示了如何通过不同的视图解析器,根据请求的 URL 返回 JSP、FreeMarker 或 JSON 响应。 总的来说,通过灵活地配置视图解析器,SpringMVC 能够支持多种视图技术,满足不同类型的 Web 应用需求。这个实例...

    SpringMvc 第五讲 2

    11. **国际化与本地化**:SpringMvc提供对国际化和本地化支持,可以使用`LocaleResolver`和`MessageSource`来处理不同地区的语言和消息。 12. **上传文件**:SpringMvc提供了一套完整的文件上传机制,包括...

Global site tag (gtag.js) - Google Analytics