欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

spring4新特性之web开发增强

程序员文章站 2024-02-29 23:53:10
从spring4开始,spring以servlet3为进行开发,如果用spring mvc 测试框架的话需要指定servlet3兼容的jar包(因为其mock的对象都是基于...

从spring4开始,spring以servlet3为进行开发,如果用spring mvc 测试框架的话需要指定servlet3兼容的jar包(因为其mock的对象都是基于servlet3的)。另外为了方便rest开发,通过新的@restcontroller指定在控制器上,这样就不需要在每个@requestmapping方法上加 @responsebody了。而且添加了一个asyncresttemplate ,支持rest客户端的异步无阻塞支持。 

1、@restcontroller

java代码  

@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:

java代码 

@org.springframework.stereotype.controller 
@org.springframework.web.bind.annotation.responsebod 
public @interface restcontroller { 
} 

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

java代码  

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

2、mvc:annotation-driven配置变化

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

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

3.1、服务器端

java代码  

@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、客户端

java代码  

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());设置即可。

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

java代码 

<bean class="org.springframework.web.servlet.mvc.method.annotation.requestmappinghandlermapping"/> 
<bean class="org.springframework.web.servlet.mvc.method.annotation.requestmappinghandleradapter"> 

尽量使用

java代码  

<mvc:annotation-driven/>  

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

且不要使用老版本的:

java代码  

<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.)

总结

以上所述是小编给大家介绍的spring4新特性之web开发增强,希望对大家有所帮助