`

Spring3 MVC Restful 多请求类型(json,xml,k-v),多视图配置(Json,Xml,JSP,Freemarker,Volacity等)

阅读更多

如题,少废话

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">
   
    <context:component-scan base-package="com.xxx." />
    <aop:aspectj-autoproxy proxy-target-class="true" />
    <context:annotation-config />
    <import resource="classes/DataSource.xml"/>
    <import resource="classes/applicationContext.xml"/>
    <mvc:interceptors>
        <bean class="com.globeway.web.servlet.intercept.JsonGetInterceptor" />
    </mvc:interceptors>


    <bean id="defaultAnnotationHandlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" ></bean>
    <!-- 配置多请求数据类型,如json xml-->

    <bean id="annotationMethodHandlerAdapter"  class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >
        <property name="messageConverters">
            <list>

                <!-- 解析json请求数据,将json转换为java对象-->
                <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
                <!-- 解析xml请求数据,将xml转换为java对象-->

                <bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
                    <constructor-arg>
                        <bean class="org.springframework.oxm.xstream.XStreamMarshaller">
                           <property name="streamDriver" >
                               <bean class="com.thoughtworks.xstream.io.xml.DomDriver"/>
                           </property>
                           
                           <property name="autodetectAnnotations" ><value>true</value></property>
                           <!--可以与xml互换的对象,需要使用XStream的注解,注解的使用方法请参XStream官网-->

                           <property name="annotatedClasses">
                               <list>
                                   <value>com.xxx.XxxxDTO</value>
                               </list>
                           </property>
                          
                        </bean>
                    </constructor-arg>
                </bean> 
                <bean class="org.springframework.http.converter.FormHttpMessageConverter"/>
                <bean class="org.springframework.http.converter.BufferedImageHttpMessageConverter"/>
                <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
                <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
                <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/>

                <!--可以增加其他数据类型,请参考spring的API-->
            </list>
        </property>
    </bean>    
  
    </bean>   
    <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">

      <!-- .ftl文件存放的根目录-->

      <property name="templateLoaderPath" value="/WEB-INF/ftl/"/>
      <property name="freemarkerVariables">
        <map>
          <entry key="xml_escape" value-ref="fmXmlEscape"/>
        </map>
      </property>

      <!--可以增加其他freemarker的配置,详情请参阅FreeMarkerConfigurerAPI-->
    </bean>
   
    <bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape"/>
       
    <bean
        class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
         <property name="defaultContentType" value="application/json" />
        <property name="mediaTypes">
            <map>
                <entry key="html" value="text/html" />
                <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.freemarker.FreeMarkerViewResolver">
                  <property name="cache" value="true"/>
                  <property name="prefix" value=""/>
                  <property name="suffix" value=".ftl"/>
                  <property name="exposeSpringMacroHelpers" value="true"/>
                </bean>
               
                <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                    <property name="viewClass"
                        value="org.springframework.web.servlet.view.JstlView" />
                    <property name="prefix" value="/WEB-INF/jsp/" />
                    <property name="suffix" value=".jsp" />
                </bean>

                <!-- 可加入其他视图技术如 volacity jstl等-->                       
            </list>
        </property>
        <property name="defaultViews">
            <list>

                <!-- 输出为JSON数据-->
                <bean
                    class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
                </bean>

                <!-- 输出为xml数据-->
                <bean id="marshallingView" class="org.springframework.web.servlet.view.xml.MarshallingView">
                    <property name="marshaller">
                        <bean id="xStreamMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller" >                         
                            <property name="autodetectAnnotations" value="true"/>
                        </bean>
                    </property>
                    <property name="contentType" value="application/xml" />                   
                </bean>                
            </list>
        </property>
    </bean>

    <bean id="exceptionResolver"
        class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
       
        <property name="defaultErrorView" value="/commons/error" />
        <property name="exceptionMappings">
            <props>
            </props>
        </property>
    </bean>
</beans>

 

Controller:

@Controller
@RequestMapping("/register/person")
public class PersonController {

   
    @RequestMapping(method=RequestMethod.GET)
    public ModelAndView list() {
   
        HashMap<String,Object> model = new HashMap<String,Object>();
        model.put("pager", pager); 
        return new ModelAndView("/register/person/personList",model );
    }
}

 

  http://xxxx:pp/register/person

 

  ajax:
  jQuery.ajax({
                url: '/register/person',
                contentType: "application/json",//application/xml
                processData: true,//contentType为xml时,些值为false
                dataType: "html",//json--返回json数据类型;xml--返回xml
                data: {},
                success: function(data) {
                 
                },            
                error:function(e){
               
                }
  });

 

 

分享到:
评论
27 楼 style2013 2014-10-10  
坑爹呀。。
26 楼 liguiking 2012-06-16  
725137 写道
兄弟问下:renderAllModelRoot 这个是什么意思?

在什么地方有这个?写了很久了都忘记在什么什么地方有这个配置了
25 楼 725137 2012-06-07  
兄弟问下:renderAllModelRoot 这个是什么意思?
24 楼 liguiking 2010-11-16  
下载spring 3回来,全部都有了
23 楼 xiangkun 2010-11-15  
LZ,jar包好多.你也传上来好了....
22 楼 liguiking 2010-11-14  
返回的视图是自动选择的,这跟你前台的request header 有关,
请求头信息查看源代码
Host	localhost:8080
User-Agent	Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12
Accept	application/json
Accept-Language	zh-cn,zh;q=0.5
Accept-Encoding	gzip,deflate
Accept-Charset	GB2312,utf-8;q=0.7,*;q=0.7
Keep-Alive	115
Connection	keep-alive
Content-Type	application/json; charset=UTF-8;
X-Requested-With	XMLHttpRequest
Referer	http://localhost:8080/desktop
Content-Length	57
Cookie	JSESSIONID=0D7637174B83B253CDB217E161C39BDB

主要就是Accept:text/html
返回的是jsp还是ftl,SpringMVC会找相对应的视图,说也说不清楚,还是上代码吧:
**-servlet.xml
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/mvc 
	http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
	http://www.springframework.org/schema/aop  
	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
	http://www.springframework.org/schema/context 
	http://www.springframework.org/schema/context/spring-context.xsd">

	<!--  <bean id="viewResolver" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"></bean>-->
	<bean id="handlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">   
	</bean>	
	<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
	  <property name="templateLoaderPath" value="/WEB-INF/ftl/"/>
	  
	  <property name="freemarkerSettings">
	      <props>
	          <prop key="defaultEncoding">UTF-8</prop>
	      </props>
	  </property>
	  <property name="freemarkerVariables">
	    <map>
	      <entry key="xml_escape" value-ref="fmXmlEscape"/>
	    </map>
	  </property>
	  
	</bean>
	
	<bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape"/>
		
	<bean
		class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
		 <property name="defaultContentType" value="application/json" /> 
		<property name="mediaTypes">
			<map>
				<entry key="html" value="text/html" />
				<entry key="json" value="application/json" />
				<entry key="xml" value="application/xml" />
				<entry key="excel" value="application/excel" />
				<entry key="pdf" value="application/pdf" />
			</map>
		</property>
		<property name="viewResolvers">
			<list>
                <bean  class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
				  <property name="cache" value="true"/>
				  <property name="prefix" value=""/>
				  <property name="suffix" value=".ftl"/>
				  <property name="exposeSpringMacroHelpers" value="true"/>
				  <property name="exposeRequestAttributes" value="true"/>
				  <property name="exposeSessionAttributes" value="true"/>
				  <property name="contentType" value="text/html;charset=UTF-8"/>
				</bean>
				
				<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
					<property name="viewClass"
						value="org.springframework.web.servlet.view.JstlView" />
					<property name="prefix" value="/WEB-INF/jsp/" />
					<property name="suffix" value=".jsp" />
				</bean>						
			</list>
		</property>
		<property name="defaultViews">
			<list>
				<bean
					class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
				</bean>
				<bean id="marshallingView" class="cc.web.servlet.view.MarshallingView">
			        <property name="marshaller">
			            <bean id="xStreamMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller" >			              
			            	<property name="autodetectAnnotations" value="true"/>
			            	<property name="streamDriver" >
                               <bean class="com.thoughtworks.xstream.io.xml.DomDriver"/>
                           </property>
			            </bean>
			        </property>
                    <property name="contentType" value="application/xml" />
                    <property name="renderAllModelRoot" value="Result" />				        
			    </bean> 				
			</list>
		</property>
	</bean>

	<bean id="exceptionResolver"
		class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
		
		<property name="defaultErrorView" value="404" />
		<property name="exceptionMappings">
			<props>
			</props>
		</property>
	</bean>
</beans>

在Contoller中,
return new ModelAndView("/app/customer/list","result",msg);
第一个参就是了,具体的文件应该是:/WEB-INF/ftl/app/customer/list.ftl或者/WEB-INF/jsp/app/customer/list.jsp
我这里的的配置是FreeMarkerViewResolver在前,所会先去找ftl,如果找不到,再找jsp,还找不到,就返回exceptionResolver
21 楼 talangniao 2010-10-30  
如何做到返回不同的视图?
我可能返回调用.jsp页面,也可能使用.ftl 页面。
现在使用你的代码进行测试,好像只能返回.ftl ,我怎样才能返回.jsp的页面呢?
20 楼 counters15 2010-09-19  
附件竟然下载不了,5555
我竟然不用ContentNegotiatingViewResolver,只是配置了ViewResolver的order属性就可以了如:<property name="order" value="0"/>
19 楼 liguiking 2010-08-31  
如果在ModelMap里多放几个对象,输出xml的时候,只会输出第一个,还得改写MarshallingView,原来的MarshallingView写不怎么好,看源码就知道。MappingJacksonJsonView就不存在这样的问题。我的项目里我自己实现了一个MarshallingView
18 楼 liuweifeng 2010-08-31  
liguiking 写道
样例放出,修改了两处spring的源码。jar包请自行添加

非常感谢LZ!
17 楼 liguiking 2010-08-29  
样例放出,修改了两处spring的源码。jar包请自行添加
16 楼 nickevin 2010-08-27  
再给点儿力 整个完整的样例跑跑
15 楼 zhuqing08 2010-08-27  
LZ能不能做个demo打个工程出来,小弟好学习学习。
14 楼 liguiking 2010-08-27  
liuweifeng 写道
liguiking 写道
liuweifeng 写道
请问LZ,下面这句是虾米?
<mvc:interceptors>
        <bean class="com.globeway.web.servlet.intercept.JsonGetInterceptor" />
</mvc:interceptors>

就是给contorller加上拦截器,跟struts2差不多,不过spring mvc只有before跟after,没有around,这点不爽


能把你com.globeway.web.servlet.intercept.JsonGetInterceptor这个贡献出来不,大家参考下~谢了

这个我只是加了一个空壳而已,还没有用到,兄弟要看也无妨:
public class JsonGetInterceptor extends HandlerInterceptorAdapter {
private static final Logger logger = LoggerFactory.getLogger(JsonGetInterceptor.class);

@Override
public boolean preHandle(
            HttpServletRequest request,
            HttpServletResponse response,
            Object handler) throws Exception {
logger.debug("JsonGetInterceptor--{}",request.getParameter("RequestBody"));
return true;
    }


public void afterCompletion(
HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
logger.debug("request After---------",request.getParameter("RequestBody"));
}
}
13 楼 liguiking 2010-08-27  
yangfuchao418 写道
spring 还好。用struts2构建restful 真TMD 不方便。

struts2 restFul也不复杂,使用契约的话,免配置,注解都不用:
web.xml:
    <filter>
        <filter-name>struts</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

struts.xml:

    <constant name="struts.convention.action.suffix" value="Controller"/> 
    <constant name="struts.convention.action.mapAllMatches" value="true"/> 
    <constant name="struts.convention.default.parent.package" value="rest-default"/>
    <constant name="struts.mapper.class" value="rest" />
    <constant name="struts.convention.package.locators" value="controller"/>
    <package name="demo" extends="rest-default" namespace="/demo"/>
需要使用到struts2-convention-plugin.jar、struts2-rest-plugin.jar这两个插件包

Controller放在**.cotroller.*下即可:
public class XxxController extends ActionSupport implements ModelDriven<Object> {


    private String id = "";


    public HttpHeaders index() {
    return new DefaultHttpHeaders("index")
            .disableCaching();
    }
   
    public HttpHeaders show() {
    return new DefaultHttpHeaders("show");
    }

    @Override
    public Object getModel() {
return model;
    } 
}
在WEB-INF下建立目录:content/xxx/xxx-index.jsp,xxx-show.jsp,要支持Freemarker之流的就没有试过
如果要返回json或者xml,还要加上struts2-json-plugin.jar:/demo/1111.json /demo/1111.xml

IBM developerworker上有李刚大湿雄文一篇,大家可以去观摩一二
http://www.ibm.com/developerworks/cn/java/j-lo-struts2rest/

struts restful 与 spring3 mvc 熟优熟劣,就看各自的喜好了,本挫八年抗战,历经strut1--webwork2--struts2,最终皈依Spring3 MVC,摒弃尘世间的一切恩怨
12 楼 liuweifeng 2010-08-27  
liguiking 写道
liuweifeng 写道
请问LZ,下面这句是虾米?
<mvc:interceptors>
        <bean class="com.globeway.web.servlet.intercept.JsonGetInterceptor" />
</mvc:interceptors>

就是给contorller加上拦截器,跟struts2差不多,不过spring mvc只有before跟after,没有around,这点不爽


能把你com.globeway.web.servlet.intercept.JsonGetInterceptor这个贡献出来不,大家参考下~谢了
11 楼 liguiking 2010-08-27  
liuweifeng 写道
请问LZ,下面这句是虾米?
<mvc:interceptors>
        <bean class="com.globeway.web.servlet.intercept.JsonGetInterceptor" />
</mvc:interceptors>

就是给contorller加上拦截器,跟struts2差不多,不过spring mvc只有before跟after,没有around,这点不爽
10 楼 jitabc 2010-08-27  
good job
9 楼 icanfly 2010-08-27  
Spring 3 是非常HIGH
8 楼 javaliver 2010-08-27  
  现在公司用的 Spring3 MVC Restful ,挺灵活  

相关推荐

    spring-mvc-官方中文文档

    8. **视图解析**:Spring MVC 支持多种视图技术,如 JSP、FreeMarker、Thymeleaf 等。视图解析器(ViewResolver)会根据指定的视图名和前缀/后缀来生成实际视图的全路径。 9. **数据绑定**:Spring MVC 自动支持...

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

    在这个"springMVC 多视图配置(Jsp Freemarket Json)实例"中,我们将探讨如何在 SpringMVC 中设置多种视图解析器来支持 Jsp、FreeMarker 和 Json 格式的响应。 **1. 视图解析器 (View Resolver)** 在 SpringMVC ...

    spring-mvc jar包

    Spring MVC支持多种视图技术,如JSP、FreeMarker、Thymeleaf等。视图解析器(如InternalResourceViewResolver)会根据视图名称找到对应的资源,并渲染输出。 对于依赖管理,"aopalliance"标签可能指的是AOP(面向切...

    Spring-mvc-showcase

    5. **视图解析**:Spring MVC 默认使用 JSP 作为视图技术,但也可以配置 FreeMarker、Thymeleaf 等其他模板引擎。视图解析器根据控制器返回的视图名找到对应的视图文件,并结合模型数据渲染输出。 6. **异常处理**...

    Spring-MVC-step-by-step2.rar

    Spring MVC 支持多种视图技术,如 JSP、FreeMarker、Thymeleaf 等,你可以根据项目需求选择合适的视图技术。 Spring MVC 还提供了数据绑定和验证功能。通过 ModelAttribute 注解,可以将请求参数自动绑定到控制器...

    spring-mvc-showcase.zip

    Spring MVC 支持多种视图技术,如JSP、FreeMarker、Thymeleaf等。在`@RequestMapping`方法中,可以使用`return "viewName"`来指定视图,Spring MVC会根据配置的视图解析器来生成实际的视图页面。 五、视图解析器...

    Spring.MVC学习指南.pdf

    - JSP,FreeMarker,Thymeleaf等视图技术可与Spring MVC集成,用于生成动态HTML页面。 - 使用ModelAndView或Model对象传递数据到视图。 6. **异常处理**: - `@ExceptionHandler` 注解可以在Controller中处理...

    Spring-mvc Srping-boot spring-jdbc

    此外,Spring MVC支持多种视图技术,如JSP、Thymeleaf和FreeMarker,提供了强大的数据绑定和校验功能。 **Spring Boot** Spring Boot是为了简化Spring应用程序的初始搭建和配置而诞生的。它内置了Tomcat或Jetty...

    精通Spring MVC4

    JSP、FreeMarker、Thymeleaf等都可以作为视图技术,Spring MVC支持多种视图技术的集成。 5. **模型数据:Model和ModelAndView** Model接口用于存储请求处理过程中产生的数据,这些数据可以通过Model.addAttribute...

    spring-mvc 项目

    - **View**:视图负责渲染模型数据,通常使用 JSP、FreeMarker 或 Thymeleaf 等模板技术。 - **Controller**:控制器处理用户的请求,调用业务服务,准备模型数据,并决定哪个视图来呈现结果。 - **...

    spring-webmvc-3.2.5.RELEASE

    Spring MVC支持多种视图技术,如JSP、FreeMarker、Thymeleaf等。3.2.5版本优化了视图解析过程,允许开发者自定义视图解析逻辑。 6. **数据绑定与验证**: Spring MVC提供了强大的数据绑定和验证机制,可以自动将...

    Spring mvc5.0.3 所有jar包

    5. **视图解析**: Spring MVC支持多种视图技术,如JSP、FreeMarker、Thymeleaf等。通过`viewResolver`配置,可以指定视图解析器,将视图名解析为实际的视图路径。 6. **RESTful风格的URL设计**: Spring MVC支持创建...

    Mastering Spring MVC 4(2015.09)源码

    此外,Spring MVC 4还支持RESTful风格的Web服务,通过@RequestMapping注解的produces和consumes属性,可以处理不同格式的HTTP请求和响应,如JSON、XML等。 总的来说,"Mastering Spring MVC 4(2015.09)源码"提供了...

    spring-mvc-step-by-step

    在Spring MVC中,你可以使用模型对象来传递数据,而视图可以通过模板引擎(如Thymeleaf、JSP等)来渲染。教程会展示如何创建模型对象,以及如何使用视图解析器来决定最终展示的页面。 5. **请求处理** 通过`@...

    spring in action mvc 第四版 中文版

    《Spring in Action: Spring MVC 第四版 中文版》是一本深入探讨Spring MVC框架的权威指南,适合Java开发者阅读。本书全面介绍了如何使用Spring MVC来构建健壮、高性能的Web应用程序。Spring MVC是Spring框架的核心...

    spring mvc

    11. **MVC配置**: 传统的XML配置方式逐渐被Java-based配置和注解配置取代,简化了配置过程,使得Spring MVC应用更易维护。 12. **RESTful风格**: Spring MVC 支持创建RESTful API,通过@RequestMapping配合HTTP动词...

    Spring MVC 1 资源文件

    Spring MVC 可以配合多种视图技术,如 JSP、FreeMarker、Thymeleaf 等,提供丰富的用户体验。 10. **Ajax 支持** 通过 JSON 或 XML 数据交换,Spring MVC 可以方便地与前端 JavaScript 进行异步交互。 这个...

    Spring MVC 4.3.4

    4. **视图解析**:Spring MVC支持多种视图技术,如JSP、Thymeleaf、FreeMarker等。视图解析器会根据指定的视图名称,找到对应的视图模板进行渲染。 5. **异常处理**:通过@ControllerAdvice和@ExceptionHandler注解...

    spring-mvc-master.zip

    View是用户界面,可以是JSP、FreeMarker、Thymeleaf等模板引擎,Spring MVC支持多种视图技术。 五、数据绑定与验证 Spring MVC 提供了强大的数据绑定功能,可以从请求参数自动绑定到JavaBean的属性上。同时,通过...

    spring-webmvc-3.1.1.RELEASE.jar.zip

    在3.1.1版本中,对这两者进行了优化,支持更多的视图技术,如JSP、FreeMarker、Thymeleaf等。 3. **HandlerMapping与HandlerAdapter**: 这两个组件负责映射HTTP请求到合适的处理器方法。Spring Web MVC 3.1.1提供...

Global site tag (gtag.js) - Google Analytics