“Wildfly9下resteasy的简单应用实例”的版本间的差异

来自软件实验室
跳转至: 导航搜索
编写客户端页面
默认响应方法
第138行: 第138行:
  
 
== 默认响应方法 ==
 
== 默认响应方法 ==
只有@GET注解的方法的特殊意义
+
我们可以定义一个只有@GET注解的方法,表示默认的响应方法。也就是说,如果访问http://localhost:8080/rest/hello/时(注意,已经在 jboss-web.xml中将context-root设置为/),由saySomething这个方法来响应请求。
 +
 
 +
  <nowiki>
 +
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);
 +
}
 +
</nowiki>
  
 
== 编写客户端页面 ==
 
== 编写客户端页面 ==
  
 
注:本文参考了[[文件:Rest_HelloWorld_Tutorial.pdf]],出处忘记了,向原作者致谢并道歉!
 
注:本文参考了[[文件:Rest_HelloWorld_Tutorial.pdf]],出处忘记了,向原作者致谢并道歉!

2015年12月9日 (三) 12:19的版本

通过下面的实例可以看出,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: Wildfly resteasy 0.png

注意在最后一步要选中创建web.xml文件:

Wildfly resteasy 1.png

编写web.xml

打开创建的文件,在WebContent/WEB-INF目录找到web.xml文件。由于wildfly9已经紧密集成了resteasy,不再需要在web.xml中配置任何内容了!

如果熟悉JSF,Servlet技术,会记得一般需要在web.xml中配置哪个servlet负责响应和分发用户的请求,比如以前版本的wildfly要使用resteasy的配置选项如下:

    <servlet>
        <servlet-name>Resteasy</servlet-name>
        <servlet-class>
            org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
        </servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>sample.HelloWorldApplication</param-value>
        </init-param>
 
    </servlet>
 
    <servlet-mapping>
        <servlet-name>Resteasy</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

但是请记住,wildfly 9之后,再使用resteasy就不需要这个选项了,道理参见下面代码的@ApplicationPath注解。

编写服务器端接口

首先需要编写一个程序的入口,即编写一个带有@ApplicationPath注解的类,这个类是Application的子类,通过ApplicationPath注解告诉wildfly整个应用程序的入口url是什么。目前这个类可以是空的。 注意,Application类的全称是javax.ws.rs.core.Application,不要选错了。

Wildfly resteasy 2.png

 
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跳过此步): Wildfly resteasy 3.png

将restHello部署到wildfly: Wildfly resteasy 4.png

然后启动wildfly,打开浏览器访问http://localhost:8080/restHello/rest/hello/sayHello?name=subaochen,见证奇迹的时刻: Wildfly resteasy 5.png

尝试改变?name=后面的字符串看看效果如何?

进一步的解释

下面我们看看奇迹是如何发生的。

我们访问的URL是 http://localhost:8080/restHello/rest/hello/sayHello?name=subaochen,下面分段解释一下:

  • http://localhost:8080,wildfly的默认端口
  • 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文件即可:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web xmlns="http://www.jboss.com/xml/ns/javaee"
    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">
    <context-root>/</context-root>
</jboss-web>


方法的@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);
}

编写客户端页面

注:本文参考了文件:Rest HelloWorld Tutorial.pdf,出处忘记了,向原作者致谢并道歉!