通过下面的实例可以看出,resteasy 3.0.11之后创建一个restful应用是多么的简单!
环境准备
本案例用到的工具及其版本号如下:
wildfly 9.0.2,其中默认自带的resteasy版本是3.0.11,本案例没有升级resteasy的版本。
eclipse Mars,安装了JBoss Tools 4.0。
创建项目
在Eclipse中通过new->Web->Dynamic Web Project创建新项目helloRest:
注意在最后一步要选中创建web.xml文件:
编写web.xml
打开创建的文件,在WebContent/WEB-INF目录找到web.xml文件。由于wildfly9已经紧密集成了resteasy,不再需要在web.xml中配置任何内容了!
如果熟悉JSF,Servlet技术,会记得一般需要在web.xml中配置哪个servlet负责响应和分发用户的请求,比如以前版本的wildfly要使用resteasy的配置选项如下:
Resteasy
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
javax.ws.rs.Application
sample.HelloWorldApplication
Resteasy
/*
但是请记住,wildfly 9之后,再使用resteasy就不需要这个选项了,道理参见下面代码的@ApplicationPath注解。
编写服务器端接口
首先需要编写一个程序的入口,即编写一个带有@ApplicationPath注解的类,这个类是Application的子类,通过ApplicationPath注解告诉wildfly整个应用程序的入口url是什么。目前这个类可以是空的。
注意,Application类的全称是javax.ws.rs.core.Application,不要选错了。
package helloRest;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("/rest")
public class MyApplication extends Application
{
}
接着定义一个服务接口如下:
package helloRest;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
@Path("hello")
public interface HelloService
{
@GET
@Path("sayHello")
public String sayHello(@QueryParam("name") String name);
}
编写一个HelloService的实现类如下:
package helloRest;
public class Hello implements HelloService
{
@Override
public String sayHello(String name)
{
// TODO Auto-generated method stub
return "hello " + name ;
}
}
测试一下
首先build project(不要忘记了这一步,尤其是关闭了Build Automatically),然后在servers view中添加wildfly9(如果已经添加了wildfly9跳过此步):
将restHello部署到wildfly:
然后启动wildfly,打开浏览器访问http://localhost:8080/restHello/rest/hello/sayHello?name=subaochen,见证奇迹的时刻:
尝试改变?name=后面的字符串看看效果如何?
进一步的解释
下面我们看看奇迹是如何发生的。restHello:我们的restful应用的包名,或者说项目名
rest:这就是@ApplicationPath("/rest")的作用,ApplicationPath定义了@Path注解中的目录的起始路径。也就是说,如果@Path("/test"),那么真实的路径应该是rest/test。@ApplicationPath的作用类似于Apache配置文件中的DocumentRoot。要注意的是,最终的路径是三个部分组成的:项目名+ApplicationPath+Path。
hello:就是@Path("hello")或者@Path("/hello")中定义的。一般的,每一个模块都会使用一个@Path以决定这个模块的起始路径。要注意两点:第一,@Path注解的路径是相对的,用/开头没有必要,实际上会被忽略掉。第二,在类或者接口上定义的@Path指定了该模块的起始路径(相对于ApplicationPath),在方法上定义的@Path是相对于包含这个方法的类或者接口的Path的。
sayHello:
?name=subaochen
如果我们想把项目放到根目录,也就是希望用http://localhost:8080/rest/hello/sayHello?name=subaochen 访问,只需要在WEB-INF放一个jboss-web.xml文件即可:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.jboss.com/xml/ns/javaee
http://www.jboss.org/j2ee/schema/jboss-web_5_1.xsd">
/
方法的@Path的几种变化
@Path("sayHello")
@Path("{name}")
方法参数中的注解
@QueryParam
@PathParam
默认响应方法
我们可以定义一个只有@GET注解的方法,表示默认的响应方法。也就是说,如果访问http://localhost:8080/rest/hello/时(注意,已经在 jboss-web.xml中将context-root设置为/),由saySomething这个方法来响应请求。
package helloRest;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
@Path("/hello")
public interface HelloService
{
@GET
public String saySomething();
@GET
@Path("sayHello")
public String sayHello(@QueryParam("name") String name);
}
基于Maven的项目生成和部署