restful web_泽西岛的RESTful Web服务

restful web

我已经讨论了有关体系结构考虑事项<< link >>的早期文章,以成为可在我的系统/机器上使用的分布式环境上的RESTful系统。 本文我们将讨论如何基于REST体系结构考虑来构建Web服务。 本教程说明了如何使用Tomcat 6,Eclipse和Jersey JAX-RS(JSR 311)参考实现在Java中开发RESTful Web服务。

简而言之,RESTful Web服务是使用HTTP on REST原理的机器之间的通信,它具有以下要点:

  • 每个资源代表唯一的URI,以通过HTTP协议进行通信
  • HTTP方法支持的每个资​​源操作(POST,GET,PUT和DELETE)
  • JSON,XML和各种MIME类型(例如图像,字节流等)支持的请求和响应。

JAX-RS

JAX-RS是基于注释的API,用于在Java中基于HTTP实现RESTful Web服务。 本质上,类和方法用信息注释,这些信息使运行时可以将它们公开为资源。 在考虑到URI,请求和接受的内容类型以及HTTP方法的情况下,实现JAX-RS的运行时在HTTP协议和Java类之间进行中介。

Jersey框架实现了JSR-RS(JSR-311)参考API。 除了Jersey之外,还有其他各种实现,例如Retlet,JBOSS RESTeasy,Apache CXF等。

球衣:

泽西岛包含以下主要部分:

  • 核心服务器:要基于注释构建RESTful Web服务,请包含诸如jersey-core.jar,jersey-server.jar,jsr311-api.jar,asm.jar之类的关键库。
  • 核心客户端:Jersey客户端API可帮助您轻松与REST服务进行通信,包括libabry ersey-client.jar
  • JAXB支持:(在高级示例中使用)jaxb-impl.jar,jaxb-api.jar,activation.jar,stax-api.jar,wstx-asl.jar
  • JSON支持:(在高级示例中使用)jersey-json.jar
  • 集成:Jersey还提供了可以轻松与Spring,Guice,Apache Abdera等集成的库。

获取工具

软件 下载
Java JDK-6 http://www.oracle.com/
Eclipse –印度 http://www.eclipse.org/
Tomcat的Apache -6 http://tomcat.apache.org/
H2-数据库 http://www.h2database.com/

注意 :您可以在此处下载完整的演示应用程序,包括H2和Jersey库<link>

使用Jersey的RESTful Web服务实现

我们将为用户管理构建一个小型应用程序,以对用户进行CRUD操作。 然后,我们将使用列用户名和密码创建一个小的User表,并使用Jersey注释对Web服务使用POJO类公开操作进行CRUD操作。

以下是开始RESTful Web服务开发之前的设计注意事项。

  • 资源:具有用户名和密码属性的用户
  • 资源类: UsersResource.java
  • URI: http:// localhost:8080 / UserManagement / users
  • 表示形式: XML

应用程序开发文件夹结构

我们的应用程序的目录结构如下所示:

重置ws文件夹结构

以下是所需的应用程序库列表:

reset-ws-folder-lib

应用配置:

在开始开发之前,我们需要将Jersey servlet添加到web.xml中,以将整个请求定向到jersey,以进行资源标识和操作过程(POST,GET,PUT和DELETE)。

包含jersey servlet之后,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>UserManagement</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>resource.com.users.java</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>Jersey REST Service</servlet-name><url-pattern>/*</url-pattern></servlet-mapping>
</web-app>

资源资源

资源是指可通过网络寻址和操纵的任何东西。 Jersey资源是带有@Path注释的纯Java对象(PO​​JO),将由HTTP方法POST,GET,PUT和DELETE进行操纵。 资源还具有子资源。 在示例应用程序Users Users的UsersResource中,Java bean是Resources。 用户是具有属性名称和密码的简单POJO

UsersResource.java
@Path("/users")
public class UsersResource implements IUsersResource{
@Context
UriInfo uriInfo;
@GET
@Produces ("application/xml")
public List<User> getUsersAll() {
List<User> als=null;
try {
als= UserService.getInstance().getUserAll();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return als;
}@POST
@Consumes ("application/xml")
@Produces ("application/xml")
public User createUser(User user){
URI uri = uriInfo.getAbsolutePathBuilder().path(user.getUserName()).build();
Response res=Response.created(uri).build();
try {
UserService.getInstance().CreateUser(user);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return user;
}@Path("/user/{username}")
@GET
@Produces ("application/xml")public List<User> getUser(@PathParam("username") String username) {
List<User> asl=null;
try {
asl= UserService.getInstance().getUser(username);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return asl;
}

以下是对JAX-RS注释的简要说明

  • @Path:与根路径结合的路径提供URI来标识资源。 例如,在给定的示例URI中将为http:// localhost:8080 / UserManagement / users
  • @Path(“ / user / {username}”):我们也可以在方法上使用子路径来公开子资源,此示例URI将为http:// localhost:8080 / UserManagement / users / user / john
  • @Context:上下文用于注入上下文对象,例如Request,Response,UriInfo,ServletContext等。
  • @PathParam:此批注与@Path一起使用,并与GET,POST,PUT和DELETE结合使用。 其他可用的注释是@ FormParam,@ QueryParam等。
  • @Produces(“ application / xml”):支持多种MIME类型的响应。 在这种情况下,application / xml将是默认的MIME类型。
  • @Consumes(“ application / xml”):输入请求有效负载将以xml格式发送。
  • @GET:由GET,POST,PUT和DELET方法之一操纵的资源通过HTTP标头传递

JAXB – Java POJO XML绑定

泽西岛支持JAXB,实习生将POJO转换为XML,反之亦然。 为了使POJO具备支持XML的资格,我们必须声明@XmlRootElement注释,如下所示:

不要忘记在转换过程中根据需要添加空的构造函数。

@XmlRootElement
public class User {
private String userName;
private String userPasswd;
public User(String userName, String userPasswd) {
this.userName = userName;
this.userPasswd = userPasswd;
}
public User() {
super();
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPasswd() {
return userPasswd;
}
public void setUserPasswd(String userPasswd) {
this.userPasswd = userPasswd;
}
}

我们将在H2数据库的User表中创建执行CRUD操作的服务类。

UserService.javapublic class UserService{
public static UserService userService = new UserService();
public static final String GET_USER="SELECT * FROM USER";
public static final String INSERT_USER="Insert into user ";
public List<User> getUserAll() throws ClassNotFoundException, SQLException {
List<User> ls = new ArrayList();
ls=DataServiceHelper.getInstance().executeQuery(GET_USER);
return ls;
}public List<User> getUser(String name) throws ClassNotFoundException, SQLException{
String SQL_WHERE_CAS=" where name='"+name+"'";
List<User> als=DataServiceHelper.getInstance().executeQuery(GET_USER+SQL_WHERE_CAS);
return als;
}public void CreateUser(User user) throws SQLException, ClassNotFoundException {
String SQL_WHERE_CASE=" VALUES('" + user.getUserName() + "','" + user.getUserPasswd() + "')";
DataServiceHelper.getInstance().executeUpdateQuery(INSERT_USER+SQL_WHERE_CASE);
}
public static UserService getInstance() {
return userService;
}
}

助手类

我们必须创建更多的类来与DB(在本例中为H2)进行交互并执行CRUD操作。

DaraServiceHelper.javapublic class DataServiceHelper {
public static DataServiceHelper dataServiceHelper = null;
private Connection con = null;
DataSource dataSource = null;
InitialContext initialContext = null;
public static final String DB_URL = "jdbc:h2:tcp://localhost/~/test";
public static final String DRIVER_NAME = "org.h2.Driver";
/*** This method is used to create an object for the given DAO class name.
*/public Connection getConnection() throws ClassNotFoundException,
SQLException {
Class.forName(DRIVER_NAME);
con = DriverManager.getConnection(DB_URL, "sa", "");
return con;
}public void closeConnection() throws SQLException {
if (isConnectionOpen()) {
con.close();
con = null;
}
}
public boolean isConnectionOpen() {
return (con != null);
}public static DataServiceHelper getInstance() {
if (dataServiceHelper == null) {
dataServiceHelper = new DataServiceHelper();
}
return dataServiceHelper;
}public void executeUpdateQuery(String query) throws SQLException,
ClassNotFoundException {
Connection con = getConnection();
Statement stmt = con.createStatement();
stmt.execute(query);
closeConnection();
}public List<User> executeQuery(String query) throws ClassNotFoundException,
SQLException {
Connection con = getConnection();
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query);
List<User> als = convertPojoList(rs);
closeConnection();
return als;
}private List<User> convertPojoList(ResultSet rs) throws SQLException {
List<User> asl = new ArrayList<User>();
while (rs.next()) {
User user = new User(rs.getString("name"), rs.getString("password"));
asl.add(user);
}
return asl;
}public static void main(String[] args) throws ClassNotFoundException,
SQLException {
String query = "Select * from user where name='nitin'";
List<User> als = DataServiceHelper.getInstance().executeQuery(query);
System.out.println("List==>" + als);
}
}

注意:为简单起见,我将所有代码都包含在一个类中

泽西岛客户测试

泽西岛提供客户端来测试RESTful Web服务,它有助于与服务器进行通信并测试服务。 该库是一个通用实现,可以与任何基于HTTP / HTTPS的Web服务配合使用。

public class UserResourceSample {
public static final String USER_URI="http://localhost:8080/UserManagement/users";
public String testGetUsersAll() {
ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
WebResource resource = client.resource(ForumConstant.USER_URI);
ClientResponse response = resource.type(MediaType.APPLICATION_XML).get(
ClientResponse.class);
String en = response.getEntity(String.class);
return en;
}public String testGetUsers() {
ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
WebResource resource = client.resource(ForumConstant.USER_URI);
ClientResponse response = resource.type(MediaType.APPLICATION_XML).get(
ClientResponse.class);
String en = response.getEntity(String.class);
return en;
}public User testCreateUser() {
User user = new User("John", "john@");
Client client = Client.create();
WebResource r = client.resource(ForumConstant.USER_URI);
ClientResponse response = r.accept(MediaType.APPLICATION_XML).post(
ClientResponse.class, user);
return user;
}
}

使用浏览器运行

在Eclipse中运行Web应用程序,并在以下位置测试REST服务的可用性: http:// localhost:8080 / UserManagement / users&#8221;。 您应该看到用户项目的XML表示形式:

restful-web-services_testbrow1

对于子资源:

restful-web-services_testbrow2

注意 :在运行应用程序之前,请不要忘记运行H2数据库并将记录插入到User表中

结论:

这个例子讨论了Apache tomcat与Jersey的基本用法。 我们将在以后讨论一些JAX-RS的高级用法。 您也可以将完整的代码下载到此链接下面的<>

资源:

  • http://en.wikipedia.org/wiki/Representational_state_transfer
  • https://jersey.java.net/

参考: Tech My Talk博客上的JCG合作伙伴 Nitin Kumar提供的RESTful Webservices with Jersey 。

翻译自: https://www.javacodegeeks.com/2013/07/restful-webservices-with-jersey.html

restful web

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348482.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见操作系统调度算法研究(1)

FIFO FIFO全称是first in first out&#xff0c;是操作系统里面常见的一种算法&#xff0c;他就好比是一堆人在排一个队伍&#xff0c;按照先进先出的规则&#xff0c;谁首先排队谁就可以第一个出去。 它的缺点显而易见&#xff0c;如果第一个进去的家伙任务量过大&#xff0c…

struts2 mysql 乱码_struts2项目插入中文到mysql数据库乱码的解决方法

项目又出了一些小问题&#xff0c;在更新/插入中文数据到mysql数据库时会显示问号。我做了如下工作解决了问题&#xff1a;1. 检查页面编码将所有的jsp页面编码方式、字符集更改为2. 更改数据库字符集/编码方式将mysql配置文件my.ini相关内容改为[mysql]default-character-setu…

常见操作系统调度算法研究(2)

轮转策略 轮转策略&#xff08;Round-Robin&#xff09;简称为RR&#xff0c;在RR里面&#xff0c;每个准备就绪的任务只能在有限的时间内运行&#xff0c;也就是说不管这个任务完成与否&#xff0c;都会切换任务到下一个。 由于它要频繁的切换队列&#xff0c;我们可以把准备…

使用Apache Ignite优化Spark作业性能(第1部分)

快来看看他们是如何工作的&#xff01; 本文的某些部分摘自我的书《 Apache Ignite的高性能内存计算》 。 如果您对这篇文章感兴趣&#xff0c;请查看本书的其余部分&#xff0c;以获取更多有用的信息。 Apache Ignite提供了几种提高Spark作业性能的方法&#xff1a;Ignite RD…

centos8.2安装mysql_为CentOS 8操作系统安装MySQL的方法,以安装MySQL 8为例

在本文中&#xff0c;我们将向你展示如何在CentOS 8操作系统上安装MySQL 8.0&#xff0c;可从默认的CentOS 8存储库中安装最新版本的MySQL数据库服务器8.0版&#xff0c;CentOS 8还提供了MariaDB 10.3&#xff0c;它是MySQL 5.7的直接替代品&#xff0c;但有一些限制&#xff0…

rust中的堆和栈

堆和栈定义&#xff1a; 在数据结构中&#xff0c;栈是一种可以实现“先进后出”&#xff08;或者称为“后进先出”&#xff09;的存储结构。假设给定栈 S&#xff08;a0&#xff0c;a1&#xff0c;…&#xff0c;an-1&#xff09;&#xff0c;则称 a0 为栈底&#xff0c;an-1…

mysql查看索引创建进度_SQL Server查看索引重建、重组索引进度

相信很多SQL Server DBA或开发人员在重建或重组大表索引时&#xff0c;都会相当郁闷&#xff0c;不知道索引重建的进度&#xff0c;这个对于DBA完全是一个黑盒子&#xff0c;对于系统负载非常大的系统或维护窗口较短的系统&#xff0c;你会遇到一些挑战。例如&#xff0c;你创建…

rust中函数 变量 控制结构

变量相关 不可变 let x可变 let nut x常量 const x:T value静态变量 static x:TT::new();可变的静态变量 static mut x:TT::new(); 可能要使用到lazy_static()变量函数体 fn x(a1;T1…) -T{} 如果函数没有返回值 那么返回值就会为unit结构体 struct S {…} 1.元组结构体 struc…

选择Java密码算法第1部分-散列

抽象 这是涵盖Java加密算法的三部分博客系列的第1部分。 本系列介绍如何实现以下目标&#xff1a; 使用SHA–512散列 使用AES–256的单密钥对称加密 使用RSA–4096的公钥/私钥非对称加密 这第一篇文章详细介绍了如何实现SHA–512哈希。 让我们开始吧。 免责声明 这篇文章仅…

mysql order by date_Best practice question for MySQL: order by id or date?

问题This is kind of a noobish question, but its one that Ive never been given a straight answer on.Suppose I have a DB table with the following fields and values:| id | date_added | balance |------------------------------------| 1 | 2009-12-01 19:43:22 | 1…

坚实原则:单一责任原则

单一责任原则是首字母缩写词的第一原则。 “一个班级只有一个改变的理由。” 每个模块或类都应对软件提供的功能的单个部分负责&#xff0c;并且该责任应由类完全封装。 例如&#xff0c;想象一下导航软件的场景。 我们根据给定的方向&#xff08;北&#xff0c;南&#xf…

rust的项目管理

cargo cargo是rust的包管理工具 创建的一个项目 cargo new expr编写完代码之后记得编译一下&#xff0c;然后运行 cargo build运行项目cargo run 当我们觉得项目编译起来太慢了的时候可以将项目编辑成release版本 cargo run --releasecrate 在 Rust 里&#xff0c;一个项目…

宋利兵 mysql_《MySQL 5.7 Replication新特性》分享之互动问题解答

分享主题《MySQL 5.7 Replication新特性》嘉宾介绍宋利兵&#xff0c;MySQL研发工程师。2009年加入MySQL全球研发团队,从事MySQL复制相关功能的开发。主题介绍主要分享在MySQL 5.7中&#xff0c;Replication(复制)相关的一些新特性&#xff0c;比如多源复制、增强半同步复制、并…

使用Eclipse Deeplearning4j构建简单的神经网络

神经网络导论 深度学习既包含深度神经网络又包含深度强化学习&#xff0c;这是机器学习的子集&#xff0c;而机器学习本身就是人工智能的子集。 广义上讲&#xff0c;深度神经网络执行机器感知&#xff0c;该机器感知从原始数据中提取重要特征&#xff0c;并对每个观察结果做出…

mysql 注入 绕过防火墙_绕过阿里云防火墙继续扫描探测和SQL注入

前言如今的互联网&#xff0c;WAF泛滥的年代&#xff0c;实在让我等脚本小子苦恼ing&#xff0c;尤其是阿里云服务器的自带防护&#xff0c;那不是一般的叫人牙疼&#xff0c;十个站8个站都是阿里云....最近遇到几个站都是阿里云的服务器&#xff0c;比如&#xff1a;泛微e-col…

坚实原则:依赖倒置原则

到目前为止&#xff0c;我们只研究了单一职责 &#xff0c; 打开/关闭 &#xff0c; liskov替换和接口隔离原则。 依赖倒置是我们要研究的最后一个原理之一。 该原则指出 答&#xff1a;高级模块不应依赖于低级模块。 两者都应依赖抽象。 B.抽象不应依赖细节。 细节应取决于…

python处理中文字符串_python字符串中的中文处理

LeetCode 374&period; Guess Number Higher or LowerWe are playing the Guess Game. The game is as follows: I pick a number from 1 to n. You have to gues ...【HDU】1693 Eat the Treeshttp://acm.hdu.edu.cn/showproblem.php?pid1693 题意:nm的棋盘求简单回路(可以…

java创建类的三个步骤_3个简单步骤即可测试Java 8

java创建类的三个步骤即将发布的Java 8版本为Java开发人员带来了许多新功能&#xff0c;但是升级时始终存在代码破裂的风险。 我们都记得Java 7出厂时有一系列非常严重的错误 。 当然&#xff0c;我们所有人都可以帮助避免在Java 8中出现相同的问题。我今天要介绍的方法是使用…

mybatis嵌套查询和嵌套结果有什么区别_Java面试专题之九:Mybatis面试5个大概率被问到的问题...

1、为什么说 Mybatis 是半自动 ORM 映射工具&#xff1f;它与全自动的区别在哪里&#xff1f;Hibernate 属于全自动 ORM 映射工具&#xff0c;使用 Hibernate 查询关联对象或者关联集合对象时&#xff0c;可以根据对象关系模型直接获取&#xff0c;所以它是全自动的。而 Mybati…

使用Pargon-neo进行5G sync相关的测试

前言 Paragon-neo是Calnex旗下的一款测试仪器&#xff0c;主要用于5G的高精度场景下的PTP与SyncE的测试&#xff0c;它可以提供高达100GbE的测试速度&#xff0c;可以用在ITU-T G.8273.2 C/D类边界时钟测试&#xff0c;符合O-RAN的O-DU和O-RU设备&#xff0c;以及设计和部署5G…