`
zzc1684
  • 浏览: 1230022 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Spring MVC 3.1多视图协商配置(json、xml、freemarker)

阅读更多

Spring mvc可以配置多种视图,比如json、xml、ftl等等(REST内容协商)。

RESTful服务中很重要的一个特性是对于同一资源,可以有多种表述形式。

既然是协商视图,那么Spring MVC REST改如何决定采用何种方式(视图)展示内容呢?

第一种:根据http request header中的Accept

Accept: text/css,*/*;q=0.1               //返回css格式数据
Accept: application/xml                  //返回xml格式数据
Accept: application/json                 //返回json格式数据

缺点:

chrome:
Accept:application/xml,application/xhtml+xml,textml;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
 
firefox:
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

IE8:
Accept:image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash,

application/x-silverlight, application/x-ms-application, application/x-ms-xbap,

application/vnd.ms-xpsdocument, application/xaml+xml, */*

用户直接通过浏览器访问,由于各个浏览器发送的Accept的不一致,

将导致服务器不知要返回什么格式的数据。

第二种:根据扩展名

http://www.sxrczx.com/rest.xml           //将返回xml格式数据
http://www.sxrczx.com/rest.json          //将返回json格式数据
http://www.sxrczx.com/rest.htm           //将返回html格式数据

缺点:

不能统一通过同一URL实现多种展示视图。

第三种:根据format参数

http://www.sxrczx.com/rest?format=xml    //将返回xml格式数据
http://www.sxrczx.com/rest?format=json   //将返回json格式数据
http://www.sxrczx.com/rest?format=htm    //将返回html格式数据

缺点:

需要额外的传递format参数,URL变得冗余,繁琐,缺少了REST的简洁风范。

配置:web.xml,显示Spring的配置文件位置

...
<!-- spring mvc -->
<servlet>
    <servlet-name>SpringMvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
       <param-name>contextConfigLocation</param-name>
         <param-value>/WEB-INF/config/spring/appContext.xml</param-value>
      </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
<servlet-mapping>
    <servlet-name>SpringMvc</servlet-name>
    <url-pattern>*.htm</url-pattern>
    <url-pattern>*.json</url-pattern>
    <!-- <url-pattern>*.xml</url-pattern> -->
</servlet-mapping>
...

===================================================================================

Spring配置appContext.xml(无扩展名(jsp作为视图)/json/xml)

<!-- 根据客户端的不同的请求决定不同的view进行响应, 
如 http://www.sxrczx.com/rest.json http://www.sxrczx.com/rest.xml -->
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">  
<!-- 设置为true以忽略对Accept Header的支持-->
<property name="ignoreAcceptHeader" value="true"/>  
<!-- 在没有扩展名时即: "http://www.sxrczx.com/rest" 时的默认展现形式 -->
<property name="defaultContentType" value="text/html"/>  
<!-- 扩展名至mimeType的映射,即 http://www.sxrczx.com/rest.json 
映射为 application/json -->
<property name="mediaTypes">  
<map>  
<entry key="json" value="application/json" />  
<entry key="xml" value="application/xml" />  
</map>  
</property>  
<!-- 用于开启 http://www.sxrczx.com/rest?format=json 的支持 -->
<property name="favorParameter" value="false"/>  
<property name="viewResolvers">  
<list>  
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" />  
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>  
<property name="prefix" value="/pages"/>  
<property name="suffix" value=".jsp"></property>  
</bean>  
</list>  
</property>  
<property name="defaultViews">  
<list>  
<!-- for application/json -->
<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />  
<!-- for application/xml -->
<!--   
<bean class="org.springframework.web.servlet.view.xml.MarshallingView" >  
<property name="marshaller">  
<bean class="org.springframework.oxm.xstream.XStreamMarshaller"/>  
</property>  
</bean> 
-->
</list>  
</property>  
</bean>
============================================================================================
Spring配置appContext.xml(freemarker/json)
<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="defaultContentType" value="application/json" />
<property name="mediaTypes">
<map>
<entry key="json" value="application/json" />
</map>
</property>
<property name="viewResolvers">
<list>
<!--  配置freemarker作为视图层 -->
<bean id="freeMarkerViewResolver" 
class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="cache" value="true" />
<property name="order" value="0" />
<property name="prefix" value="" />
<property name="suffix" value=".htm" />
<property name="contentType" value="text/html;charset=utf-8" />
<!--  把contextPath暴露给freemaker,前端可以通过${request.getContextPath()} 
来获取上下文路径<property name="requestContextAttribute" value="request"/>
-->
<property name="viewClass" 
value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/>
</bean>
</list>
</property>
<property name="defaultViews">
<list>
<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
</list>
</property>
</bean>
     
<!-- Freemarker -->
<bean id="freeMarkerViewResolver" 
class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="cache" value="true" />
<property name="order" value="0" />
<property name="prefix" value="" />
<property name="suffix" value=".htm" />
<property name="contentType" value="text/html;charset=utf-8" />
<!-- 把contextPath暴露给freemaker,前端可以通过¥{request.getContextPath()} 
来获取上下文路径 
<property name="requestContextAttribute" value="request"/>
-->
<property name="viewClass" 
value="org.springframework.web.servlet.view.freemarker.FreeMarkerView" />
</bean>
<!-- ftl参数配置 -->
<bean id="freemarkerConfiguration" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
	<property name="location" value="/WEB-INF/config/ftl/freemarker.properties"/>
</bean>
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
	<property name="defaultEncoding" value="utf-8"/>
	<property name="templateLoaderPath" value="/WEB-INF/template"/>
	<property name="freemarkerSettings" ref="freemarkerConfiguration"/>
</bean>

freemarker.properties

datetime_format=yyyy-MM-dd HH:mm:ss
date_format=yyyy-MM-dd
time_format=HH:mm:ss
number_format=0.######;
boolean_format=true,false
#auto_import="/common/index.ftl" as ui
whitespace_stripping=true
default_encoding=UTF-8
tag_syntax=square_bracket
url_escaping_charset=UTF-8
#开启默认容错,既null时,默认使用""代替
classic_compatible=true
分享到:
评论

相关推荐

    spring mvc与velocity整合

    在Spring MVC的配置文件(如`spring-mvc.xml`)中,你需要配置VelocityViewResolver,这是Spring MVC用来解析Velocity模板的类。设置其prefix和suffix属性,分别指定视图前缀和后缀,例如: ```xml ...

    spring3.1 api

    Spring 3.1强化了对RESTful风格Web服务的支持,通过MessageConverter机制,可以轻松处理XML、JSON等多种格式的数据交换。新增的RestTemplate类为创建REST客户端提供了便利。 5. **MVC框架升级** Spring MVC 3.1...

    spring-webmvc-3.1.1.RELEASE.jar.zip

    Spring Web MVC 3.1引入了自动配置的概念,使得开发者可以通过注解来声明式地配置MVC组件,如`@Controller`、`@RequestMapping`等。这极大地减少了XML配置文件的使用,简化了项目配置。 2. **ModelAndView与...

    spring-framework-3.1.0.CI-1162.zip

    6. **视图技术集成**:Spring MVC 可以与各种视图技术如 JSP、FreeMarker、Thymeleaf 等无缝集成,使得开发者可以选择最适合项目的视图解决方案。 7. **异常处理**:通过@ControllerAdvice 和 @ExceptionHandler ...

    Spring MVC面试宝典1.pdf

    - **支持多种视图技术**:SpringMVC不仅支持JSP,还支持其他视图技术如FreeMarker、Thymeleaf等,提供了更多的选择。 - **与Spring框架的深度集成**:SpringMVC作为Spring框架的一部分,可以无缝地与其他Spring功能...

    spring5mvc第一天【大纲笔记】.zip

    同时,需要创建SpringMVC的配置文件,如spring-mvc.xml,其中包含视图解析器、拦截器、数据绑定等配置。 1.3 Hello World 编写一个简单的Controller,使用@Controller注解标记,并通过@RequestMapping注解映射请求...

    SSH框架中SpringMVC

    Spring MVC 支持 JSON 数据格式的输入和输出,通过 @ResponseBody 注解可以将方法返回的对象直接转换为 JSON,并发送回客户端。同时,使用 @RequestBody 注解可以从 JSON 请求体中解析数据。 七、文件上传 Spring ...

    springmvc实例

    - **MVC Improvements**:Spring MVC的功能得到增强,如支持RESTful风格的URL、支持JSON和XML格式的数据交换、改进的异常处理等。 - **Expression Language (SpEL)**:Spring Expression Language提供了更强大的...

    springMVC4.0常用jar包

    在依赖管理方面,Spring MVC 4.0引入了对Servlet 3.1的全面支持,这简化了部署配置,因为开发者可以使用注解来定义Servlet、Filter和Listener,无需传统的web.xml配置文件。此外,这个版本还支持异步处理,通过`@...

    深入剖析Spring Web源码

    - 在`DispatcherServlet`初始化过程中,会加载一个或多个配置文件(如XML文件),这些文件定义了整个Web应用的配置。 - 通过`WebApplicationContext`,`DispatcherServlet`可以访问到所有的Bean实例,包括自定义的...

    struts-2.2.3.1-lib.zip

    Struts 2.2.3.1 是一个流行的开源MVC框架,用于构建企业级Java Web应用程序。这个压缩包“struts-2.2.3.1-lib.zip”包含了Struts 2框架的库文件,这些文件对于理解和使用Struts 2框架至关重要。下面将详细解释其中...

    Spring4.0+Hibernate4.0+SpringMVC4.0整合框架

    3. **配置Spring**:创建Spring的配置文件,如`applicationContext.xml`,定义bean,实现依赖注入。同时,还需要配置数据源、事务管理器以及Hibernate的SessionFactory。 4. **配置SpringMVC**:创建`servlet-...

    Java Springboot入门自学笔记

    - 配置Thymeleaf、FreeMarker等模板引擎进行视图渲染。 - 使用WebSocket实现实时通信。 #### 3.2 安全管理 - 整合Spring Security实现用户认证和授权。 - 配置JWT(JSON Web Tokens)进行安全认证。 #### 3.3 ...

    spingjar包

    在Spring MVC中,FreeMarker可以作为视图解析器,帮助开发者将模板与数据模型结合,生成动态内容。 5. **c3p0(c3p0-0.9.1.jar)**:c3p0是一个开源的JDBC连接池,提供数据源和JNDI绑定的数据源。虽然Druid是现代的...

    S2SH3.0整合包

    4. Spring MVC的增强,包括ModelAndView的改进,以及视图解析器的扩展性提升。 5. 支持JSR-303/JSR-349 Bean Validation,用于校验模型对象。 **三、Struts 2.15** Struts 2是一个基于MVC设计模式的Web应用框架,...

    jfinal的手册

    - **多视图支持**:支持多种视图技术如FreeMarker、JSP和Velocity等。 - **Validator验证**:内置强大的后端验证机制,确保数据完整性。 #### 二、快速上手指南 - **1.1 创建项目** - **推荐开发环境**:...

    struts2 libs

    6. **Freemarker或JSP作为视图技术**: Struts2支持多种视图技术,其中Freemarker和JSP是最常见的。它们负责渲染数据并展示给用户。 在"struts-2.2.3.1-libs"压缩包中,你将找到以下核心库文件: 1. **xwork-core....

    springMVC学习--基本的几个例子

    它是一个模型-视图-控制器(MVC)架构的实现,提供了强大的数据绑定、验证、国际化等功能,极大地简化了Java Web开发。在“springMVC学习--基本的几个例子”这个主题中,我们将深入探讨SpringMVC的基础配置以及几个...

    基于ssm+jsp实验室耗材管理系统源码数据库.doc

    Spring MVC的主要优势在于它的灵活性和可扩展性,支持多种视图技术(如JSP、Freemarker等),并且易于与其他Spring组件集成。 **2.2 MyBatis** MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级...

    Jfinal api word版

    - 用于渲染视图页面或返回 JSON 数据等。 #### 五、Interceptor 拦截器 - **4.1 概述** - Interceptor 拦截器用于在 Controller 执行前后进行逻辑处理。 - **4.2 Interceptor 应用** - 可以用来实现登录验证、...

Global site tag (gtag.js) - Google Analytics