วันพุธที่ 15 กุมภาพันธ์ พ.ศ. 2555

RESTful Webservices with Java (Jersey / JAX-RS) ตอนที่ 1

สวัสดีครับ ทุึกคน วันนี้ก็ถึงเวลาที่เราจะมาทดลองการเขียน Webservice กันสักที


Table 1. Sample Table
AnnotationDescription
@PATH(your_path)Sets the path to base URL + /your_path. The base URL is based on your application name, the servlet and the URL pattern from the web.xml" configuration file.
@POSTIndicates that the following method will answer to a HTTP POST request
@GETIndicates that the following method will answer to a HTTP GET request
@PUTIndicates that the following method will answer to a HTTP PUT request
@DELETEIndicates that the following method will answer to a HTTP DELETE request
@Produces( MediaType.TEXT_PLAIN [, more-types ] )@Produces defines which MIME type is delivered by a method annotated with @GET. In the example text ("text/plain" ) is produced. Other examples would be "application/xml" or "application/json".
@Consumes( type [, more-types ] )@Consumes defines which MIME type is consumed by this method.
@PathParamUsed to inject values from the URL into a method parameter. This way you inject for example the ID of a resource into the method to get the correct object.
The complete path to a resource is therefore based on the base URL and the @PATh annotation in your class.
http://your_domain:port/display-name/url-pattern/path_from_rest_class
   



Tools ที่เราใช้ประกอบไปด้วย
1. Eclipse Helios
2. Tomcat 6.0


1.Create Java Web Dynamic



























library ทั้งหมดที่เกี่ยวข้อง



cccc























1.Domain


package com.blogspot.javathaitalk.domain;


public class Track {


String title;
String singer;


public String getTitle() {
return title;
}


public void setTitle(String title) {
this.title = title;
}


public String getSinger() {
return singer;
}


public void setSinger(String singer) {
this.singer = singer;
}


@Override
public String toString() {
return "Track [title=" + title + ", singer=" + singer + "]";
}


}

2.Java Class Service


package com.blogspot.javathaitalk.webservices.rest;


import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;


import com.blogspot.javathaitalk.domain.Track;






@Path("/json/metallica")
public class JSONService {


@GET
@Path("/get")
@Produces(MediaType.APPLICATION_JSON)
public Track getTrackInJSON() {


Track track = new Track();
track.setTitle("Enter Sandman");
track.setSinger("Metallica");


return track;


}


@POST
@Path("/post")
@Consumes(MediaType.APPLICATION_JSON)
public Response createTrackInJSON(Track track) {


String result = "Track saved : " + track;
return Response.status(201).entity(result).build();

}

}


3.Jersey Client Get


package com.blogspot.javathaitalk.webservices.client;


import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;


public class JerseyClientGet {


public static void main(String[] args) {
try {


Client client = Client.create();


WebResource webResource = client.resource("http://localhost:8080/DemoRESTfulExample/rest/json/metallica/get");


ClientResponse response = webResource.accept("application/json")
.get(ClientResponse.class);


if (response.getStatus() != 200) {
throw new RuntimeException("Failed : HTTP error code : "
+ response.getStatus());
}


String output = response.getEntity(String.class);


System.out.println("Output from Server .... \n");
System.out.println(output);


} catch (Exception e) {


e.printStackTrace();


}


}


}

4.Jersey Client Post


package com.blogspot.javathaitalk.webservices.client;


import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;


public class JerseyClientPost {


public static void main(String[] args) {


try {


Client client = Client.create();


WebResource webResource = client
.resource("http://localhost:8080/DemoRESTfulExample/rest/json/metallica/post");


String input = "{\"singer\":\"Metallica\",\"title\":\"Fade To Black\"}";


ClientResponse response = webResource.type("application/json")
.post(ClientResponse.class, input);


if (response.getStatus() != 201) {
throw new RuntimeException("Failed : HTTP error code : "
+ response.getStatus());
}


System.out.println("Output from Server .... \n");
String output = response.getEntity(String.class);
System.out.println(output);


} catch (Exception e) {


e.printStackTrace();


}


}


}

 5.Define Jersey Servlet dispatcher


<?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>DemoRESTfulExample</display-name>
  
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
<servlet-name>jersey-serlvet</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.blogspot.javathaitalk.webservices.rest</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>


<servlet-mapping>
<servlet-name>jersey-serlvet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>

</web-app>




สำหรับการทดสอบ Webservice ให้ทำการ Run Java Web ก่อน แล้วค่อยไปเรียกทดสอบ Client แบบ java App ธรรมดาทีหลัง

1.ทดสอบ เรียกผ่าน URL ด้วย Get Method






2.ทดสอบเรียกผ่าน JerseyClientGet Class










3.ทดสอบเรียกผ่าน JerseyClientPost Class










*ปล. ถ้าใครอยากได้ SourceCode ให้ Comment ไว้นะครับ เดี๋ยวผมจะส่งให้ทาง Email.

วันอังคารที่ 14 กุมภาพันธ์ พ.ศ. 2555

Struts 2 > Hello World Application

    ในแบบฝึกหัดนี้เราจะแสดงให้เห็นถึงวิธีการสร้าง Strust 2 แบบง่ายๆ ด้วย Hello World Application ก่อนการสร้างจะมีไฟล์ที่ประกอบการทำ Application ตามข้อมูลด้านล่างเลยครับ.

ไฟล์หลักๆ ในการทดสอบ  Hello World Application

  • web.xml
  • struts.xml
  • HelloWorld.java
  • index.jsp
  • success.jsp


รูปด้านล่างแสดงโครงสร้างของ Hello World Application



web.xml


<filter>
02.<filter-name>struts2</filter-name>
03.<filter-class>org.apache.struts2.dispatcher.FilterDispatcher </filter-class>
04.</filter>
05.<filter-mapping>
06.<filter-name>struts2</filter-name>
07.<url-pattern>/*</url-pattern>
08.</filter-mapping>
09.<welcome-file-list>
10.<welcome-file>index.jsp</welcome-file>
11.</welcome-file-list>

struts.xml

1.<struts>
2.<package name="default" extends="struts-default">
3.<action name="HelloWorld" class="com.blogspot.javathaitalk.HelloWorld">
4.<result name="SUCCESS">/success.jsp</result>
5.</action>
6.</package>
7.</struts>

index.jsp

01.<%@taglib uri="/struts-tags" prefix="s" %>
02. 
03.<html>
04.<head>
05.<title>Hello World</title>
06.</head>
07.<body>
08.<s:form action="HelloWorld" >
09.<s:textfield name="userName" label="User Name" />
10.<s:submit />
11.</s:form>
12.</body>
13.</html>

HelloWorld.java


01.public class HelloWorld {
02. 
03.private String message;
04. 
05.private String userName;
06. 
07.public HelloWorld() {
08.}
09. 
10.public String execute() {
11.setMessage("Hello " + getUserName());
12.return "SUCCESS";
13.}
14. 
15.public String getMessage() {
16.return message;
17.}
18. 
19.public void setMessage(String message) {
20.this.message = message;
21.}
22. 
23.public String getUserName() {
24.return userName;
25.}
26. 
27.public void setUserName(String userName) {
28.this.userName = userName;
29.}
30. 
31.}
ขันตอนของการ execute() method ของ class HelloWorld เราสามารถเข้าถึงข้อมูลของ properties ได้จาก Class นี้ซึ่งต่างจาก Struts 1 ที่ต้องมี Form. เราสามารถทำ Java class action ได้ง่ายๆ.

success.jsp

สำหรับ หน้า success เราจะทำการแสดงข้อความ "Hello คนไทย" โดยที่มันจะแสดงผ่าน property tag ที่ชื่อว่า message ด้านล่าง.
01.<%@taglib uri="/struts-tags" prefix="s" %>
02.<html>
03.<head>
04.<title>Hello World</title>
05.</head>
06.<body>
07.<h1><s:property value="message" /></h1>
08.</body>
09.</html>

Demo After Run Application

























* ถ้าใครต้องการ demo application ให้ comment และฝาก email ไว้นะครับ ผมจะส่งให้ทาง email.