Merhabalar, bu yazı RESTful (JAX-RS) web servisleri üzerine bir örnek olacaktır. İçerikten bahsetmek gerekirse projeyi oluşturma, veritabanını tasarlama, DAO katmanının yazılması, Rest Servislerin yazılmasını ve hatta hazırladığınız Rest Servise ait istemcinin nasıl yazılacağına kadar bir çok konuyu kapsayacaktır.
İÇİNDEKİLER
- Projenin Oluşturulması
- Veritabanının Oluşturulması
- Veritabanı modellerinin oluşturulması
- DAO Sınıfının Yazılması
- Web Servislerinin Yazılması
- Web Servis için İstemcinin yazılması
1. HAZIRLIK
Tüm proje Eclipse IDE altında geliştirilecektir. Ayrıca geliştirme sırasında sunucu olarak MySQL ve Tomcat v7.0 kullanılacaktır. RESTful Web servisleri için, JAX-RS uygulaması olarak Jersey kullanılacaktır. İsterseniz başka JAX-RS uygulamaları da kullanabilirsiniz. Projenin lifecycle’ı maven tarafından yönetilecektir. Bu sebepten M2E eklentisini kullanmanız tavsiye edilir.
Projede izleyeceğimiz senaryo, Restaurantlar için bir rezervasyon sistemi yazılacağını düşünelim . Arayüzü destekleyecek verilerin çekilmesinden, sistemi kullanacak firmaların kaydını yapmaktan ve sisteme kayıtlı firmalar için rezervasyon kaydı tutmaktan sorumlu Web Servisi yazma işi ve veritabanının tasarlanması bu projede bize verilmiş olsun.
1.1 Projeyi oluşturma
Eclipse üzerinden bir Dynamic Web Projesi create ediyoruz. Projeyi create ettikten sonra sağ click yaparak projeyi Maven projesine çeviriyoruz.
Eclipse altında yarattığımız proje de, pom.xml dosyanızı açın. Burada yapmamız gereken tüm projeler için ortak olacak bağımlılıkları, build komutlanırı, raporlama komutlarını girmek.
1.1.1 Bağımlılıklar
İlk önce proje genelinde kullanacağımız bağımlılıkları ekleyelim. Bu bağımlılıkları istediğimiz zaman gelip değiştirebiliriz. Bağımlılıkları eklemek için aşağıdakileri, dependencies tabının altına kopyalamaniz yeterlidir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.18</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-server</artifactId> <version>${jersey-version}</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-servlet</artifactId> <version>${jersey-version}</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-json</artifactId> <version>${jersey-version}</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-client</artifactId> <version>${jersey-version}</version> </dependency> </dependencies> |
1.2 Veritabanının Tasarlanması
Veritabanı iki farklı tablodan oluşacak. Bunlardan biri User tablosu. Örnek projemizdeki Rezervasyon yapacak müsterileri temsil edecek. Diğeri ise sisteme kayıtlı Restaurant Firmaları tablosu. Bir diğeri ise Rezervasyon bilgilerini tuttuğumuz Rezervasyon tablosu. Bunun için öncelikle veritabanı şemamızı oluşturuyoruz. Ben örnekte MySQL veritabanı kullanacağım. Siz istediğiniz veritabanını seçmekte özgürsünüz. Kullanacağımız şema companyrezdb olsun.
1.2.1 User tablosunun oluşturulması
1 2 3 4 5 6 7 |
CREATE TABLE `user` ( `userId` int(11) NOT NULL AUTO_INCREMENT, `userNumber` int(11) DEFAULT NULL, `userName` varchar(45) COLLATE utf8_bin DEFAULT NULL, `userSurname` varchar(45) COLLATE utf8_bin DEFAULT NULL, PRIMARY KEY (`userId`) ) ENGINE=InnoDB AUTO_INCREMENT=61 DEFAULT CHARSET=utf8 COLLATE=utf8_bin; |
1.2.2 Rezervasyon tablosunun oluşturulması
Rezervasyon tablosundaki her rezervasyon kaydı bir kullanıcıya ait olmalı. Bunun için Rezervasyon tablosu ile User tablosu arasında 1->N bir ilişki olmalıdır. Rezervasyon tablosunu bu özelliklerle aşağıdaki gibi oluşturuyoruz.
1 2 3 4 5 6 7 |
CREATE TABLE `rezervasyon` ( `id` int(11) DEFAULT NULL, `state` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, `companyId` int(11) DEFAULT NULL, `ekstraHizmet` varchar(45) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, KEY `companyId` (`companyId`), CONSTRAINT `companyId` FOREIGN KEY (`companyId`) REFERENCES `user` (`userid`) ON DELETE CASCADE ON UPDATE CASCADE |
1.2.3 Firma tablosunun oluşturulması
Sisteme rezervasyon yapılacak firmaları eklemek için oluşturuyoruz.
1 2 3 4 5 6 7 8 |
CREATE TABLE `company` ( `companyId` int(11) NOT NULL, `companyName` varchar(45) COLLATE utf8_bin DEFAULT NULL, `companyDistance` varchar(20) COLLATE utf8_bin DEFAULT NULL, `companyService` varchar(45) COLLATE utf8_bin DEFAULT NULL, `companyServiceTime` varchar(20) COLLATE utf8_bin DEFAULT NULL, PRIMARY KEY (`companyId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; |
2. Veritabanı Modellerinin Hazırlanması
2.1 Employee.java classının oluşturulması
Veritabanındaki User tablomuz için pojo sınıfımızı oluşturalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
package com.aysenur.model; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement (name ="employee") // <employee> tag'ları arasına xml elemenleri yerleştirilir. public class Employee { private int employeeiId; private int employeeNo; private String employeeName; private String employeeSurname; public Employee() { } public Employee(int employeeiId, int employeeNo, String employeeName, String employeeSurname) { this.employeeiId = employeeiId; this.employeeNo = employeeNo; this.employeeName = employeeName; this.employeeSurname = employeeSurname; } @XmlElement public int getEmployeeiId() { return employeeiId; } public void setEmployeeiId(int employeeiId) { this.employeeiId = employeeiId; } @XmlElement public int getEmployeeNo() { return employeeNo; } public void setEmployeeNo(int employeeNo) { this.employeeNo = employeeNo; } @XmlElement public String getEmployeeName() { return employeeName; } public void setEmployeeName(String employeeName) { this.employeeName = employeeName; } @XmlElement public String getEmployeeSurname() { return employeeSurname; } public void setEmployeeSurname(String employeeSurname) { this.employeeSurname = employeeSurname; } @Override public String toString() { return "Employee [employeeiId=" + employeeiId + ", employeeNo=" + employeeNo + ", employeeName=" + employeeName + ", employeeSurname=" + employeeSurname + "]"; } } |
2.1.2 Company.java classının oluşturulması
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
package com.aysenur.model; /** * @author Aysenur * */ public class Company { int companyId; String companyName; String companyDistance; String companyService; String companyServiceTime; public Company() {} public Company(int companyId, String companyName, String companyDistance, String companyService, String companyServiceTime) { super(); this.companyId = companyId; this.companyName = companyName; this.companyDistance = companyDistance; this.companyService = companyService; this.companyServiceTime = companyServiceTime; } public int getCompanyId() { return companyId; } public void setCompanyId(int companyId) { this.companyId = companyId; } public String getCompanyName() { return companyName; } public void setCompanyName(String companyName) { this.companyName = companyName; } public String getCompanyDistance() { return companyDistance; } public void setCompanyDistance(String companyDistance) { this.companyDistance = companyDistance; } public String getCompanyService() { return companyService; } public void setCompanyService(String companyService) { this.companyService = companyService; } public String getCompanyServiceTime() { return companyServiceTime; } public void setCompanyServiceTime(String companyServiceTime) { this.companyServiceTime = companyServiceTime; } } |
2.1.3 Rezervasyon modelinin oluşturulması
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
package com.aysenur.model; public class Rezervasyon { int id; int companyId; String state; String ekstservice; String note; public Rezervasyon() { } public Rezervasyon(int id, int companyId, String state, String ekstservice, String note) { this.id = id; this.companyId = companyId; this.state = state; this.ekstservice = ekstservice; this.note = note; } public int getId() { return id; } public void setId(int id) { this.id = id; } public int getCompanyId() { return companyId; } public void setCompanyId(int companyId) { this.companyId = companyId; } public String getState() { return state; } public void setState(String state) { this.state = state; } public String getEkstservice() { return ekstservice; } public void setEkstservice(String ekstservice) { this.ekstservice = ekstservice; } public String getNote() { return note; } public void setNote(String note) { this.note = note; } } |
3. DAO Sınıflarının oluşturulması
Öncelikle tüm DAO sınıflarında ortak olan, metodları belirleyeceğiz. Bu metodları bir interface sınıfına çıkartacağız. Ardından yine tüm DAO sınıflarında ortak olarak kullanılacak metodları uygulayacağız. Ardından her bir model için DAO sınıflarını oluşturacağız. Oluşturacağımız interface’te CRUD işlemleri olacak.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package com.aysenur.dao; import java.sql.Connection; import java.util.List; public interface IBaseDao<T> { public Connection connectionToDatabase(); public List<T> dataRead(); public T dataRead(int t); public boolean dataAdd(T t); public boolean dataEdit(T t, int a); public boolean dataDelete(int t); } |
3.1 Company modelimiz için CompanyDAO sınıfı :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
package com.aysenur.dao.impl; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; import com.aysenur.dao.IBaseDao; import com.aysenur.model.Company; public class CompanyDAOImpl implements IBaseDao<Company> { static Connection con = null; @Override public Connection connectionToDatabase() { try { Class.forName("com.mysql.jdbc.Driver"); con = DriverManager.getConnection("jdbc:mysql://localhost:3306/companyrezdb", "root", "sifreniz"); if (!con.isClosed()) { System.out.println("WITH JDBC TO MYSQL SUCCESSFUL."); } else { System.out.println("can not connected."); } } catch (Exception e) { System.out.println("Error: " + e); } finally { System.out.println("?"); } return con; } @Override public List<Company> dataRead() { connectionToDatabase(); List<Company> companys = new ArrayList<Company>(); Company company = null; try { PreparedStatement preparedStatement = con.prepareStatement("SELECT * FROM company"); ResultSet resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { // System.out.println(resultSet.getInt(1) + " "+ resultSet.getInt(2) + " " + // resultSet.getString(3) + " "+ resultSet.getString(4) ); company = new Company(resultSet.getInt(1), resultSet.getString(2), resultSet.getString(3), resultSet.getString(4),resultSet.getString(5)); companys.add(company); } } catch (Exception e) { System.out.println("HATA: " + e); } for (int i = 0; i < companys.size(); i++) { Object obj = companys.get(i).getCompanyId() + " " + companys.get(i).getCompanyName() + " " + companys.get(i).getCompanyService() + " " + companys.get(i).getCompanyDistance()+" "+companys.get(i).getCompanyServiceTime(); System.out.println(obj); } return companys; } @Override public Company dataRead(int firmaId) { connectionToDatabase(); Company company = null; try { String sorgu = "SELECT * FROM company WHERE cId=? company"; PreparedStatement preparedStatement = con.prepareStatement(sorgu); preparedStatement.setInt(1, firmaId); // 1 -> bir tane soru işareti vardemektir yani bu birinci // parametredir ve degeri employeeiId dir. ResultSet resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { company = new Company(resultSet.getInt(1), resultSet.getString(2), resultSet.getString(3), resultSet.getString(4),resultSet.getString(5)); } } catch (Exception e) { System.out.println("HATA: " + e); } System.out.println(company); return company; } @Override public boolean dataAdd(Company employe) { // TODO Auto-generated method stub return false; } @Override public boolean dataEdit(Company company, int companyId) { // TODO Auto-generated method stub return false; } @Override public boolean dataDelete(int employeeId) { // TODO Auto-generated method stub return false; } public static void main(String[] args) { CompanyDAOImpl nesne = new CompanyDAOImpl(); nesne.dataRead(); } } |
3.2 Employee modelimiz için EmployeeDAO sınıfı :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 |
package com.aysenur.dao.impl; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; import com.aysenur.dao.IBaseDao; import com.aysenur.model.Employee; /** * @author Aysenur * */ public class EmployeeDAOImpl implements IBaseDao<Employee>{ static Connection con = null; @Override public Connection connectionToDatabase() { try { Class.forName("com.mysql.jdbc.Driver"); con = DriverManager.getConnection("jdbc:mysql://localhost:3306/companyrezdb", "root", "sifreniz"); if (!con.isClosed()) { System.out.println("WITH JDBC TO MYSQL SUCCESSFUL."); } else { System.out.println("can not connected."); } } catch (Exception e) { System.out.println("Error: " + e); } finally { System.out.println("?"); } return con; } @Override public List<Employee> dataRead() { connectionToDatabase(); List<Employee> employees = new ArrayList<Employee>(); Employee employee = null; try { PreparedStatement preparedStatement = con.prepareStatement("SELECT * FROM User"); ResultSet resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { // System.out.println(resultSet.getInt(1) + " "+ resultSet.getInt(2) + " " + // resultSet.getString(3) + " "+ resultSet.getString(4) ); employee = new Employee(resultSet.getInt(1), resultSet.getInt(2), resultSet.getString(3), resultSet.getString(4)); employees.add(employee); } } catch (Exception e) { System.out.println("HATA: " + e); } for (int i = 0; i < employees.size(); i++) { Object obj = employees.get(i).getEmployeeiId() + " " + employees.get(i).getEmployeeNo() + " " + employees.get(i).getEmployeeName() + " " + employees.get(i).getEmployeeSurname(); System.out.println(obj); } return employees; } @Override public Employee dataRead(int employeeId) { // TODO Auto-generated method stub connectionToDatabase(); Employee employee = null; try { String sorgu = "SELECT * FROM user WHERE useriId=?"; PreparedStatement preparedStatement = con.prepareStatement(sorgu); preparedStatement.setInt(1, employeeId); // 1 -> bir tane soru iþaresi var demektir yani bu birinci // parametredir ve degeri employeeiId dir. ResultSet resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { employee = new Employee(resultSet.getInt(1), resultSet.getInt(2), resultSet.getString(3), resultSet.getString(4)); } } catch (Exception e) { System.out.println("HATA: " + e); } System.out.println(employee); return employee; } @Override public boolean dataAdd(Employee employee) { // TODO Auto-generated method stub connectionToDatabase(); boolean postState = false; String result = ""; try { String query = "INSERT INTO user (userNo,userName,userSurname) VALUES (?, ?, ?)"; PreparedStatement preparedStatement = con.prepareStatement(query); preparedStatement.setInt(1, employee.getEmployeeNo()); preparedStatement.setString(2, employee.getEmployeeName()); preparedStatement.setString(3, employee.getEmployeeSurname()); postState = preparedStatement.execute(); if (postState == false) result = "ADD SUCCESSFUL"; else result = "ADD UNSUCCESSFUL"; } catch (Exception e) { // TODO: handle exception System.out.println("Error: " + e); } System.out.println(result); return postState; } @Override public boolean dataEdit(Employee employee, int employeeId) { // TODO Auto-generated method stub connectionToDatabase(); boolean editState=false; String infoResult=""; try { String query="UPDATE user" + " SET userNo = ?, " + " userName = ?, " + " userSurname = ? " + " WHERE userId = ?"; PreparedStatement preparedStatement = con.prepareStatement(query); preparedStatement.setInt(1, employee.getEmployeeNo()); preparedStatement.setString(2, employee.getEmployeeName()); preparedStatement.setString(3, employee.getEmployeeSurname()); preparedStatement.setInt(4,employeeId); int queryResult = preparedStatement.executeUpdate(); if (queryResult==1) { infoResult="EDIT SUCCESSFUL"; editState=true; }else { infoResult="EDIT UNSUCCESS"; editState=false; } } catch (Exception e) { // TODO: handle exception System.out.println("ERROR: "+e); } System.out.println(infoResult); return editState; } @Override public boolean dataDelete(int employeeId) { // TODO Auto-generated method stub connectionToDatabase(); boolean deleteState = false; String result = ""; try { String query = "DELETE FROM user WHERE userId=?"; PreparedStatement preparedStatement = con.prepareStatement(query); preparedStatement.setInt(1, employeeId); deleteState = preparedStatement.execute(); if (deleteState == false) result = "DELETE SUCCESSFUL"; else result = "DELETE UNSUCCESSFUL"; } catch (Exception e) { // TODO: handle exception System.out.println("Error: " + e); } System.out.println(result); return deleteState; } |
3.3 Rezervasyon modelimiz için RezervasyonDAO sınıfı :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
package com.aysenur.dao.impl; import com.aysenur.model.Rezervasyon; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.util.List; import com.aysenur.dao.IBaseDao; public class RezervasyonDAOImpl implements IBaseDao<Rezervasyon> { static Connection con = null; @Override public Connection connectionToDatabase() { try { Class.forName("com.mysql.jdbc.Driver"); con = DriverManager.getConnection("jdbc:mysql://localhost:3306/companyrezdb", "root", "sifreniz"); if (!con.isClosed()) { System.out.println("WITH JDBC TO MYSQL SUCCESSFUL."); } else { System.out.println("can not connected."); } } catch (Exception e) { System.out.println("Error: " + e); } finally { System.out.println("?"); } return con; } @Override public List<Rezervasyon> dataRead() { // TODO Auto-generated method stub return null; } @Override public Rezervasyon dataRead(int rezId) { // TODO Auto-generated method stub return null; } @Override public boolean dataAdd(Rezervasyon rez) { connectionToDatabase(); boolean postState = false; String result = ""; try { String query = "INSERT INTO rez_registers (state,ekstraHizmet) VALUES (?, ?)"; PreparedStatement preparedStatement = con.prepareStatement(query); preparedStatement.setString(1, rez.getState()); preparedStatement.setString(2, rez.getEkstservice()); postState = preparedStatement.execute(); if (postState == false) result = "ADD SUCCESSFUL"; else result = "ADD UNSUCCESSFUL"; } catch (Exception e) { // TODO: handle exception System.out.println("Error: " + e); } System.out.println(result); return postState; } @Override public boolean dataEdit(Rezervasyon rez, int rezId) { // TODO Auto-generated method stub return false; } @Override public boolean dataDelete(int rezId) { // TODO Auto-generated method stub return false; } } |
Şu anda en temel veritabanı işlemlerini yapabilecek şekilde sınıflarımızı hazırladık.
4.Servislerin Hazırlanması
Şimdi artık servisimizi tam manasıyla hazırlayabiliriz. Metodlarımızı belirledik, DAO sınıfılarımızı ve modellerimizi hazırladık, bağımlılıklarımız da tamam.
4.1 Employee Service :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
package com.aysenur.ws; import java.util.List; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import com.aysenur.dao.impl.EmployeeDAOImpl; import com.aysenur.model.Employee; @Path("/employee") public class EmployeeService { // http://localhost:9999/_RESTful_JDBC_CRUD/rest/employee @GET @Path("/all") // @Produces ("application/xml, application/json ; charset=utf-8") @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON + ";charset=utf-8" }) public List<Employee> getEmployee() { EmployeeDAOImpl nesne = new EmployeeDAOImpl(); return nesne.dataRead(); } // http://localhost:9999/_RESTful_JDBC_CRUD/rest/employee/3 @GET @Path("/{employeeId}") @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON + ";charset=utf-8" }) public Employee getEmployeeById(@PathParam("employeeId") int employeeId) { EmployeeDAOImpl nesne = new EmployeeDAOImpl(); return nesne.dataRead(employeeId); } // http://localhost:9999/_RESTful_JDBC_CRUD/rest/employee @POST @Path("/") @Consumes({ MediaType.APPLICATION_JSON + ";charset=utf-8" }) public Response postEmployee(Employee employee) { EmployeeDAOImpl nesne = new EmployeeDAOImpl(); boolean postState = nesne.dataAdd(employee); if (postState == false) return Response.status(201).build(); // added else return Response.status(204).build(); } // http://localhost:9999/_RESTful_JDBC_CRUD/rest/employee/4 @PUT @Path("/{employeeId}") @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON + ";charset=utf-8" }) @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON + ";charset=utf-8" }) public Employee employeeEdit(@PathParam("employeeId") int employeeId, Employee employee) { EmployeeDAOImpl nesne = new EmployeeDAOImpl(); boolean editState = nesne.dataEdit(employee, employeeId); if (editState == true) return employee; else return null; } // http://localhost:9999/_RESTful_JDBC_CRUD/rest/employee/Id=3 @DELETE @Path("/{employeeId}") public Response employeeDelete(@PathParam("employeeId") int employeeId) { EmployeeDAOImpl nesne = new EmployeeDAOImpl(); boolean deleteState = nesne.dataDelete(employeeId); if (deleteState == false) return Response.status(200).build(); else return Response.status(204).build(); } } |
4.2 Company Service :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
package com.aysenur.ws; import java.util.List; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import com.aysenur.dao.impl.CompanyDAOImpl; import com.aysenur.model.Company; @Path("/company") public class CompanyService { @GET @Path("/all") //@Produces ("application/xml, application/json ; charset=utf-8") @Produces ({MediaType.APPLICATION_JSON + ";charset=utf-8"}) public List<Company> getCompany() { CompanyDAOImpl nesne = new CompanyDAOImpl(); return nesne.dataRead(); } } |
4.3 Rezervasyon Service :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
package com.aysenur.ws; import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import com.aysenur.dao.impl.RezervasyonDAOImpl; import com.aysenur.model.Rezervasyon; @Path("/rez") public class RezervasyonService { @POST @Path("/register") @Consumes({MediaType.APPLICATION_JSON + ";charset=utf-8" }) public Response postRez(Rezervasyon rez) { RezervasyonDAOImpl nesne = new RezervasyonDAOImpl(); boolean postState = nesne.dataAdd(rez); if (postState == false) return Response.status(201).build(); // added else return Response.status(204).build(); } } |
Evet servisimizi de yukarıdaki gibi yazdık. Biraz da neyin ne olduğunu incelemeye başlayalım. POST, DELETE, EDIT ve GET metodlarını kullandık. Kullanıcı silme işlemleri için DELETE tipinde HTTP Request’ler bekleniyor aynı şekilde Kullanıcı bilgilerini düzenlemek için EDIT sisteme Kullanıcı ve Firma eklemek için POST kullandık. Veri tabanında ki verilere erişmek istediğimiz de GET kullandık. GET metodlarınızı tarayıcınız üzerinden deneyebilirsiniz. Örnek bir kaç adresi aşağıda veriyorum.
Sisteme kayıtlı tüm kullanıcıları görmek için :
http://localhost:9999/_RESTful_JDBC_CRUD/rest/employee/all
Sisteme kayıtlı tüm Firmaları görmek için :
http://localhost:9999/_RESTful_JDBC_CRUD/rest/company/all
Sisteme kayıtlı varsa 12 numaralı kullanıcıyı görmek için :
http://localhost:9999/_RESTful_JDBC_CRUD/rest/employee/12
Evet, artık web servisimizi de tamamladık. Burdan sonra bu geliştirdiğimiz web servisimize özel istemcileri nasıl yazacağımız kaldı.
Takip edemeyenler ve projenin son halini merak edenler için projenin git deposu aşağıdaki gibidir.
Projeleri yaratırken sorun yaşadıysanız, proje yapısına Git Repo’sundan bakabilirsiniz.
- git repo :
https://github.com/AysenurGokdemir/JAX-RS-RESTful-WEB-SERVICE
Great content! Super high-quality! Keep it up! 🙂
thank you so much 🙂
Hey there! This post couldn’t be written any better!
Reading through this post reminds me of my good old room mate!
He always kept chatting about this. I will forward this post to him.
Fairly certain he will have a good read. Thank you for sharing!
I am very glad you think about them. Thanks for your comment.