็Hand-on Exercise: Java Web Services using Eclipse + Tomcat & NetBeans + GlassFish
-
Upload
imc-institute -
Category
Technology
-
view
2.338 -
download
8
description
Transcript of ็Hand-on Exercise: Java Web Services using Eclipse + Tomcat & NetBeans + GlassFish
1
Hand-onExercises
Java Web Services
Using Eclipse, Tomcat, NetBeans IDE and GlassFish Server
Assoc.Prof.Dr. Thanachart Numnondaand
Assist.Prof.Dr. Thanisa Kruawaisayawan
April 2014
Web Services Exercises www.imcinstitute.com IMC Institute
Java Web Services Exercises Thanachart and Thanisa Numnonda
3
Exercise 1: Calling Existing Web Services
แบบฝกหดในบทนเปนการพฒนาโปรแกรมเพอเรยกใช Web Services ทมอยแลว ซงจะเลอกมา 3 บรการดงน
การทดลองท 1 อตราแลกเปลยนเงนตราระหวางประเทศการทดลองท 2 ราคานำมนลาสดของ ปตท.
โดยจะใช soapUI และ Eclipse
การทดลองท 1
การทดสอบ Web Services โดยใช soapUIโปรแกรม soapUI เปนโปรแกรม Open Source ทสามารถใชเปนเครองมอในการทดสอบเวบเซอรวส
ซงเปนทนยมใชกนอยางกวางขวาง เราสามารถทจะไปดาวนโหลดโปรแกรมนไดท www.soapui.org โดยเมอตดตงแลว ใหทำการทดสอบเรยกใชเวบเซอรวส ตามขนตอนดงน
1. ในโปรแกรม soapUI เลอกเมน File > New soapUI Project2. ในชอง Initial WSDL ใหใส http://www.webservicex.com/CurrencyConvertor.asmx?wsdl ดงแสดง
ในรปท 1
รปท 1 แสดงการสราง soapUI Project ใน soapUI
Web Services Exercises www.imcinstitute.com IMC Institute
3. จากนนกดปม OK โปรแกรมจะทำการสรางโปรเจคนขนมา 4. ขยายโหนด ConversionRate ของ CurrencyConvertorSoap แลวดบเบลคลกท Request1 5. ในหนาตาง Editor จะแสดงคาของ SOAP Request ทจะสงไป ใหใสคาดงน
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://www.webserviceX.NET/">
<soapenv:Header/> <soapenv:Body> <web:ConversionRate> <web:FromCurrency>USD</web:FromCurrency> <web:ToCurrency>THB</web:ToCurrency> </web:ConversionRate> </soapenv:Body></soapenv:Envelope>
6. กดปม Submit request (เครองหมายสเขยว) ทอยทางซายบน โปรแกรมจะได SOAP Response กลบมาดงแสดงตวอยางไดดงน
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body> <ConversionRateResponse xmlns="http://www.webserviceX.NET/"> <ConversionRateResult>31.403/ConversionRateResult> </ConversionRateResponse> </soap:Body></soap:Envelope>
การทดลองท 2
การพฒนา Java Client เพอเรยกดราคานำมน
แบบฝกหดนจะสราง Client ขนเพอใชในการเรยก Web Services โดยมขนตอนดงน
1. สราง Dynamic Web Project ชอ ExternalWSDemo โดยเลอกเมน File > New > Other.. แลวเลอก Web > Dynamic Web Project
Java Web Services Exercises Thanachart and Thanisa Numnonda
5
2. คลกขวาท ExternalWSDemo เลอก New → Other → Web Services → Web Service Client
3. ใสคา Service definition เปน http://www.pttplc.com/webservice/pttinfo.asmx?WSDL
4. เลอกชอง Monitor the Web service แลวกดปม Finish
Web Services Exercises www.imcinstitute.com IMC Institute
รปท 1 ขอบรการจาก Web Service ทระบ
โปรแกรมจะสรางไฟลทเกยวของกบ Web Services ดงรป
5. ทำการสราง Servlet เพอแสดงผล สงทไดรบมาจาก Web Services โดยคลกขวาทโหนด ExternalWSDemo แลวเลอกคำสง New > Servlet โดยกำหนดคา Package = controller
Class Name = OilPriceInfoServlet
Java Web Services Exercises Thanachart and Thanisa Numnonda
7
6. พฒนา source code ดง Listing ท 17. ทำการรนโปรแกรม จะไดตวอยางผลลพธแสดงราคานำมนลาสด ดงแสดงในรปท 2
Listing ท 1 โปรแกรม OilPriceInfoServlet.java
@WebServlet("/OilPriceInfoServlet")public class OilPriceInfoServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();
PTTInfoSoapProxy obj = new PTTInfoSoapProxy();out.print(obj.currentOilPrice("TH"));
}
}
รปท 2 แสดงผลลพธทไดจากการเรยกใช Web Service Operation: CurrentOilPrice ของปตท.
Web Services Exercises www.imcinstitute.com IMC Institute
Exercise 2: Web Services Provider
แบบฝกหดนเปนการพฒนาโปรแกรม Web Services สำหรบ Java EE โดยใชชดคำสง JAX-WS ซงจะเปนการพฒนา Web Services Provider บน Java EE Server ทงนชดคำสง JAX-WS จะชวยทำใหการสรางและเรยกใช Web Services ดวยภาษา Java เปนไปไดงายขน
การพฒนา Web Services จะแบงไดเปนสองสวนคอ Web Service Requester (Client) และ Web Service Provider (Server) ซงการพฒนา Web Service Provider สามารถทำได 2 วธคอ
1. Web Services ทรนบน Web Server โดยใช Java Servlet2. Web Services ทรนบน Application Server โดยใช Session Bean
แบบฝกหดนจะแสดงขนตอนการใช Eclipse สราง Web Service ทชอ calculateTax โดยใช Servlet ซงจะรนอยบน Apache Tomcat เพอแสดง Web Services การสง SOAP message และ WSDL ของ Services
การตดตง Apache Tomcat ใหสนบสนน JAX-WS
เราตองตดตงไฟลประเภท jar ของ JAX-WS เพอทำให Tomcat สนบสนน JAX-WS โดยเราตอง download ไฟล Library ท http://jax-ws.java.net/ แลวทำการ unzip และ copy ไฟลประเภท jar ไวท โฟรเดอร TOMCAT_HOME/lib แลวทำการ Restart Tomcat อกครง ในกรณทเราไมตองการ copy ทกไฟล เราสามารถเลอกทจะ copy ไฟลทจำเปนเหลาน
•gmbal-api-only.jar
•jaxb-impl.jar
•jaxws-api.jar
•jaxws-rt.jar
•management-api.jar
•policy.jar
•stax-ex.jar
•streambuffer.jar
การพฒนา calculateTax Web Service
แบบฝกหดนจะสราง Dynamic Web Project ขนใหม เพอใชในการเกบ Web Service โดยมขนตอนการพฒนาดงน
Java Web Services Exercises Thanachart and Thanisa Numnonda
9
1. เลอกเมน File > New > Project > Web > Dynamic Web Project2. กำหนด Project Name เปน TaxWSDemo แลวเลอก Target Runtime เปน Apache Tomcat 7
กำหนด Dynamic Web Module Version เปน 3.0 แลวกด Finish
การพฒนาโปรแกรม Service Endpoint
ในการพฒนาโปรแกรม Web Service เราตองเขยนโปรแกรทขนมาสองโปรแกรมคอ Interface และ Class ทมเวบเซอรวสเมธอดอย
1. การพฒนา Interface ทำไดโดยคลกขวาทแทป TaxWSDemo แลวเลอกคำสง New > Interface2. กำหนดคา package เปน com.taxws และ name เปน TaxServiceInterface3. ปรบปรงโปรแกรม TaxServiceInterface ดงน
package com.taxws;
import javax.jws.WebMethod;import javax.jws.WebParam;import javax.jws.WebService;
@WebServicepublic interface TaxServiceInterface {
@WebMethod public double calculateTax(@WebParam(name = "income") double income) ;
}
4. ทำการพฒนาโปรแกรม TaxService โดยคลกขวาทแทป TaxWSDemo แลวเลอกคำสง New > Class5. กำหนดคา package เปน com.taxws และ name เปน TaxService6. ปรบปรงโปรแกรม TaxService ดงน
package com.taxws;
import javax.jws.WebMethod;import javax.jws.WebParam;import javax.jws.WebService;
@WebService(endpointInterface = "com.ws.TaxWS")public class TaxService { @WebMethod public double calculateTax(@WebParam(name = "income") double income) { if (income < 70000) { return 0; } else if (income < 100000) { return (income - 70000) * 0.05; } else if (income < 500000) { return (income - 100000) * 0.1 + 3500; } else {
Web Services Exercises www.imcinstitute.com IMC Institute
return (income - 500000) * 0.2 + 43500; } } }
7. คลกขวาทโหนด TaxWSDemo จากนนเลอกคำสง Clean and Build จากนนคลกขวาทโหนด TaxWSDemo อกครง แลวเลอก Deploy
การพฒนาไฟล configuration
เราตองสรางไฟล configuration ขนมาสองไฟลเพอระบตำแหนงของ Servlet และ Web Services Endpointคอ web.xml และ sun-jaxws.xml โดยมขนตอนดงน
1. โดยคลกขวาทโหนด content/WEB-INF เลอกคำสง New > Other > XML > XML File แลวกด Next2. กำหนด File Name เปน web.xml แลวกด Finish3. ปรบปรงโปรแกรม web.xml ดงน
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems,Inc.//DTD Web Application 2.3//EN""http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">
<web-app>
<listener> <listener-class> com.sun.xml.ws.transport.http.servlet.WSServletContextListener </listener-class> </listener>
<servlet> <servlet-name>taxws</servlet-name> <servlet-class> com.sun.xml.ws.transport.http.servlet.WSServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet>
<servlet-mapping> <servlet-name>taxws</servlet-name> <url-pattern>/taxws</url-pattern> </servlet-mapping>
<session-config>
Java Web Services Exercises Thanachart and Thanisa Numnonda
11
<session-timeout>30</session-timeout> </session-config>
</web-app>
4. สรางไฟล sun-jaxws.xml ไวท content/WEB-INF โดยมโปรแกรมดงน
<?xml version="1.0" encoding="UTF-8"?> <endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0"> <endpoint name="WebServiceImpl"
implementation="com.taxws.TaxService"
url-pattern="/taxws" /> </endpoints>
การทดสอบ Web Service
1. คลกขวาทโหนด TaxWSDemo จากนนเลอกคำสง Run As > Run on Server2. กำหนด url นบน Web Browser >> http://localhost:8080/TaxWSDemo/taxws จะแสดงผลลพธดงน
3. ทดสอบการเรยก TaxService จาก soap UI โดย เลอกเมน File > New soapUI Project4. กำหนดคา Project Name เปน TaxWSClient และ Initial WSDL
เปน http://localhost:8080/TaxWSDemo/taxws?wsdl แลวกดปม OK5. ในหนาตาง Projects ขยายโหนด TaxWSClient >> TaxServicePortBinding >> calculateTax6. ดบเปลคลก Request1 โปรแกรมจะแสดง SOAP Request ออกมา ใหกำหนดคาใน tax <income>
เปน 73000
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tax="http://taxws.com/"> <soapenv:Header/> <soapenv:Body> <tax:calculateTax> <income>73000</income> </tax:calculateTax>
Web Services Exercises www.imcinstitute.com IMC Institute
</soapenv:Body></soapenv:Envelope>
7. กดปม Submit request (เครองหมายสเขยว) ทอยทางซายบน โปรแกรมจะได SOAP Response กลบมาดงน
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> <ns2:calculateTaxResponse xmlns:ns2="http://taxws.com/"> <return>150.0</return> </ns2:calculateTaxResponse> </S:Body></S:Envelope>
การพฒนาโปรแกรม Web Service Client
ขนตอนนจะเปนการพฒนาโปรแกรม Web Service Client เพอเรยกใช TaxServices โดยใช wsimport ซงมขนตอนดงน
1. สราง Java Project ทชอ TaxWSClient2. ใชโปรแกรม wsimport ในการสรางโปรแกรม Java อตโนมตจากไฟล wsdl โดยการเปด terminal
แลวเปลยนไดเรกทอรไปท source code ของโปรเจค TaxWsClient และเรยกใช wsimport จากคำสงดงน
cd %project_home%/src wsimport -s . -target 2.0 http://localhost:8080//TaxWSDemo/taxws?wsdl
3. โปรแกรมจะสรางไฟลตางๆดงรป
Java Web Services Exercises Thanachart and Thanisa Numnonda
13
4. สราง Class โดยกำหนด package เปน com.taxws.client และ Name เปน TaxWSClient โดยม source code ดง Listing ท 2
5. ทำการรนโปรแกรมจะไดผลลพธเปน Tax amount = 150.0
Listing ท 2 โปรแกรม TaxWSClientManual
package com.taxws.client;
import com.taxws.TaxService;import com.taxws.TaxServiceService;
public class TaxWSClient {
public static void main(String[] args) {TaxServiceService obj = new TaxServiceService();TaxService taxService = obj.getTaxServicePort();double tax = taxService.calculateTax(73000);System.out.println("Tax amount = "+ tax);
}
}
Web Services Exercises www.imcinstitute.com IMC Institute
Exercise 3: Web Service Authentication
แบบฝกหดนจะเปนการปรบปรงโปรแกรม Tax Service เพอเรยกใหมการทำ authentication กอนทจะมการคำนวณภาษ ทงนไดกำหนดใหผใชตองใส username เปน root และ password เปน password จงจะคำนวณคาภาษมาให หาก username หรอ password ไมถกตองจะใหคากลบมาเปน -999
การปรบปรงโปรแกรม TaxService.java
ขนตอนนใหปรบปรงโปรแกรม TaxService.java ดง Listing ท 3
Listing ท 3 โปรแกรม TaxService
package com.taxws;
import java.util.List;import java.util.Map;
import javax.annotation.Resource;import javax.jws.WebMethod;import javax.jws.WebParam;import javax.jws.WebService;import javax.xml.ws.WebServiceContext;import javax.xml.ws.handler.MessageContext;
@WebService(endpointInterface = "com.ws.TaxWS")public class TaxService {
@ResourceWebServiceContext wsctx;
@WebMethodpublic double calculateTax(@WebParam(name = "income") double income) {
MessageContext mctx = wsctx.getMessageContext();
// get detail from request headersMap http_headers = (Map)
mctx.get(MessageContext.HTTP_REQUEST_HEADERS);List userList = (List) http_headers.get("Username");List passList = (List) http_headers.get("Password");
String username = "";String password = "";
if (userList != null) {// get usernameusername = userList.get(0).toString();
}
if (passList != null) {// get passwordpassword = passList.get(0).toString();
Java Web Services Exercises Thanachart and Thanisa Numnonda
15
}
// Should validate username and password with databaseif (username.equals("root") && password.equals("password")) {
if (income < 70000) {return 0;
} else if (income < 100000) {return (income - 70000) * 0.05;
} else if (income < 500000) {return (income - 100000) * 0.1 + 3500;
} else {return (income - 500000) * 0.2 + 43500;
}} else {
return -999;}
}
}
การปรบปรงโปรแกรม TaxWSClient.java
ขนตอนนใหปรบปรงโปรแกรม TaxWSClient.java ดง Listing ท 4
Listing ท 4 โปรแกรม TaxWSClient
package com.taxws.client;
import java.util.Map;import java.util.Collections;import java.util.HashMap;import java.util.List;import javax.xml.ws.BindingProvider;import javax.xml.ws.handler.MessageContext;
import com.taxws.TaxService;import com.taxws.TaxServiceService;
public class TaxWSClient {
public static void main(String[] args) {TaxServiceService obj = new TaxServiceService();TaxService taxService = obj.getTaxServicePort();Map<String, Object> req_ctx = ((BindingProvider) taxService)
.getRequestContext();Map<String, List<String>> headers = new HashMap<String,
List<String>>();headers.put("Username", Collections.singletonList("root"));headers.put("Password", Collections.singletonList("password"));req_ctx.put(MessageContext.HTTP_REQUEST_HEADERS, headers);double tax = taxService.calculateTax(73000);System.out.println("Tax amount = " + tax);
}
}
Web Services Exercises www.imcinstitute.com IMC Institute
การทดสอบโปรแกรม
ทำการทดสอบโปรแกรม ตามขนตอนดงน
1. ทำการรนโปรเจค TaxWSDemo ใหมโดยใชคำสง Run As > Run On Server2. ทำการรนโปรแกรม TaxWSClient.java จะเหนวาไดผลลพธอยางถกตอง3. ทดลองเปลยนคา username หรอ password ในโปรแกรม TaxWSClient.java แลวทดลองรน
โปรแกรมใหม จะเหนวาผลลพธเปลยนไป
Java Web Services Exercises Thanachart and Thanisa Numnonda
17
Exercise 4: Axis2 Web Services
แบบฝกหดนเปนการตดตง Axis2 Web Services บน Tomcat Web Server แลวทดลองพฒนา Web Service โดยใชโปรแกรม Eclipse
การตดตง Axis2 เพอใหใชกบโปรแกรม
ขนตอนนเปนการตดตง Axis2 เพอใหทำงานบน Tomcat ได โดยตองทำการ config โปรแกรม Ec-lipse ดงน
1. ทำการดาวนโฟล axis2-1.x.x.zip จาก http://axis.apache.org/axis2/java/core/download.cgi และทำการ unzip
2. เลอกคำสง Preferences.. ของโปรแกรม Eclipse3. ในไดอะลอก Prefernces เลอก Web Services > Axis2 Preferences และกำหนดตำแหนงของ Axis2
runtime location ใหตรงกบไดเรกทอรททำการ unzip ไฟล axis2-1.x.x.zip ดงรป
Web Services Exercises www.imcinstitute.com IMC Institute
การพฒนาโปรแกรม Axis2 Web Services
ขนตอนนจะเปนการพฒนา Dynamic Web Project ใหเปน Axis2 Web Services สำหรบการคำนวณภาษโดยมขนตอนดงน
1. เลอกเมน File > New > Project > Web > Dynamic Web Project2. กำหนด Project Name เปน TaxAxisWS แลวเลอก Target Runtime เปน Apache Tomcat 7
กำหนด Dynamic Web Module Version เปน 2.5 แลวกด Finish (หมายเหต กรณของ Axis เราจะตองเลอก Web Module เวอรชน 2.x เทานน)
3. คลกขวาทโหนด TaxAxisWS แลวเลอกคำสง Properties4. ในไดอะลอก Properties for TaxAxisWS ใหเลอก Project Facets แลวเลอกชอง Axis2 Web
Services แลวกด Apply ดงรป
5. ทำการพฒนาโปรแกรม TaxService โดยคลกขวาทแทป TaxWSDemo แลวเลอกคำสง New > Class6. กำหนดคา package เปน com.taxws และ name เปน TaxService7. ปรบปรงโปรแกรม TaxService ดงน
Java Web Services Exercises Thanachart and Thanisa Numnonda
19
package com.taxws;
public class TaxService {public double calculateTax(double income) {
return 0.1 * income;}
}
8. กำหนดคลาส TaxService ใหเปน Web Services โดยการคลกขวาทโหนด TaxService แลวเลอกคำสง New > Other > Web Services > Web Service แลวกด Next
9. คลกท Web Service runtime: Apache Axis เมอปรากฎไดอะลอก Service Deployment Configuration ใหเลอก Apache Axis2 แลวกด OK
Web Services Exercises www.imcinstitute.com IMC Institute
10. กด Next แลวเลอกคาตามทตงไว
11. กด Next โปรแกรมจะทำการตดตง Web Service ลงบน Tomcat แลวกด Finish12. เราสามารถเรยกด Service ทตดตงไดโดยการปอน url ท web browser ดงน
Java Web Services Exercises Thanachart and Thanisa Numnonda
21
http://localhost:8080/TaxAxisWS/ เราจะเหนขอความดงรป
13. คลกท Services เราจะเหน TaxService ทม Opearation ดงน
14. เราสามารถทจะเรยกด WSDL ไดท http://localhost:8080/TaxAxisWS/services/TaxService?wsdl
Web Services Exercises www.imcinstitute.com IMC Institute
Exercise 5: RESTful Web Services
แบบฝกหดนเปนการพฒนาโปรแกรม RESTful Web Services โดยใช JAX-RS ทเปน Jersey
การพฒนา Hello Web Service
แบบฝกหดนจะสราง Dynamic Web Project ขนใหม เพอใชในการเกบ Web Service โดยมขนตอนการพฒนาดงน
1. เลอกเมน File > New > Project > Web > Dynamic Web Project2. กำหนด Project Name เปน RESTfulDemo แลวเลอก Target Runtime เปน Apache Tomcat 7
กำหนด Dynamic Web Module Version เปน 3.0 แลวกด Next3. ในหนา web module ใหเลอกชอง Generate web.xml deployment descriptor แลวกด Finish4. download ไฟล Jersey Library ท http://jersey.java.net/ แลวทำการ unzip และ copy ไฟลประเภท
jar ไวท โฟรเดอร WebContent->WEB-INF->lib โดยมไฟลทจำเปนดงน
• asm-3.1
• jersey-client-1.17
• jersey-core-1.17
• jersey-server-1.17
• jersey-servlet-1.17
• jsr311-api-1.1.1
เราจะเหนไฟลตางๆดงน
Java Web Services Exercises Thanachart and Thanisa Numnonda
23
5. เพม jar file เหลานลงใน Build Path โดยการคลกขวาทฌหนด RestfulDemo แลวเลอก Properties แลวเลอก Java Build Path กด Add JARs.. แลวเลอกไฟลตางๆดงรป แลวกด OK
6. ทำการพฒนาโปรแกรม Hello โดยคลกขวาทแทป RESTfulDemo แลวเลอกคำสง New > Class7. กำหนดคา package เปน com.rs และ name เปน Hello8. ปรบปรงโปรแกรม Hello ดงน
package com.rs;
import javax.ws.rs.GET;import javax.ws.rs.Path;import javax.ws.rs.Produces;import javax.ws.rs.core.MediaType;
@Path("/hello")public class Hello {
// This method is called if TEXT_PLAIN is request @GET @Produces(MediaType.TEXT_PLAIN) public String sayPlainTextHello() { return "Hello Jersey"; }
// This method is called if XML is request @GET @Produces(MediaType.TEXT_XML) public String sayXMLHello() {
Web Services Exercises www.imcinstitute.com IMC Institute
return "<?xml version=\"1.0\"?>" + "<hello> Hello Jersey" + "</hello>"; }
// This method is called if HTML is request @GET @Produces(MediaType.TEXT_HTML) public String sayHtmlHello() { return "<html> " + "<title>" + "Hello Jersey" + "</title>" + "<body><h1>" + "Hello Jersey" + "</body></h1>" + "</html> "; }}
9. ปรบปรงโปรแกรม 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>RESTfulDemo</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.rs</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>
10. ทำการรนโปรเจคโดยใชคำสง Run As > Run On Server11. เรยกด Service ทตดตงไดโดยการปอน url ท web browser เปน
http://localhost:8080/RESTfulDemo/rest/hello
การพฒนาโปรแกรม RESTful Web Service Client
ขนตอนนจะเปนการพฒนาโปรแกรม RESTful Web Service Client เพอเรยกใช Hello Service โดยมขนตอนดงน
Java Web Services Exercises Thanachart and Thanisa Numnonda
25
1. สราง Java Project ทชอ RESTfulClient2. ทำการกำหนดคา Project Build Path ตามขนตอนแบบเดยวกบการพฒนาโปรเจค RESTfulDemo3. สราง Java Class ทชอ ClientDemo และพฒนาโปรแกรมดงน
package com.client;
import java.net.URI;
import javax.ws.rs.core.MediaType;import javax.ws.rs.core.UriBuilder;
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 ClientDemo {public static void main(String[] args) {
ClientConfig config = new DefaultClientConfig();Client client = Client.create(config);WebResource service = client.resource(getBaseURI());// Fluent interfacesSystem.out.println(service.path("rest").path("hello")
.accept(MediaType.TEXT_PLAIN).get(ClientResponse.class)
.toString());// Get plain textSystem.out.println(service.path("rest").path("hello")
.accept(MediaType.TEXT_PLAIN).get(String.class));// Get XMLSystem.out.println(service.path("rest").path("hello")
.accept(MediaType.TEXT_XML).get(String.class));// The HTMLSystem.out.println(service.path("rest").path("hello")
.accept(MediaType.TEXT_HTML).get(String.class));
}
private static URI getBaseURI() {return UriBuilder.fromUri(
"http://localhost:8080/RESTfulDemo/").build();}
}
4. ทำการรนโปรแกรม ClientDemo จะไดผลลพธดงน
Web Services Exercises www.imcinstitute.com IMC Institute
Exercise 6: RESTful Web Services and JAXB
JAX-RS สนบสนนการสราง XML และ JSON ผาน JAXB แบบฝกหดนจะสาธตการพฒนา RESTful Web Services ในการสรางขอมลเกบลงใน Web Services
การพฒนา DataWSPrj
ทำการสราง Dynamic Web Project ขนใหม โดยมขนตอนการพฒนาดงน
1. เลอกเมน File > New > Project > Web > Dynamic Web Project2. กำหนด Project Name เปน DataWSPrj แลวเลอก Target Runtime เปน Apache Tomcat 7
กำหนด Dynamic Web Module Version เปน 3.0 แลวกด Next3. ทำการ copy ไฟล Jersey JARs และกำหนดคา Project Build Path4. ทำการพฒนาโปรแกรมตางดง source code ตาม Listing ท 5 - 75. ทำการรนโปรเจคโดยใชคำสง Run As > Run On Server6. เรยกด Service ทตดตงไดโดยการปอน url ท web browser เปน
http://localhost:8080/DataWSPrj/rest/todo
Listing ท 5 โปรแกรม Todo.java
package com.rest.model;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElementpublic class Todo {
private String summary;private String description;
public String getSummary() {return summary;
}
public void setSummary(String summary) {this.summary = summary;
}
public String getDescription() {return description;
}
public void setDescription(String description) {this.description = description;
}}
Java Web Services Exercises Thanachart and Thanisa Numnonda
27
Listing ท 6 โปรแกรม ToDoResource.java
package com.rest;
import javax.ws.rs.GET;import javax.ws.rs.Path;import javax.ws.rs.Produces;import javax.ws.rs.core.MediaType;
import com.rest.model.Todo;
@Path("/todo")public class ToDoResource {
// This method is called if XMLis request @GET @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) public Todo getXML() { Todo todo = new Todo(); todo.setSummary("This is my first todo"); todo.setDescription("This is my first todo"); return todo; } // This can be used to test the integration with the browser @GET @Produces({ MediaType.TEXT_XML }) public Todo getHTML() { Todo todo = new Todo(); todo.setSummary("This is my first todo"); todo.setDescription("This is my first todo"); return todo; }
}
Listing ท 7 โปรแกรม 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>DataWS</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.rest</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Jersey REST Service</servlet-name>
Web Services Exercises www.imcinstitute.com IMC Institute
<url-pattern>/rest/*</url-pattern> </servlet-mapping></web-app>
การพฒนา Web Service Client
ทำการสราง Java Project ขนใหมชอ DataWSClient กำหนด Java Bulid Path ใหมwa]N Jersey JARS และพฒนา Source code ดง Listing ท 8
Listing ท 8 โปรแกรม web.xml
package com.rest.client;
import java.net.URI;
import javax.ws.rs.core.MediaType;import javax.ws.rs.core.UriBuilder;import com.sun.jersey.api.client.Client;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 Test { public static void main(String[] args) { ClientConfig config = new DefaultClientConfig(); Client client = Client.create(config); WebResource service = client.resource(getBaseURI()); // Get XML System.out.println(service.path("rest").path("todo").accept(MediaType.TEXT_XML).get(String.class)); // Get XML for application
System.out.println(service.path("rest").path("todo").accept(MediaType.APPLICATION_XML).get(String.class)); }
private static URI getBaseURI() { return UriBuilder.fromUri("http://localhost:8080/DataWSPrj").build(); }
}
ทดลองรนโปรแกรมจะไดผลลพธดงน
Java Web Services Exercises Thanachart and Thanisa Numnonda
29
Exercise 7: CRUD RESTful webservice
แบบฝกหดนเปนการพฒนา RESTful Web Services ทสามารถจดการขอมลโดยใชโอเปอรเรชน CRUD (Create, Read, Update, Delete) โดยใหสราง Dynamic Web Project และพฒนาโปรแกรมทม source code ตางๆตาม Listing ท 9 - 14 และเราสามารถรนโปรแกรมไดโดยการเรยก url ตางๆดงน
• http://localhost:8080/CRUDRestWS/rest/todos• http://localhost:8080/CRUDRestWS/rest/todos/count• http://localhost:8080/CRUDRestWS/rest/todos/1
Listing ท 9 โปรแกรม Todo.java
package com.rest.model;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Todo {
private String id;
private String summary;
private String description;
public Todo(){
}
public Todo (String id, String summary){
this.id = id;
this.summary = summary;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getSummary() {
Web Services Exercises www.imcinstitute.com IMC Institute
return summary;
}
public void setSummary(String summary) {
this.summary = summary;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
Listing ท 10 โปรแกรม TodoDao.java
package com.rest.dao;
import java.util.HashMap;
import java.util.Map;
import com.rest.model.Todo;
public enum TodoDao {
instance;
private Map<String, Todo> contentProvider = new HashMap<String, Todo>();
private TodoDao() {
Todo todo = new Todo("1", "Learn REST");
todo.setDescription("Read http://www.imcinstitute.com/tutorials/REST/article.html");
contentProvider.put("1", todo);
todo = new Todo("2", "Do something");
todo.setDescription("Read complete http://www.imcinstitute.com");
contentProvider.put("2", todo);
}
public Map<String, Todo> getModel(){
return contentProvider;
}
Java Web Services Exercises Thanachart and Thanisa Numnonda
31
}
Listing ท 11 โปรแกรม TodoResource.java
package com.rest.resources;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import javax.xml.bind.JAXBElement;
import com.rest.dao.TodoDao;
import com.rest.model.Todo;
public class TodoResource {
@Context
UriInfo uriInfo;
@Context
Request request;
String id;
public TodoResource(UriInfo uriInfo, Request request, String id) {
this.uriInfo = uriInfo;
this.request = request;
this.id = id;
}
//Application integration
@GET
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Todo getTodo() {
Todo todo = TodoDao.instance.getModel().get(id);
Web Services Exercises www.imcinstitute.com IMC Institute
if(todo==null)
throw new RuntimeException("Get: Todo with " + id + " not found");
return todo;
}
// for the browser
@GET
@Produces(MediaType.TEXT_XML)
public Todo getTodoHTML() {
Todo todo = TodoDao.instance.getModel().get(id);
if(todo==null)
throw new RuntimeException("Get: Todo with " + id + " not found");
return todo;
}
@PUT
@Consumes(MediaType.APPLICATION_XML)
public Response putTodo(JAXBElement<Todo> todo) {
Todo c = todo.getValue();
return putAndGetResponse(c);
}
@DELETE
public void deleteTodo() {
Todo c = TodoDao.instance.getModel().remove(id);
if(c==null)
throw new RuntimeException("Delete: Todo with " + id + " not found");
}
private Response putAndGetResponse(Todo todo) {
Response res;
if(TodoDao.instance.getModel().containsKey(todo.getId())) {
res = Response.noContent().build();
} else {
res = Response.created(uriInfo.getAbsolutePath()).build();
}
TodoDao.instance.getModel().put(todo.getId(), todo);
return res;
}
}
Java Web Services Exercises Thanachart and Thanisa Numnonda
33
Listing ท 12 โปรแกรม Todo2Resource.java
package com.rest.resources;
import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import com.rest.dao.TodoDao;
import com.rest.model.Todo;
// Will map the resource to the URL todos
@Path("/todos")
public class TodosResource {
// Allows to insert contextual objects into the class,
// e.g. ServletContext, Request, Response, UriInfo
@Context
UriInfo uriInfo;
@Context
Request request;
Web Services Exercises www.imcinstitute.com IMC Institute
// Return the list of todos to the user in the browser
@GET
@Produces(MediaType.TEXT_XML)
public List<Todo> getTodosBrowser() {
List<Todo> todos = new ArrayList<Todo>();
todos.addAll(TodoDao.instance.getModel().values());
return todos;
}
// Return the list of todos for applications
@GET
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public List<Todo> getTodos() {
List<Todo> todos = new ArrayList<Todo>();
todos.addAll(TodoDao.instance.getModel().values());
return todos;
}
// retuns the number of todos
// use http://localhost:8080/de.vogella.jersey.todo/rest/todos/count
// to get the total number of records
@GET
@Path("count")
@Produces(MediaType.TEXT_PLAIN)
public String getCount() {
int count = TodoDao.instance.getModel().size();
return String.valueOf(count);
}
@POST
@Produces(MediaType.TEXT_HTML)
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public void newTodo(@FormParam("id") String id,
@FormParam("summary") String summary,
@FormParam("description") String description,
@Context HttpServletResponse servletResponse) throws IOException {
Todo todo = new Todo(id,summary);
if (description!=null){
todo.setDescription(description);
Java Web Services Exercises Thanachart and Thanisa Numnonda
35
}
TodoDao.instance.getModel().put(id, todo);
servletResponse.sendRedirect("../create_todo.html");
}
// Defines that the next path parameter after todos is
// treated as a parameter and passed to the TodoResources
// Allows to type http://localhost:8080/de.vogella.jersey.todo/rest/todos/1
// 1 will be treaded as parameter todo and passed to TodoResource
@Path("{todo}")
public TodoResource getTodo(@PathParam("todo") String id) {
return new TodoResource(uriInfo, request, id);
}
}
Listing ท 13 โปรแกรม create_todo.html
<!DOCTYPE html>
<html>
<head>
<title>Form to create a new resource</title>
</head>
<body>
<form action="../CRUDRestWS/rest/todos" method="POST">
<label for="id">ID</label>
<input name="id" />
<br/>
<label for="summary">Summary</label>
<input name="summary" />
<br/>
Description:
<TEXTAREA NAME="description" COLS=40 ROWS=6></TEXTAREA>
<br/>
<input type="submit" value="Submit" />
</form>
</body>
</html>
Web Services Exercises www.imcinstitute.com IMC Institute
Listing ท 14 โปรแกรม 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>CRUDRestWS</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.rest.resources</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>
Java Web Services Exercises Thanachart and Thanisa Numnonda
37
Exercise 8: Java Web Services Using NetBeans
แบบฝกหดนเปนการพฒนาโปรแกรม Web Services สำหรบ Java EE โดยใชชดคำสง JAX-WS ซงจะเปนการพฒนา Web Services Provider บน Java EE Server ทงนชดคำสง JAX-WS จะชวยทำใหการสรางและเรยกใช Web Services ดวยภาษา Java เปนไปไดงายขน
การพฒนา Web Services จะแบงไดเปนสองสวนคอ Web Service Requester (Client) และ Web Service Provider (Server) ซงการพฒนา Web Service Provider สามารถทำได 2 วธคอ
3. Web Services ทรนบน Web Server โดยใช Java Servlet4. Web Services ทรนบน Application Server โดยใช Session Bean
แบบฝกหดนจะแสดงขนตอนการใช NetBeans สราง Web Service ทชอ calculateTax โดยใช Servletซงจะรนอยบน GlassFish V2.1 Server เพอแสดง Web Services การสง SOAP message และ WSDL ของ Services
การพฒนา calculateTax Web Service
แบบฝกหดนจะสราง Web Application Project ขนใหม เพอใชในการเกบ Web Service โดยมขนตอนการพฒนาดงน
1. เลอกเมน File > New Project2. ในไดอะลอก New Project ใหเลอก Categories เปน Java Web และ Projects เปน Web
Application แลวกด Next3. กำหนด Project Name เปน TaxWSDemo แลวเลอก Project Location เปน folder ทเราตองการจะ
เกบ Project ไว 4. จากนนเลอก Server เปน GlassFish V3.1.2 กำหนด Jave EE Version: เปน Java EE 6 แลวกด
Finish5. คลกขวาทโหนด TaxWSDemo จากนนเลอกคำสง New > Other… ใหเลอก Categories เปน Web
Services และเลอก File Types เปน Web Service แลวกด Next6. ในไดอะลอก New Web Service กำหนด Web Service Name: เปน TaxService และ Package:
เปน ws แลวกด Finish7. โปรแกรมจะประกาศ Web Services ทชอ TaxService ในโหนด Web Services ของหนาตาง Project
และหนาตาง Editor จะแสดงไฟลทชอ TaxService.java8. ในหนาตาง Projects ขยายโหนด TaxWSDemo > Web Services แลวคลกขวาทโหนด TaxService
เลอกคำสง Add Operation…
Web Services Exercises www.imcinstitute.com IMC Institute
9. ในไดอะลอก Add Operation กำหนด Method เปน calculateTax ชนดของ Return Type เปน double และกดปม Add เพอเพม Input parameter โดยกำหนด Name เปน income และ Type เปนชนด double แลวกด OK
10. คลกทแทป Source ของ TaxService.java และปรบปรงเมธอด calculateTax ดงนimport javax.jws.WebMethod;import javax.jws.WebParam;import javax.jws.WebService;
@WebService()public class TaxService { @WebMethod public double calculateTax(@WebParam(name = "income") double income) { if (income < 70000) { return 0; } else if (income < 100000) { return (income - 70000) * 0.05; } else if (income < 500000) { return (income - 100000) * 0.1 + 3500; } else { return (income - 500000) * 0.2 + 43500; } } }
11. คลกขวาทโหนด TaxWSDemo จากนนเลอกคำสง Clean and Build จากนนคลกขวาทโหนด TaxWSDemo อกครง แลวเลอก Deploy
การทดสอบ Web Service
1. คลกขวาท TaxService ใน Web Services แลวเลอก Test Web Service ดงแสดงในรปท 1
รปท 1 แสดงวธการทดสอบ Web Service ใน Netbeans
Java Web Services Exercises Thanachart and Thanisa Numnonda
39
2. โปรแกรมจะแสด3. หนาจอเพอใหเราปอนขอมลอนพต ซงคอจำนวนเงนทตองการคำนวณภาษ ในทนจะใสตวเลขเปน
730000 และกดปม calculateTax ดงแสดงในรปท 2
รปท 2 แสดงหนาตางสำหรบใหทดสอบเรยก Web Service
4. โปรแกรมจะเรยกใช Web Services และจะแสดงผลลพธทได พรอมทงแสดงคา SOAP Request และ SOAP Response ดงแสดงตวอยางในรปท 3
Web Services Exercises www.imcinstitute.com IMC Institute
รปท 3 แสดงผลลพธทไดจากการเรยกใช Web Service พรอมทง SOAP Request และ SOAP Response
5. หลงจากกด Back กลบมาทหนาเดมแลว เราสามารถทจะดรายละเอยดของไฟล WSDL ของ Web Service นได โดยการคลกเลอกท WSDL File ดงแสดงในรปท 4
รปท 4 แสดงการคลกเพอเรยกดรายละเอยดของไฟล WSDL
Java Web Services Exercises Thanachart and Thanisa Numnonda
41
6. โปรแกรมจะทำการเรยก url ชอ http://localhost:8080/TaxWSDemo/TaxServiceService?WSDL และจะไดผลลพธดงแสดงในรปท 5
รปท 5 แสดงรายละเอยดของ WSDL
7. โปรแกรม Web Service จะถกตดตงบน GlassFish V3.1.2 สามารถดไดจากการคลกขวาท GlassFish Server 3.1 ในแทป Services และเลอก View Admin Console ดงแสดงในรปท 6 หรอโดยการเปด Web Browser และเรยก url ท http://localhost:4848 โดยม user เปน admin และ password เปน adminadmin
รปท 6 แสดงการเรยกด Admin Console
Web Services Exercises www.imcinstitute.com IMC Institute
Exercise 9: การเชอมตอกบ MySQL Database
แบบฝกหดนเปนการเรมตนใชงาน Database Tool เพอเชอมตอกบ Table test ในฐานขอมล MySQLสำหรบเปนตวชวยใหทำงานไดเรวขน เชนปกตถาจะ create table กตองเขยน SQL แต Tool นม GUI มาชวย ทำใหลดขอผดพลาด และ สะดวกในการทำงานมากขน ทงนการทำแบบฝกหดนจะตองมการ download และตดตงโปรแกรม MySQL และ MySQL Workbench โดยสามารถทำการ download ไดจากเวบ http://dev.mysql.com/
การเชอมตอ MySQL โดยโปรแกรม MySQL Workbench
1. ใหเปดโปรแกรม MySQL Workbench ดงรปท 1 จากนนทำตามขนตอนดงน
รปท 1 การเรยกใชงาน Program MySQL Workbench
2. ดบเบลคลกท Connection Name ใส Password ทกำหนดไวในตอนตดตงโปรแกรม MySQL ซงจะมคาเปน root ดงรปท 2
รปท 2 การแสดงการเชอมตอ Connection เพอเขาไปจดการ Database
Java Web Services Exercises Thanachart and Thanisa Numnonda
43
การสรางตาราง booksขนตอนนจะเปนการสราง Table ทชอ books โดยใหอยภายใต Schema ทชอ test โดย Table นกำหนดใหม Column ตางๆ ดงตารางท 1
ตารางท 1 Table books
ชอ Column ชนด ขนาด Primary Key Index
isbn varchar 20 Y Y
title varchar 70 - -
author varchar 50 - -
price float - - -
เราจะใชโปรแกรม MySQL WorkBench ในการทจะสราง Table นโดยมขนตอนตางๆ ดงน
1. คลกท icon ชอ Add Table... แลวใสชอ table และ ชอ field ตามตารางท 1 ดงรปท 3 แลวกดปม Ap-ply
Web Services Exercises www.imcinstitute.com IMC Institute
รปท 3 การเลอกคำสงสรางตาราง
2. หรอใชคำสง SQL Statement กได โดยนำไปใสทหนาตาง Query1 แลว กด icon สายฟาสเหลองเพอรน
CREATE TABLE BOOKS (
ISBN VARCHAR(20) NOT NULL ,
TITLE VARCHAR(70) NULL ,
AUTHOR VARCHAR(50) NULL ,PRICE FLOAT NULL ,PRIMARY KEY (ISBN) );
3. เปด Tables books จะเหน Column ตางๆ ดงรปท 4
Java Web Services Exercises Thanachart and Thanisa Numnonda
45
รปท 4 ผลลพธจากการสรางตาราง
การใชคำสง SQL ใน MySQL WorkBench
ภายหลงจากทมการสราง Table ทชอ books เราสามารถใชคำสง SQL เพอทจะตดตอกบฐานขอมล ในทนจะแสดงการเพมขอมลลงใน Table โดยมขนตอนตางๆดงน
1. ดบเบลคลกท Table books ดานขวา จะได SQL Editor ใหปอนคำสง SQL เปนINSERT INTO books VALUES ('123', 'JAVA', 'Numnonda', 2500.00);
INSERT INTO books VALUES ('456', 'SOA', 'Numnonda', 3000.00) ;
Web Services Exercises www.imcinstitute.com IMC Institute
แลว คลกท icon สายฟาสเหลอง ดงรปท 5 หรอกด Ctrl+Shift+Enter เพอรนคำสง SQL ทงหมด
รปท 5 การ Execute คำสงเพมขอมลในตาราง
2. เราสามารถทจะดขอมลทปอนเขาไปได โดยการคลกขวาท Table ทชอ books เแลวลอก Select Rows – Limit 1000 ดงรปท 6
รปท 6 การเรยกดขอมลใน Table ชอ books 3. เมอตดตง Database แลวเราสามารถทจะใช NetBeans เพอเชอมตอกบ Database ไดโดยสำหรบ
Netbeans 7.3 ใหเลอกทแทป Services จะเหน MySQL Driver ทมมาใหแลว ซงถาขยายแทบ Data-bases > Drivers จะเหน Driver ทชอ MySQL ใหทำการคลกขวา แลวเลอก Connect Using
4. ใหทำการระบคาของ Host: และ Port: เปน localhost และ 3306 (กรณทไมไดเปลยนแปลง port ตอน ตดตง) ตามลำดบ
5. จากนนใหระบฐานขอมลทตองการตดตอ (ในทนระบ test) 6. สำหรบ User Name: และ Password: ใหใสคาตามทกำหนดไวในตอนตดตงโปรแกรม MySQL ซงในท
นจะมคาเปน root และ root โดยไดอะลอกจะแสดงผลไดดงแสดงในรปท 7
Java Web Services Exercises Thanachart and Thanisa Numnonda
47
รปท 7 แสดงการกำหนดคาใหกบ Database Connection7. กด OK จากนนในหนาตาง Runtime ถาขยายแทบ Database จะเหน Connection ใหมดงแสดงในรป
ท 8
รปท 8 แสดง Connection ไปยง test Database
Web Services Exercises www.imcinstitute.com IMC Institute
5. ถาขยายแทบ jdbc:mysql://localhost:3306/test จะเหนรายการ test > Tables > books คลกขวาแลวเลอก View Data... ดงแสดงในรปท 9
รปท 9 แสดงการเลอกเพอแสดงขอมลในตาราง books
6. จะเหนขอมลทอยในตาราง books ดงแสดงในรปท 10
รปท 10 แสดงขอมลในตาราง Books
Java Web Services Exercises Thanachart and Thanisa Numnonda
49
Exercise 10: Java Web Services from Session Bean(1)
แบบฝกหดในบทนเปนการพฒนาโปรแกรม Enterprise Java Bean (EJB) โดยจะเปนการพฒนาโปรแกรมบน GlassFish V3.1.2 เพอตดตอกบฐานขอมล MySQL โปรแกรม EJB บน Application Server จะประกอบดวย Entity Class ทเชอมโยงกบตารางทชอ books และ Session Bean เพอเปนโปรแกรมทสามารถเรยกใช Entity Class ในการจดการเพม แกไข และ ลบขอมลของตาราง books ได
ขนตอนในการพฒนาโปรแกรม1. สราง Enterprise Application Project2. พฒนา Entity Class3. พฒนา Session Bean4. พฒนา Web Application
โดยขนตอนแรกเราจะตองนำ MySQL Driver ไปใสไวใน GlassFish Server กอน เพอทำให GlassFish Serverสามารถทจะรนโปรแกรมทมการตดตอกบ MySQL Database ได ใหทำการดตำแหนงของ GlassFish จากใน NetBeans ดงน
1. คลกท tab Services ใน NetBeans2. คลกขวาท GlassFish Server 3.1.2 ทอยใน Servers แลวเลอก Properties ดงแสดงในรปท 1
รปท 1 แสดงการหาตำแหนงของ GlassFish3. จากนนใหดตำแหนงของ domain ใน GlassFish Server จาก Domains Folder: ดงแสดงในรปท 2
Web Services Exercises www.imcinstitute.com IMC Institute
รปท 2 แสดงตำแหนงของ Domain ใน GlassFish
4. ไปยงตำแหนงของ Domain ใน GlassFish จากนนใหนำไฟล mysql-connector-java-5.1.19-bin.jar (MySQL Driver) ไปใสไวใน folder lib ดงแสดงในรปท 3
รปท 3 แสดงการใส MySQL Driver ภายใน Domain ของ GlassFish
5. Restart GlassFish โดยคลกขวาตรง GlassFish ทอยใน NetBeans แลวเลอก Restart ดงแสดงในรปท 4
Java Web Services Exercises Thanachart and Thanisa Numnonda
51
รปท 4 แสดงการ Restart GlassFish Server
การสราง Enterprise Application Project
เราจะกำหนดใหโปรแกรมนเปนโปรแกม Enterprise Application ซงมทง EJB Module และ Web Module ขนตอนแรกจะเปนการสราง Project ใหมขนมาใน NetBeans ซงมขนตอนดงน
1. เลอกเมน File => New Project2. ในไดอะลอก New Project ใหเลอก Categories เปน Java EE และเลอก Enterprise เปน Enterprise
Application แลวกด Next3. กำหนด Project Name เปน BookApp แลวเลอก Project Location เปน folder ทเราตองการจะเกบ
project ไว กด Next4. จากนนเลอก Server เปน GlassFish V3.1.2 โดยกำหนด Jave EE Version: เปน Java EE 6 และให
เลอกชอง Create EJB Module: และ Create Web Application Module: ดงแสดงในรปท 5
Web Services Exercises www.imcinstitute.com IMC Institute
รปท 5 แสดงการสรางโปรเจค Enterprise Application
5. กด Finish
การพฒนาโปรแกรม Entity Class
โปรแกรม EJB 3.0 จะใชคลาสประเภท Entity เพอเปนออปเจคทสอดคลองกบตารางในฐานขอมล ในทนเราจะสราง Entity Class ทชอ Books.java จากตารางทชอ books ซงมการสรางมากอนแลว โดยมขนตอนการพฒนาโปรแกรมนมดงน
1. เลอกหนาตาง Projects แลวคลกขวาทโหนด BookApp-ejb จากนนเลอกคำสง New > Other...2. ในไดอะลอก New File ใหเลอก Categories ทชอ Persistence เลอก File Types: เปน Entity
Classes from Database แลวกด Next3. ในไดอะลอก New Entity Classes from Database ใหเลอก Data Source: เปน New Data Source…
โดยใสชอ JNDI Name: jdbc/test และเลอกเชอมตอไปยงฐานขอมล test ดงแสดงในรปท 6
Java Web Services Exercises Thanachart and Thanisa Numnonda
53
รปท 6 แสดงการสราง Data Source
4. กด OK จากนนกด Add All >> เพอเลอกตารางทตองการนำมาสราง Entity Class ซงจะได Selected Tables: เปน books กด Next ดงแสดงในรปท 7
Web Services Exercises www.imcinstitute.com IMC Institute
รปท 7 แสดงการสราง Entity Class จาก Data Source
5. ในไดอะลอกถดไปใหระบ Package: เปน entity และใหตรวจสอบวา Crate Persistence Unit ไดถกเลอกไว ซง Persistence Unit จะเปนตวกำหนดให EJB Container ของ Application Server รไดวา Entity Class จะถกควบคมดวย Entity Manager ตวใด และเปนตวกำหนด Data Source ทจะใชกบ Entity Manager น
6. ไมจำเปนตองเปลยนคาใดๆ จากนนกด Next ดงแสดงในรปท 8
Java Web Services Exercises Thanachart and Thanisa Numnonda
55
รปท 8 แสดงการสราง Entity Class
7. เมอกด Finish โปรแกรมจะสรางไฟลทชอ persistence.xml ใน package: Configuration Files และสรางไฟลทชอ Books.java ใน package: entity
การพฒนาโปรแกรม Session Bean
โปรแกรม EJB จะใช Session Bean ในการตดตอกบโปรแกรมอนๆ ภายนอก EJB Container โดยโปรแกรมเหลานนจะตดตอกบ Entity Class โดยผาน Session Bean แบบฝกหดนจะสราง Session Bean ทชอ BooksFacade.java ทม Business method ในการสราง แกไข ลบ และเรยกดขอมลของตารางทชอ books โดยใช Entity Class ทชอ Books.java และ EntityManager โดยจะมขนตอนการพฒนาดงน
1. เลอกหนาตาง Projects แลวคลกขวาทโหนด BookApp-ejb จากนนเลอกคำสง New > Other…2. ในไดอะลอก New File ใหเลอก Categories ทชอ Persistence เลอก File Types: เปน Session
Beans for Entity Classes แลวกด Next3. จากนนกด Add All >> แลวกด Next4. ในไดอะลอกถดไปใหระบ Package: เปน sb และเลอก local ดงแสดงในรปท 9 แลวกด Finish
Web Services Exercises www.imcinstitute.com IMC Institute
รปท 9 แสดงการสราง Session Bean
5. โปรแกรมจะสรางไฟลทชอ BooksFacade.java และ BooksFacadeLocal.java ใน package ทชอ sb
การพฒนาโปรแกรม Web Application
โปรแกรม EJB จะเปนสวนของ Business Logic เทานน การพฒนาสวนของ Presentation จะตองใชโปรแกรม Web Application หรอ Java SE แบบฝกหดนจะพฒนาโปรแกรม Web Application เพอใหผใชปอน isbn ของหนงสอในหนาเวบ findBook.html แลวโปรแกรมจะเรยกโปรแกรม Servlet ทชอ ShowBook.java เพอแสดงรายละเอยดของหนงสอดงกลาวออกมา โดยมขนตอนการพฒนาดงน
1. การพฒนาโปรแกรม findBook.html
โปรแกรม findBook.html เปนเวบเพจทใชแสดงฟอรมสำหรบใหผใชปอน isbn ของหนงสอ โดยมขนตอนการพฒนาดงน
1. เลอกหนาตาง Projects แลวคลกขวาทโหนด BookApp-war จากนนเลอกคำสง New > Other…2. ในไดอะลอก New File ใหเลอก Categories ทชอ Web เลอก File Types: เปน HTML แลวกด Next3. กำหนด HTML File Name: เปน findBook แลวกด Finish4. เขยน source code ของไฟล findBook.html ตาม Listing ท 1 โดยเราสามารถทจะลาก icon ประเภท
HTML Forms ทอยในหนาตาง Palette เพอสามารถใหเขยนโปรแกรมไดงายขน
Java Web Services Exercises Thanachart and Thanisa Numnonda
57
Listing 1 โปรแกรม findBook.html
<html> <head> <title></title> </head> <body> <form action="ShowBook" method="POST"> <h2>Search Book from ISBN </h2> Enter ISBN <input type="text" name="isbn" value="" /> <input type="submit" value="Find" /> </form> </body></html>
2. การพฒนาโปรแกรม ShowBook.java
โปรแกรม ShowBook.java เปนโปรแกรม Java Servlet ทจะอานหมายเลข ISBN ทผใชปอนมาจากหนา findBook.html และจะเรยกเมธอด find() ของ session bean ทชอ BooksFacade เพอแสดงรายละเอยดของหนงสอ โดยมขนตอนการพฒนาโปรแกรมดงน
1. เลอกหนาตาง Projects แลวคลกขวาทโหนด BookApp-war จากนนเลอกคำสง New > Other...2. ในไดอะลอก New File ใหเลอก Categories ทชอ Web เลอก File Types: เปน Servlet แลวกด Next3. กำหนด File Name: เปน ShowBook และ Package: เปน servlets กด Next แลวกด Finish4. ในหนาตาง Editor ใหคลกขวาภายในเมธอด processRequest แลวเลอก Insert Code… > Call En-
terprise Bean…5. ในไดอะลอก Call Enterprise Bean เลอก BooksFacade ทอยใน BookApp-ejb แลวกด OK6. โปรแกรมจะเพม Source code ในการเรยก EJB ดงน
@EJB
private BooksFacadeLocal booksFacade;
7. ใหปรบปรง Source code ในเมธอด processRequest ดงน
protected void processRequest(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet ShowBook</title>");
Web Services Exercises www.imcinstitute.com IMC Institute
out.println("</head>");
out.println("<body>");
String isbn = request.getParameter("isbn");
Books book = booksFacade.find(isbn);
out.println("Title: " + book.getTitle()+ "<BR>");
out.println("Author: " + book.getAuthor() + "<BR>");
out.println("Price: " + book.getPrice() + "<BR>");
out.println("</body>");
out.println("</html>");
out.close();
}
9. คลกขวาแลวเลอก Fix Imports เพอทำการ import คลาสตางๆ แลว Save โปรแกรม
การทดสอบโปรแกรม
1. ทำการคลกขวาตรง BookApp เพอทำการ Clean and Build2. Run โปรแกรม BookApp (ไมใช BookApp-ejb หรอ BookApp-war)3. เลอก URL ของ Web Browser เปน http://localhost:8080/BookApp-war/findBook.html ใหเราทดลอง
ใสขอมล4. เมอกดปม Find โปรแกรมกจะแสดงรายละเอยดของหนงสอดงแสดงในรปท 10
รปท 10 แสดงตวอยางผลลพธทไดจากการรนโปรแกรม
Java Web Services Exercises Thanachart and Thanisa Numnonda
59
Exercise 11: Java Web Services from Session Bean (2)
แบบฝกหดในบทนเปนการพฒนาโปรแกรม Web Services สำหรบ Java EE ซงจะเปนการพฒนาบน Server ทรนบน Java EE โดยชดคำสง JAX-WS ซงในกรณนจะแสดงขนตอนการใช NetBeans สราง Web Services Method ทชอ findEmployeeDetails จาก Session Bean โดย Service นจะเปนการคนหาขอมลของ employee จาก table ทชอ employees และ departments ในฐานขอมล MySQL ซงมขนตอนในการพฒนา โปรแกรมดงน
1. สราง Table ทชอ employees และ departments2. สราง EJB Module3. พฒนาโปรแกรม Entity Class4. พฒนาโปรแกรม Session Bean5. สราง Web Application
1. การสราง Table ทชอ employees และ departments
ขนตอนแรกจะเปนการสราง table โดยใชโปรแกรม NetBeans ใหทำการคดลอก script ตอไปน แลวใสใน SQL Command Editor ของ NetBeans จากนนใหทำการ Run SQL ดงแสดงในรปท 1
create table `test`.DEPARTMENTS
(
DEPARTMENT_ID DECIMAL(4) not null primary key,
DEPARTMENT_NAME VARCHAR(30) not null
) ENGINE=INNODB;
insert into departments values(90,'Executive');
create table `test`.EMPLOYEES
(
EMPLOYEE_ID DECIMAL(6) not null primary key,
FIRST_NAME VARCHAR(20),
LAST_NAME VARCHAR(25) not null,
DEPARTMENT_ID DECIMAL(4),
FOREIGN KEY (DEPARTMENT_ID) REFERENCES DEPARTMENTS(DEPARTMENT_ID) ON UPDATE CASCADE
) ENGINE=INNODB;
insert into employees values(100,'Steven','King',90);
Web Services Exercises www.imcinstitute.com IMC Institute
insert into employees values(101,'Neena','Kochhar',90);
รปท 1 แสดงการสราง Run SQL เพอสรางตาราง
โดยเมอตรวจสอบดใน tables ของ test จะพบ table ทชอ employees และ departments ดงแสดงในรปท 2
รปท 2 แสดงตารางทถกสรางขนมา
การสราง EJB Module
1. เลอกเมน File > New Project2. ในไดอะลอก New Project ใหเลอก Categories เปน Java EE และเลอก Enterprise เปน EJB Mod-
ule ดงแสดงในรปท 3 แลวกด Next
Java Web Services Exercises Thanachart and Thanisa Numnonda
61
รปท 3 แสดงการสราง EJB Module
3. กำหนด Project Name เปน EmployeeWS แลวเลอก Project Location เปน folder ทเราตองการจะเกบไฟลไว แลวกด Next
4. เลอก Server เปน GlassFish V3.1.2 กำหนด Jave EE 6 แลวกด Finish
การพฒนา Employees and Departments Entity Classes
1. เลอกหนาตาง Projects แลวคลกขวาทโหนด EmployeeWS จากนนเลอกคำสง New > Other2. ในไดอะลอก New File ใหเลอก Categories ทชอ Persistence เลอก File Types: เปน Entity Classes
from Database แลวกด Next3. ในไดอะลอก New Entity Classes from Database ใหเลอก Data Source: เปน jdbc/test เพอเลอก
การเชอมตอไปยงตาราง test ในฐานขอมล MySQL4. จากนนใหเลอกไปทตาราง EMPLOYEES แลวกด Add > และคงการเลอก Include Related Tables
ไวตาราง EMPLOYEES และ DEPARTMENTS จะถกยายมาอยใน Selected Tables: ดงแสดงในรปท4 แลวกด Next
Web Services Exercises www.imcinstitute.com IMC Institute
รปท 4 แสดงการสราง Entity Class สำหรบ EMPLOYEES และ DEPARTMENTS
5. ในไดอะลอกถดไปใหระบ Package: เปน entity ดงแสดงในรปท 5 จากนนกด Next และ Finish
รปท 5 แสดงการระบ Package สำหรบ Entity Classs ทสรางขนมา
Java Web Services Exercises Thanachart and Thanisa Numnonda
63
การพฒนาโปรแกรม Session Beanโปรแกรม NetBeans จะม Wizard เพอสราง Session Bean จาก Entity Class เพอสราง Business method ในการสราง แกไข ลบ และเรยกดขอมลของ table ทสอดคลองกบ Entity Class โดยจะมขนตอนการพฒนาดงน
1. เลอกหนาตาง Projects แลวคลกขวาทโหนด EmployeeWS จากนนเลอกคำสง New > Other...2. ในไดอะลอก New File ใหเลอก Categories ทชอ Persistence เลอก File Types: เปน Session
Beans for Entity Classes แลวกด Next3. ในไดอะลอก New Session Beans for Entity Classes กด Add All >> แลวคงการเลอก Include Ref-
erenced Class ไว ดงแสดงในรปท 6 จากนนกด Next
รปท 6 แสดงการสราง Session Beans For Entity Classes
4. ในไดอะลอกถดไปใหระบ Package: เปน sb และเลอก local ดงแสดงในรปท 7 แลวกด Finish
Web Services Exercises www.imcinstitute.com IMC Institute
รปท 7 แสดงการสราง Session Bean
ซงเราจะได Entity Class ทชอ Employees, Departments และ Session Bean ทชอ AbstractFacade, Em-ployeesFacade, EmployeesFacadeLocal โดยเมอทำการ Clean and Build โปรเจคแลว จะมโครงสรางของโปรเจค ดงแสดงในรปท 8
รปท 8 แสดงโครงสรางของโปรเจค EmployeeWS ทถกสรางขน
การพฒนา Web Service Methods: findEmployeeDetails ขนตอนนจะสราง Web Services Method ทชอ findEmployeeDetails ใน Session Bean ทชอ Em-
ployeesFacade.java ทพฒนาจากแบบฝกหด Enterprise Java Bean โดย Services นจะคนคา first_name, last_name และ department_name ของ employee โดยการคนหาจาก employee_id ทปอนเขามา ซงมขนตอนการพฒนาดงน
Java Web Services Exercises Thanachart and Thanisa Numnonda
65
1. เลอกไฟล EmployeesFacade.java แลวคลกขวาเลอก Insert Code… > Add Business Method…จากนนใหทำการใสขอมลดงแสดงในรปท 3
รปท 3 แสดงการเพมเมธอดใน Session Bean
2. เพม source code โดยเพมคำสง annotation เพอประกาศให session bean นเปน Web Service และเมธอด findEmployeeDetails เปน Web Services Method โดยมคำสงดงน
@WebService
@Stateless
public class EmployeesFacade extends AbstractFacade<Employees> implements EmployeesFacadeLocal {
@PersistenceContext(unitName = "EmployeeWSPU")
private EntityManager em;
protected EntityManager getEntityManager() {
return em;
}
public EmployeesFacade() {
Web Services Exercises www.imcinstitute.com IMC Institute
super(Employees.class);
}
@WebMethod
public List<String> findEmployeeDetails(int employee_id) {
ArrayList<String> result = new ArrayList<String>();
Employees employee = em.find(Employees.class, employee_id);
result.add("First name: " + employee.getFirstName());
result.add("Last name: " + employee.getLastName());
Departments department = employee.getDepartmentId();
result.add("Department name: " + department.getDepartmentName());
return result;
}
}
2. คลกขวาเลอก Fix Imports กด OK แลวกดปม Save3. ทำการ Clean and Build และ Deploy Project4. จากนนใหคลกขวาท EmployeeFacade ใน Web Services แลวเลอก Test Web Service5. กด WSDL File ในหนา Web Browser จากนนใหทำการ copy URL ของ WSDL File ไว เชน
http://localhost:8080/EmployeesFacadeService/EmployeesFacade?WSDL
การพฒนาโปรแกรม Web Application เพอเรยกใช Web Serviceขนตอนนจะเปนการพฒนา Web Application บน Apache Tomcat เพอเรยกใช Web Service ทชอ
findEmployeeDetails โดยมขนตอนการพฒนาดงน
1. เลอกเมน File > New Project..2. ในไดอะลอก New Project ใหเลอก Categories เปน Web และ Projects เปน Web Application แลว
กด Next3. กำหนด Project Name เปน EmployeeWSClient จากนนเลอก Server เปน Apache Tomcat
7.0.14.0 กำหนด Jave EE Version: เปน Java EE 6 แลวกด Finish4. เลอกหนาตาง Projects แลวคลกขวาทโหนด EmployeeWSClient จากนนเลอกคำสง New > Other..
Java Web Services Exercises Thanachart and Thanisa Numnonda
67
5. ในไดอะลอก New File ใหเลอก Categories ทชอ Web Services เลอก File Types: เปน Web Ser-vice Client แลวกด Next
6. ในไดอะลอก New Web Service Client เลอก WSDL URL: และใสคา http://localhost:8080/Employ-eesFacadeService/EmployeesFacade?WSDL
7. กด Finish โปรแกรมจะแสดง Web Service Reference โดยม Service ชอ EmployeesFacade8. คลกขวาทโหนด EmployeeWSClient แลวเลอก New > Servlet..9. กำหนด Servlet Name: เปน EmployeeServlet ใสใน Package: servlets กด Next10. กำหนด URL Pattern(s): เปน /findEmployee แลวกด Finish11. ในหนาตาง Projects ลากโหนด findEmployeeDetails ลงในไฟล EmployeeServlet.java ของหนาตาง
Editor โปรแกรมจะเพม source code ใหอตโนมต ใหปรบปรง source code ในสวนทเรยกใช Web Service ดงน
protected void processRequest(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
String id = request.getParameter("id");
int employee_id = Integer.parseInt(id);
List<String> result = findEmployeeDetails(employee_id);
for (String s : result) {
out.print(s + "<BR>");
}
} finally {
out.close();
}
}
private static java.util.List<java.lang.String> findEmployeeDetails(int arg0) {
sb.EmployeesFacadeService service = new sb.EmployeesFacadeService();
sb.EmployeesFacade port = service.getEmployeesFacadePort();
return port.findEmployeeDetails(arg0);
}
Web Services Exercises www.imcinstitute.com IMC Institute
12. กดปม Save
การทดสอบโปรแกรม1. ทำการ Build และ Deploy โปรเจค EmployeeWSClient 2. Run โปรแกรม EmployeeServlet โดยใหใสคาของ URI เปน /findEmployee?id=100 ดงแสดงในรปท
4 จะไดผลลพธดงแสดงในรปท 5
รปท 4 แสดงการกำหนดคา id
รปท 5 แสดงผลลพธของ employee id=100
3. ทดลองเปลยน URL ของ Web Browser เปน http://localhost:8084/EmployeeWSClient/findEmployee?id= 101 จะไดผลลพธดงแสดงในรปท 6
Java Web Services Exercises Thanachart and Thanisa Numnonda
69
รปท 6 แสดงแสดงผลลพธของ employee id=101
4. อาจทำการสรางไฟล findEmployee.html เพอรบคา employee id จากผใช โดยกำหนดให findEmploy-ee.html เรยกใช EmployeeServlet ซงจะเรยกใช Web Service เพอแสดงผลลพธอกท
Web Services Exercises www.imcinstitute.com IMC Institute
Exercise 12: RESTful Web Services
แบบฝกหดนเปนการพฒนาโปรแกรม RESTful Web Services โดยใชชดคำสง JAX-RS และ NetBeans เพอสราง Web Services ทจะเรยกดขอมลจากฐานขอมล MySQL ผานชดคำสง Java Persistence API (JPA)
ขนตอนในการพฒนาโปรแกรม1. สราง Web Application Project2. พฒนา Entity Class3. พฒนา RESTful Web Service จาก Entity Class4. ทดสอบ RESTful Web Service จาก Entity Class
1. การสราง Web Application Project
เราจะกำหนดใหโปรแกรมนเปนโปรแกม Web Application ขนตอนแรกจะเปนการสราง Project ใหมขนมาใน NetBeans ซงมขนตอนดงน
1. เลอกเมน File > New Project2. ในไดอะลอก New Project ใหเลอก Categories เปน Java Web และเลอก Project เปน Web Applic-
ation แลวกด Next3. กำหนด Project Name เปน RestfulWS แลวเลอก Project Location เปน Directory ทเราตองการจะ
เกบ Project ไว กด Next4. จากนนเลอก Server เปน GlassFishV3.1 และ Java EE 6 แลวกด Finish
2. การพฒนา Entity Class
ขนตอนนจะเปนการสราง Entity Class ทชอ Employees.java ซงจะเปนออปเจคทสอดคลองกบตารางทชอ employees ใน Oracle โดยมขนตอนการพฒนาโปรแกรมดงน
1. เลอกหนาตาง Projects แลวคลกขวาทโหนด RestfulWS จากนนเลอกคำสง New > Other2. ในไดอะลอก New File ใหเลอก Categories ทชอ Persistence เลอก File Types: เปน Entity
Classes from Database แลวกด Next
Java Web Services Exercises Thanachart and Thanisa Numnonda
71
3. ในไดอะลอก New Entity Classes from Database ใหเลอก Data Source: เปน jdbc/test 4. กด OK จากนนเลอกเฉพาะ books แลวกด Add > 5. ในไดอะลอกถดไปใหระบ Package: เปน entity และกด Finish
3. การ พฒนา Restful Web Service จาก Entity Class
ขนตอนนจะเปนการพฒนา Restful Web Services เพอใหสามารถตดตอกบฐานขอมลโดยผาน Entity Class ทพฒนาขนได โดยจะมขนตอนการพฒนาดงน
1. เลอกหนาตาง Projects แลวคลกขวาทโหนด RestfulWS จากนนเลอกคำสง New > Other2. ในไดอะลอก New File ใหเลอก Categories ทชอ Web Services เลอก File Types: เปน RESTful
Web Services from Entity Classes แลวกด Next 4. ในไดอะลอก New RESTful Web Services from Entity Class กด Add All >> จะไดผลลพธดงแสดง
ในรปท 1 แลวกด Next จากนนกด Finish
รปท 1 การเลอก Entity Class สำหรบ RESTful Web Service4. การทดสอบ RESTful Web Service จาก Entity Class
ขนตอนนจะเปนการทดสอบ RESTful Web Services ทพฒนาขนโดยจะมขนตอนดงน
Web Services Exercises www.imcinstitute.com IMC Institute
1. เลอกหนาตาง Projects แลวคลกขวาทโหนด RestfulWS จากนนเลอกคำสง Test Restful Web Services
2. โปรแกรม Browser จะแสดง uri ของ RESTful Web Services ใหคลกทโหนด entity.books และคลกปม Test จะไดผลลพธดงรปท 2
รปท 2 แสดงผลลพธของหนงสอทงหมดทมอย
3. ใหคลกท {id} และทดลองปอนขอมล id เปน 111 แลวกดปม Test จะไดผลลพธตวอยางดงรปท 3
Java Web Services Exercises Thanachart and Thanisa Numnonda
73
รปท 3 แสดงผลลพธของหนงสอทม id (isbn) เทากบ 111
4. ทดลองเปลยน method เปน DELETE เพอทดลองทำการลบขอมลออกจากตาราง books
Web Services Exercises www.imcinstitute.com IMC Institute
Exercise 13: การพฒนาโปรแกรมเวบเพอตดตอฐานขอมล MongoDB
แบบฝกหดนจะเปนการพฒนาโปรแกรม Web Application โดยใช Java Servlet เพอเชอมตอกบ ฐานขอมลทเปน NoSQL อยาง MongoDB ซงเปนฐานขอมลทเกบขอมลแบบ Document ในรปแบบของ JSON และมความสามารถในการเกบขอมลขนาดใหญได
ขนตอนในการพฒนาโปรแกรม1. ตดตง MongoDB2. ทดลองใช MongoDB 3. เขยนโปรแกรม Java Servlet เพอเชอมตอกบ MongoDB
1. การ ตดตง MongoDB
โปรแกรมฐานขอมล MongoDB สามารถทำงานในระบบปฎบตการทหลากหลายทง Windows, Mac OS หรอ Linux สำหรบบนระบบปฎบตการ Windows สามารถตดตงไดโดยการดาวนโหลดไฟล Binary จากเวบไซต http://www.mongodb.org/downloads ซงเมอทำการดาวนโหลดไฟลดงกลาวแลว ใหทำการ unzip เกบไฟลไวในไดเรกทอรทตองการ โดยเราจะมไฟลตางๆ ดงรปท 1
Java Web Services Exercises Thanachart and Thanisa Numnonda
75
รปท 1 ไฟลไบนารตางๆ ของ MongoDB
ซงไฟลทสำคญกคอ mongod.exe ทเปน Database Server mongo.exe ทเปนหนาจอของ admin
โดย Default MongoDB จะเกบขอมลไวทไดเรกทอร \data\db ซงเราจะตองไปสรางไดเรกทอรดงกลาว ภายใต Drive C
2. การ ทดลองใช MongoDB
เราสามารถทจะทดลองการใชงาน MongoDB โดยการเปดโปรแกรม Mongo.exe ซงกจะเปนโปรแกรม command shell ของ administrator และโดย Default กจะกำหนดใชฐานขอมลทชอ test ซงเราสามารถทจะ แสดงฐานขอมลทใชอยได โดยการพมพคำสง
> db
Web Services Exercises www.imcinstitute.com IMC Institute
คำสงทจะแสดงรายชอฐานขอมล (database) ทงหมดคอ>show dbs
เราสามารถทจะสรางฐานขอมลใหมทชอวา mydatabase โดยใชคำสง>use mydatabase
คำสงทจะแสดง Tables ทงหมดในฐานขอมลคอ>show collections
และเราสามารถทจะเรยกดคำสงในการชวยเหลอโดย>help
สำหรบในตวอยางนเราจะทำการทดลองสรางขอมลของหนงสอ สองเลมดงน> db.books.insert({isbn:"555123", author:"thanachart", title:"Introduction to MongoDB",
price:1200})
และสามารถทำการเพมขอมลไดโดยคำสงตอไปน> new_book = {isbn:"555124", author:"James Gosling", title: "Java SE", price: 1400}> db.books.insert(new_book)
เราสามารถทจะดขอมลของหนงสอทงหมดไดจากคำสง> db.books.find()
ซงกจะไดผลลพธดงน{ "_id" : ObjectId("511fb0387c199204a9f733a5"), "isbn" : "555123", "author" : "thanachart",
"title" : "Introduction to MongoDB", "price" : 1200 }{ "_id" : ObjectId("511fb24e7c199204a9f733a6"), "isbn" : "555124", "author" : "James Gosling",
"title" : "Java SE", "price" : 1400 }
Java Web Services Exercises Thanachart and Thanisa Numnonda
77
ทงน id จะเปน index ในการระบหมายเลขของขอมล นอกจากนเราสามารถทจะคนหาขอมลสำหรบ รายการใดๆ ไดเชน การคนหาตามชอผแตง
> db.books.find({author:"thanachart"})
หรออาจตองการคนชอหนงสอทมคำวา Mongo > db.books.find({title:/Mongo/})
เราสามารถทจะ update ขอมล เชนตองการเปลยนราคาของหนงสอทแตงโดย thanachart เปน 1300 โดยใชคำสง
> db.books.update({author:"thanachart"},{$set: {price:1300}})
เราจะลองทำการเพม comment ของหนงสอเชนมผอานทชอ Somchai อาจมาใหความเหนวาหนงสอของ James Gosling เปน “good reading book” โดยเราอาจใชคำสงดงน
> new_comment = {reader:"Somchai", date: new Date(), text: "good reading book"} > db.books.update({author:/James/},{$push: {comment:new_comment}})
ซงเราจะไดขอมลนใหมเปน{ "_id" : ObjectId("511fb0387c199204a9f733a5"), "isbn" : "555123", "author" : "thanachart",
"title" : "Introduction to MongoDB", "price" : 1300 }{ "_id" : ObjectId("511fb24e7c199204a9f733a6"), "author" : "James Gosling", "comment" :
[ { "reader" : "Somchai", "date" : ISODate("2013-02-16T16:45:07.309Z"), "text" : "good reading book" } ], "isbn" : "555124", "price" : 1400, "title" : "Java SE" }
3. การ เขยนโปรแกรม Java Servlet เพอเชอมตอกบ MongoDB
เราสามารถทจะเขยนโปรแกรมเชอมตอกบฐานขอมล MongoDB ไดหลายแบบ แตในทนจะใช Mon-goDB Driver ทสามารถจะดาวนโหลดมาไดจาก https://github.com/mongodb/mongo-java-driver/downloads
ในทนจะสาธตการเพมขอมลลงใน MongoDB โดยเราจะใหม โปรแกรม addBook.html และ thanky-ou.html ดง Listing ท 1 และ 2 และทำการเขยนโปรแกรม Servlet โดยมขนตอนดงน
Web Services Exercises www.imcinstitute.com IMC Institute
1. เลอกเมน File > New Project2. ในไดอะลอก New Project ใหเลอก Categories เปน Java Web และ Projects เปน Web
Application แลวกด Next3. กำหนด Project Name เปน WebBaseDB แลวเลอก Project Location เปน folder ทเราตองการจะ
เกบ Project ไว แลวกด Next4. เลอก Server เปน Apache Tomcat กำหนด Jave EE Version: เปน Java EE 6 Web แลวกด
Finish 5. คลกขวาทโหนด WebBaseDB จากนนเลอกคำสง New > HTML กำหนด HTML File Name: เปน
addBook แลวกด Finish6. เขยน source code ของไฟล addBook.html ตาม Listing ท 1
Listing ท 1 โปรแกรม addBook.html
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Add a new book</title> </head> <body><h1>Add a new book</h1><P> <form action="MongoDBServlet" method="POST"> ISBN : <input type="text" name="isbn" value="" size="15"/> <BR> Title : <input type="text" name="title" value="" size="50"/> <BR>
Author : <input type="text" name="author" value="" size="50"/> <BR> Price : <input type="text" name="price" value="" size="10"/> <BR>
<input type="submit" value="Add" /> </form> </body></html>
7. คลกขวาทโหนด WebBaseDB จากนนเลอกคำสง New > HTML กำหนด HTML File Name: เปน thankyou แลวกด Finish
8. เขยน source code ของไฟล thankyou.html ตาม Listing ท 2
Listing ท 2 โปรแกรม thankyou.html
<html> <head> <title>Thank you</title> </head> <body> <H1>Thank you for inserting data </H1> </body> </html>
Java Web Services Exercises Thanachart and Thanisa Numnonda
79
9. คลกขวาทโหนด WebBaseDB จากนนเลอกคำสง New → Servlet กำหนด Java Package เปน controller, Class Name เปน MongoDBServlet แลวกด Finish
10. copy ไฟล mongo-2.10.1.jar ไปไวทไดเรกทอร โดยให Copy ไปวางท directory /lib ของ Apache Tomcat (ซง Default อยท C:\Program Files\Apache Software Foundation\Tomcat 6.0\lib\)
11. ในหนาตาง editor ใหแกไข source code ของไฟล MongoDBServlet.java ใหเปนไปตาม Listing ท 3
Listing ท 3 โปรแกรม MongoDBServlet.java
package controller;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.UnknownHostException;
import java.sql.SQLException;
import java.sql.Statement;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.Mongo;
/**
* Servlet implementation class MongoDBServlet
*/
@WebServlet("/MongoDBServlet")
public class MongoDBServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
Mongo m = null;
public void init() {
try {
m = new Mongo( "localhost" );
Web Services Exercises www.imcinstitute.com IMC Institute
System.out.println("Connected");
} catch (Exception ex) {
System.out.println(ex);
}
}
protected void processRequest(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Add a new book</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1> Add a new book </h1>");
try {
String isbn = request.getParameter("isbn");
String author = request.getParameter("author");
String title = request.getParameter("title");
String priceStr = request.getParameter("price");
float price = Float.parseFloat(priceStr);
DB db = m.getDB( "test" );
BasicDBObject book = new BasicDBObject();
book.put("isbn", isbn);
book.put("author", author);
book.put("title", title);
book.put("price", price);
DBCollection coll = db.getCollection("books");
coll.insert(book);
RequestDispatcher obj = request.getRequestDispatcher("thanky-ou.html");
obj.forward(request, response);
} catch (UnknownHostException ex) {
out.println("Error " + ex);
return;
}
out.println("</body>");
out.println("</html>");
Java Web Services Exercises Thanachart and Thanisa Numnonda
81
out.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse re-sponse) throws ServletException, IOException {
processRequest(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse re-sponse) throws ServletException, IOException {
processRequest(request, response);
}
}
4 การ ทดสอบโปรแกรม
1. ทำการ Deploy โปรแกรม WebBaseDB 2. เรยกใชงานหนา addBook.html แลวทดสอบกรอกขอมล3. ไปทโปรแกรม admin ของ MongoDB แลวเรยกคำสง db.books.find() จะเหนขอมลใหมทปอนเขามา
Web Services Exercises www.imcinstitute.com IMC Institute