`
jinnianshilongnian
  • 浏览: 21499370 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2417769
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:3008067
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5638956
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:259806
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1597040
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:250109
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5858146
Group-logo
跟我学Nginx+Lua开...
浏览量:701782
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:784900
社区版块
存档分类
最新评论

Spring4新特性——Web开发的增强

阅读更多

Spring4新特性——泛型限定式依赖注入

Spring4新特性——核心容器的其他改进

Spring4新特性——Web开发的增强

Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC 

Spring4新特性——Groovy Bean定义DSL

Spring4新特性——更好的Java泛型操作API 

Spring4新特性——JSR310日期API的支持

Spring4新特性——注解、脚本、任务、MVC等其他特性改进 

 

从Spring4开始,Spring以Servlet3为进行开发,如果用Spring MVC 测试框架的话需要指定Servlet3兼容的jar包(因为其Mock的对象都是基于Servlet3的)。另外为了方便Rest开发,通过新的@RestController指定在控制器上,这样就不需要在每个@RequestMapping方法上加 @ResponseBody了。而且添加了一个AsyncRestTemplate ,支持REST客户端的异步无阻塞支持。

 

1、@RestController

@RestController
public class UserController {
    private UserService userService;
    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }
    @RequestMapping("/test")
      public User view() {
        User user = new User();
        user.setId(1L);
        user.setName("haha");
        return user;
    }

    @RequestMapping("/test2")
    public String view2() {
        return "{\"id\" : 1}";
    }
}

 其实现就是在@@RestController中加入@ResponseBody:

@org.springframework.stereotype.Controller
@org.springframework.web.bind.annotation.ResponseBody
public @interface RestController {
}

这样当你开发Rest服务器端的时候,spring-mvc配置文件需要的代码极少,可能就仅需如下一行:

    <context:component-scan base-package="com.sishuok.spring4"/>
    <mvc:annotation-driven/>

  

2、mvc:annotation-driven配置变化

统一风格;将 enableMatrixVariables改为enable-matrix-variables属性;将ignoreDefaultModelOnRedirect改为ignore-default-model-on-redirect。

 

3、提供AsyncRestTemplate用于客户端非阻塞异步支持。

3.1、服务器端

对于服务器端的springmvc开发可以参考https://github.com/zhangkaitao/servlet3-showcase中的chapter3-springmvc

@RestController
public class UserController {
    private UserService userService;
    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }
    @RequestMapping("/api")
      public Callable<User> api() {
        System.out.println("=====hello");
        return new Callable<User>() {
            @Override
            public User call() throws Exception {
                Thread.sleep(10L * 1000); //暂停两秒
                User user = new User();
                user.setId(1L);
                user.setName("haha");
                return user;
            }
        };
    }
}

非常简单,服务器端暂停10秒再返回结果(但是服务器也是非阻塞的)。具体参考我github上的代码。

 

3.2、客户端

    public static void main(String[] args) {
        AsyncRestTemplate template = new AsyncRestTemplate();
        //调用完后立即返回(没有阻塞)
        ListenableFuture<ResponseEntity<User>> future = template.getForEntity("http://localhost:9080/spring4/api", User.class);
        //设置异步回调
        future.addCallback(new ListenableFutureCallback<ResponseEntity<User>>() {
            @Override
            public void onSuccess(ResponseEntity<User> result) {
                System.out.println("======client get result : " + result.getBody());
            }

            @Override
            public void onFailure(Throwable t) {
                System.out.println("======client failure : " + t);
            }
        });
        System.out.println("==no wait");
    }

 此处使用Future来完成非阻塞,这样的话我们也需要给它一个回调接口来拿结果; Future和Callable是一对,一个消费结果,一个产生结果。调用完模板后会立即返回,不会阻塞;有结果时会调用其回调。

 

AsyncRestTemplate默认使用SimpleClientHttpRequestFactory,即通过java.net.HttpURLConnection实现;另外我们也可以使用apache的http components;使用template.setAsyncRequestFactory(new HttpComponentsAsyncClientHttpRequestFactory());设置即可。

 

另外在开发时尽量不要自己注册如:

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">

尽量使用

<mvc:annotation-driven/> 

它设计的已经足够好,使用子元素可以配置我们需要的配置。

  

且不要使用老版本的:

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">

否则可能得到如下异常:

写道
Circular view path [login]: would dispatch back to the current handler URL [/spring4/login] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)

  

29
3
分享到:
评论
27 楼 bo_hai 2015-08-13  
http://www.cnblogs.com/yangzhilong/p/3725128.html
这里有更详细的使用方法。
26 楼 zqb666kkk 2015-02-09  
博主 有没有 spring4+hibernate4的demo 我想学习下
25 楼 在世界的中心呼喚愛 2014-09-28  
spring 4的配置demo有吗?求一份!!
24 楼 lokepaqi 2014-07-25  
contrarotate 写道
z19910509 写道
涛 哥,使用了 @RestController 注解后就只能返回json数据吗,我想返回一个视图,比如说index.jsp 还可以吗,试了下 只返回一个字符串 index

试试返回ModelAndView?

我也遇到过这问题,应该是因为 使用@ResponseBody将会跳过视图处理部分,而是调用适合HttpMessageConverter,将返回值写入输出流。
23 楼 jacking124 2014-07-10  
张哥,在android客户端请求的时候返回json出现406错误!!
22 楼 contrarotate 2014-06-16  
z19910509 写道
涛 哥,使用了 @RestController 注解后就只能返回json数据吗,我想返回一个视图,比如说index.jsp 还可以吗,试了下 只返回一个字符串 index

试试返回ModelAndView?
21 楼 z19910509 2014-04-04  
涛 哥,使用了 @RestController 注解后就只能返回json数据吗,我想返回一个视图,比如说index.jsp 还可以吗,试了下 只返回一个字符串 index
20 楼 dieslrae 2013-12-18  
jinnianshilongnian 写道
dieslrae 写道
jinnianshilongnian 写道
kangaroo_xin 写道
jinnianshilongnian 写道
kangaroo_xin 写道
@RestController

配置后为什么不起作用呢?哪里还需要配置

已经使用了spring 4.0.0的包了

使用@Controller 和 @ResponseBody 可以。


这是@RestController注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {

}

@ResponseBody 放在函数方法上可以,放在类上无效。

您那有这个的测试工程吗

这些都是我测试通过之后才写的

直接写
 <mvc:annotation-driven/>

没有问题,但是换成这样下面这种写法之后就会报错了
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    	<property name="messageConverters">
    		<list>
    			<ref bean="mappingJacksonHttpMessageConverter"/>
    		</list>
    	</property>
    </bean>
    
    <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
                <value>text/html;charset=UTF-8</value>
            </list>
        </property>
    </bean>


提示这个错
Circular view path [login]: would dispatch back to the current handler URL [/login] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)

估计是你哪个地配置的不对,MappingJacksonHttpMessageConverter升级到MappingJackson2HttpMessageConverter吧,(需要jackson2版本)

Circular view path [login]: would dispatch back to the current handler URL [/login] again

从错误看访问login好像死循环了;估计不是这段代码的问题;可能是其他配置的问题;如果方便把相关配置文件站内信我

晚上回家发你
19 楼 jinnianshilongnian 2013-12-18  
dieslrae 写道
jinnianshilongnian 写道
kangaroo_xin 写道
jinnianshilongnian 写道
kangaroo_xin 写道
@RestController

配置后为什么不起作用呢?哪里还需要配置

已经使用了spring 4.0.0的包了

使用@Controller 和 @ResponseBody 可以。


这是@RestController注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {

}

@ResponseBody 放在函数方法上可以,放在类上无效。

您那有这个的测试工程吗

这些都是我测试通过之后才写的

直接写
 <mvc:annotation-driven/>

没有问题,但是换成这样下面这种写法之后就会报错了
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    	<property name="messageConverters">
    		<list>
    			<ref bean="mappingJacksonHttpMessageConverter"/>
    		</list>
    	</property>
    </bean>
    
    <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
                <value>text/html;charset=UTF-8</value>
            </list>
        </property>
    </bean>


提示这个错
Circular view path [login]: would dispatch back to the current handler URL [/login] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)

估计是你哪个地配置的不对,MappingJacksonHttpMessageConverter升级到MappingJackson2HttpMessageConverter吧,(需要jackson2版本)

Circular view path [login]: would dispatch back to the current handler URL [/login] again

从错误看访问login好像死循环了;估计不是这段代码的问题;可能是其他配置的问题;如果方便把相关配置文件站内信我
18 楼 dieslrae 2013-12-17  
jinnianshilongnian 写道
kangaroo_xin 写道
jinnianshilongnian 写道
kangaroo_xin 写道
@RestController

配置后为什么不起作用呢?哪里还需要配置

已经使用了spring 4.0.0的包了

使用@Controller 和 @ResponseBody 可以。


这是@RestController注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {

}

@ResponseBody 放在函数方法上可以,放在类上无效。

您那有这个的测试工程吗

这些都是我测试通过之后才写的

直接写
 <mvc:annotation-driven/>

没有问题,但是换成这样下面这种写法之后就会报错了
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    	<property name="messageConverters">
    		<list>
    			<ref bean="mappingJacksonHttpMessageConverter"/>
    		</list>
    	</property>
    </bean>
    
    <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
                <value>text/html;charset=UTF-8</value>
            </list>
        </property>
    </bean>


提示这个错
Circular view path [login]: would dispatch back to the current handler URL [/login] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)
17 楼 jinnianshilongnian 2013-12-16  
pipinet 写道
楼主不知道有没有关于websocket的配置分析呢?

后续有时间的话想试试,然后分析;这个要看业余时间是否充分了
16 楼 pipinet 2013-12-16  
楼主不知道有没有关于websocket的配置分析呢?
15 楼 jinnianshilongnian 2013-12-15  
kangaroo_xin 写道
jinnianshilongnian 写道
kangaroo_xin 写道
@RestController

配置后为什么不起作用呢?哪里还需要配置

已经使用了spring 4.0.0的包了

使用@Controller 和 @ResponseBody 可以。


这是@RestController注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {

}

@ResponseBody 放在函数方法上可以,放在类上无效。

您那有这个的测试工程吗

这些都是我测试通过之后才写的
14 楼 jinnianshilongnian 2013-12-15  
kangaroo_xin 写道
jinnianshilongnian 写道
kangaroo_xin 写道
另外 AsyncRestTemplate 使用必须使用 application/json 返回json

如果使用text/html会报,无法转换成User对象。

嗯,它在请求时会带着Accept:application/json, application/*+json 过去;springmvc会自动响应Content-Type:application/json;

估计是不是你没加 jackson2的jar包?

因为IE下用 application/json 返回json,会发生弹出下载框的情况,所以一般我都定义成text/html返回json。 这样和AsyncRestTemplate 有点冲突了

这个倒不影响 可以写个filter判断下是客户端的 还是浏览器过来的 针对ie单独设置响应头
13 楼 kangaroo_xin 2013-12-15  
jinnianshilongnian 写道
kangaroo_xin 写道
另外 AsyncRestTemplate 使用必须使用 application/json 返回json

如果使用text/html会报,无法转换成User对象。

嗯,它在请求时会带着Accept:application/json, application/*+json 过去;springmvc会自动响应Content-Type:application/json;

估计是不是你没加 jackson2的jar包?

因为IE下用 application/json 返回json,会发生弹出下载框的情况,所以一般我都定义成text/html返回json。 这样和AsyncRestTemplate 有点冲突了
12 楼 kangaroo_xin 2013-12-15  
jinnianshilongnian 写道
kangaroo_xin 写道
@RestController

配置后为什么不起作用呢?哪里还需要配置

已经使用了spring 4.0.0的包了

使用@Controller 和 @ResponseBody 可以。


这是@RestController注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {

}

@ResponseBody 放在函数方法上可以,放在类上无效。

您那有这个的测试工程吗
11 楼 jinnianshilongnian 2013-12-15  
kangaroo_xin 写道
@RestController

配置后为什么不起作用呢?哪里还需要配置

已经使用了spring 4.0.0的包了

使用@Controller 和 @ResponseBody 可以。


这是@RestController注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {

}
10 楼 jinnianshilongnian 2013-12-15  
kangaroo_xin 写道
另外 AsyncRestTemplate 使用必须使用 application/json 返回json

如果使用text/html会报,无法转换成User对象。

嗯,它在请求时会带着Accept:application/json, application/*+json 过去;springmvc会自动响应Content-Type:application/json;

估计是不是你没加 jackson2的jar包?
9 楼 jinnianshilongnian 2013-12-15  
kangaroo_xin 写道
@RestController

配置后为什么不起作用呢?哪里还需要配置

已经使用了spring 4.0.0的包了

使用@Controller 和 @ResponseBody 可以。

不用配其他的啊;@RestController = @Controller + @ResponseBody
8 楼 kangaroo_xin 2013-12-14  
另外 AsyncRestTemplate 使用必须使用 application/json 返回json

如果使用text/html会报,无法转换成User对象。

相关推荐

    精通Spring4.x企业应用开发实战pdf+源码

    在Spring4.x版本中,框架引入了更多的新特性,如对Java 8的支持、WebSocket集成、反应式编程模型的Spring Reactor等,这些都极大地增强了Spring的灵活性和适用性。 在企业应用开发中,Spring框架的主要知识点包括:...

    Spring开发指南——中文版

    《Spring开发指南——中文版》是由夏昕编著的一本针对Spring框架的中文教程,旨在帮助开发者更好地理解和应用Spring框架。Spring是Java平台上的一个核心框架,广泛应用于企业级应用开发,提供了一种全面的编程和配置...

    webx3文档——web开发

    总的来说,Webx是一个综合性的Java Web开发框架,它通过层次化的设计和资源管理,为开发者提供了一个成熟的、可扩展的开发平台。Webx不仅可以用于快速搭建Web应用,还支持通过定制和扩展来满足特定项目的需求。Webx...

    spring4新特性之web开发增强

    总结来说,Spring4在Web开发领域带来了许多增强,如@RestController注解简化RESTful服务的创建,AsyncRestTemplate实现客户端异步请求,WebSocket支持,MVC层的改进,以及对Java 8特性的良好支持等。这些改进极大地...

    JAVA初级教程——Web系统开发技术与方法

    【JAVA初级教程——Web系统开发技术与方法】涵盖了Web编程的多个核心领域,旨在帮助初学者建立起完整的Web系统开发知识体系。以下是对每个知识点的详细解释: 1. **Web编程基本知识**: - **HTML**是超文本标记...

    Spring4.x企业应用开发 有书签,很方便查找

    pring 4.0是Spring在积蓄4年后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域*开源平台的翘楚地位。Spring 4.0引入了众多Java开发者翘首以盼的基于Groovy Bean的配置、HTML 5/WebSocket支持等新功能...

    Spring3.x企业应用开发实战

     Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升...

    深入体验Java Web开发内幕——高级特性 源代码

    在深入体验Java Web开发的过程中,我们常常需要掌握其核心基础以及高级特性,这些知识点对于成为一名优秀的Java Web开发者至关重要。本文将结合"深入体验Java Web开发内幕"的主题,详细阐述一些关键的技术点,并提及...

    org.springframework.web.struts-3.1.0.M2.jar

    在Java Web开发领域,Spring框架以其强大的依赖注入和面向切面编程能力,以及丰富的模块支持,成为了广大开发者青睐的框架。而Struts作为经典的MVC框架,长期以来也占据着重要的地位。当两者结合时,可以构建出高效...

    org.springframework.web-3.0.0.RC3.jar

    Spring Web框架是Java Web开发中的重要组成部分,它为构建高效、灵活的Web应用程序提供了强大支持。在本文中,我们将深入探讨Spring Web框架的3.0.0.RC3版本,以及该版本中的核心组件和关键特性。 一、Spring框架...

    spring-web-3.1.1.RELEASE.jar.zip

    二、Spring Web 3.1.1.RELEASE新特性 在3.1.1.RELEASE版本中,Spring Web模块引入了以下关键改进和特性: 1. 改进的类型安全的HTTP消息转换:通过`HttpMessageConverter`,Spring支持多种格式的数据交换,如JSON、...

    Spring 3.x企业应用开发实战 pdf

    REST风格的Web编程模型为Web服务提供了全新的开发模式,降低了Web开发的复杂度,增强了API的可读性和可维护性。 本书的前身是《精通Spring2.x——企业应用开发详解》,经过一年的改版和调整,内容已经与Spring 3.0...

    Spring 参考手册及开发指南中文版

    Spring2.0版本在当时是一个重要的里程碑,引入了许多新特性和改进,极大地增强了其灵活性和可扩展性。以下是对这两个文档——"Spring2.0参考手册(中文).pdf"和"Spring开发指南中文.pdf"中关键知识点的详细解读。 ...

    spring-framework-5.3.23 源码

    在Web开发领域,Spring MVC是Spring Framework的一部分,提供了一个强大的MVC(Model-View-Controller)架构。它负责接收HTTP请求,处理业务逻辑,更新模型数据,并将结果呈现给视图。Spring MVC的松耦合设计使得...

    Spring 3.x 企业应用开发实战[光盘].part03

    Spring 3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是Java Web应用开发的难度,同时有效提升...

    Spring 3.x 企业应用开发实战[光盘].part02.rar

    Spring 3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是Java Web应用开发的难度,同时有效提升...

    Spring 3.x 企业应用开发实战[光盘].part06.rar

    Spring 3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是Java Web应用开发的难度,同时有效提升...

    Spring 3.x 企业应用开发实战[光盘].part05.rar

    Spring 3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是Java Web应用开发的难度,同时有效提升...

    Spring 3.x 企业应用开发实战[光盘].part04.rar

    Spring 3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是Java Web应用开发的难度,同时有效提升...

Global site tag (gtag.js) - Google Analytics