一个实例演示jersey框架实现RESTful风格的Webservice,并发布到Tomcat,以及客户端调用示范

来源:互联网 发布:linux 保存退出命令 编辑:程序博客网 时间:2024/05/21 08:03

通过一个实例演示jersey框架实现RESTful风格的Webservice,并发布到Tomcat,以及客户端调用示范

1.环境和工具

操作系统:windows 7操作系统

IDE:Eclipse Java EE IDE

JDK版本:jdk1.6.0_30

Web容器:Tomcat 7.0.68

2.工具安装

Eclipse Java EE 和Tomcat 7.0.68都是开源项目,且免安装,所以可以从官网下载解压,JDK也从官网下载,但是需要安装。

三个基础软件安装完成后,需要对JDK和Tomcat进行环境变量的设置

1.新建变量名CATALINA_HOME,设置为Tomcat的解压后路径,如C:\apache-tomcat-7.0.68

2.新建变量名JAVA_HOME,设置为JDK的安装后路径,如C:\Program Files\Java\jdk1.6.0_30,并将JAVA_HOME加入变量Path中

至此,环境准备完成。

3.新建一个Dynamic Web Project工程

工程目录下


以下是UserInfo.java源码:


package com.luo.restfullws;


import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;


import org.apache.log4j.Logger;


// @Path表示类资源的相对URI路径
@Path("UserInfoService")
public class UserInfo {
static Logger logger = Logger.getLogger(UserInfo.class);


// @GET表示userName方法处理HTTP GET请求
@GET
// @Path表示方法资源在类中的相对URI路径
@Path("/name/{name}")
// 方法资源的返回类型
@Produces(MediaType.TEXT_XML)
// @PathParam表示和@Path对应的方法参数
public String userName(@PathParam("name") String name) {
logger.info("userName Param:" + name);
return "<User>" + "<Name>" + name + "</Name>" + "</User>";
}


@GET
@Path("/age/{age}")
@Produces(MediaType.TEXT_XML)
public String userAge(@PathParam("age") int age) {
return "<User>" + "<Age>" + age + "</Age>" + "</User>";
}
}

因为源码中使用了log4j日志,所以必须增加一个log4j的配置文件


由于是web项目,且使用了框架,需要指定框架支持者即jersey,web.xml配置如下

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>RESTfulWS</display-name>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.luo.restfullws</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>


log4j.properties如下,定义了三个输出方式,分别是标准输出,文件输出,和网络日志输出

log4j.rootLogger=INFO, stdout,SYSLOG,logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.SYSLOG=org.apache.log4j.net.SyslogAppender
log4j.appender.SYSLOG.SyslogHost=127.0.0.1
log4j.appender.SYSLOG.layout=org.apache.log4j.PatternLayout
log4j.appender.SYSLOG.layout.ConversionPattern=[%d{ABSOLUTE},%c{1}] %m%n
log4j.appender.logfile=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.File=D\:/logs/fdoAssign.log
log4j.appender.logfile.MaxFileSize=10240KB
log4j.appender.logfile.MaxBackupIndex=5
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n


通过右键将工程导出为war包RESTfulWS.war

将RESTfulWS.war拷贝到Tomcat的webapps路径下C:\apache-tomcat-7.0.68\webapps,完成部署动作(部署很简单)

由于该war中需要日志服务,需要将log4j-1.2.16.jar复制到Tomcat的jar库目录下C:\apache-tomcat-7.0.68\lib

对于多个项目需要部署到Tomcat时,各项目会用到同样的jar,所以可以将公共jar都复制到Tomcat的jar库目录下

这样为每个项目打包时的war就不需要包含这些jar了,文件也就小很多

打包时可以将工程目录WebContent/WEB-INF/lib下的jar都删除再打包成war包


剩下的就是要启动Tomcat,在Tomcat路径下C:\apache-tomcat-7.0.68\bin,执行批处理startup.bat启动Tomcat,部署的war包随之启动


服务启动后,可以通过浏览器键入URL验证服务是否正常

比如输入地址http://localhost:8080/RESTfulWS/rest/UserInfoService/name/abc

在浏览器上将显示一串服务端返回的字符串,说明服务正常


下面新建一个普通工程,从客户端来访问RESTful服务

jersey相关的jar该加的都加上,最好全加上,就是这么糙

源码如下:

package webservice;


import java.util.Date;


import javax.ws.rs.core.MediaType;


import org.apache.log4j.Logger;


import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;


public class UserInfoClient {
// http://localhost:8080/RESTfulWS/rest/UserInfoService/name/
static Logger logger = Logger.getLogger(UserInfoClient.class);
public static final String BASE_URI = "http://localhost:8080/RESTfulWS";
public static final String PATH_NAME = "/UserInfoService/name/";
public static final String PATH_AGE = "/UserInfoService/age/";


public static void main(String[] args) {
int count = 1 * 100;
int i = 0;
String name = "abc";
int age = 18;


ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
WebResource resource = client.resource(BASE_URI);
logger.info(new Date());
while (i++ < count) {
WebResource nameResource = resource.path("rest").path(
PATH_NAME + name);
logger.info("Client Response " + getClientResponse(nameResource));
getResponse(nameResource);
logger.info("Response:" + getResponse(nameResource));


WebResource ageResource = resource.path("rest")
.path(PATH_AGE + age);
logger.info("Client Response " + getClientResponse(ageResource));
getResponse(ageResource);
logger.info("Response:" + getResponse(ageResource));
}
logger.info(new Date());
}


/**
* 针对客户端的请求, 服务端给出的一个应答状态

* @param service
* @return
*/
private static String getClientResponse(WebResource resource) {
return resource.accept(MediaType.TEXT_XML).get(ClientResponse.class)
.toString();
}


/**
* 针对客户端的请求, 服务端给出XML格式的返回

* @param service
* @return
*/
private static String getResponse(WebResource resource) {
return resource.accept(MediaType.TEXT_XML).get(String.class);
}
}


运行客户端main方法,打印服务端返回的字符串,演示完成。


演示过程中碰到的幺蛾子

1.浏览器输入http://localhost:8080登陆Tomcat时,发现没有权限,进入不了管理页面

按照提示,找到用户权限配置文件,在指定位置<tomcat-users>和</tomcat-users>中间增加如下两行配置即可,用户权限配置文件路径为C:\apache-tomcat-7.0.68\conf

<role rolename="manager-gui"/>
<user username="tomcat" password="123" roles="manager-gui"/>

该方法适用于版本为Tomcat 7.0.68


2.增加log4j日志服务后,访问服务失败

将log4j-1.2.16.jar复制到Tomcat的jar库目录下C:\apache-tomcat-7.0.68\lib

重启服务后,访问即正常


3.浏览器输入http://localhost:8080登陆Tomcat时,发现不能访问

需要修改环境变量,将环境变量名CATALINA_HOME,设置为Tomcat的解压后路径,如C:\apache-tomcat-7.0.68


4.server.xml配置对Tomcat运行影响

server.xml中<Host>标签下的<Context>中的docBase指定了上下文

docBase="C:\apache-tomcat-7.0.68\wtpwebapps\RESTfulWS" path="/RESTfulWS"

这个路径需要指定为一个已部署的项目,项目中包含log4j日志配置

新增一个项目时,只需要将项目复制到webapps路径下即可

如果不这样做,发现Tomcat会启动失败

1 0
原创粉丝点击