Thursday, September 26, 2013

Create Simple REST web service dengan Spring MVC + Maven


Sekilas tentang REST
REST, singkatan bahasa Inggris dari representational state transfer atau transfer keadaan representasi, adalah suatu gaya arsitektur perangkat lunak untuk untuk pendistibusian sistem hipermedia seperti WWW. Istilah ini diperkenalkan pertama kali pada tahun 2000 pada disertasi doktoral Roy Fielding, salah seorang penulis utama spesifikasi HTTP. Istilah ini selanjutnya dipergunakan secara luas pada komunitas jaringan.
REST secara spesifik merujuk pada suatu koleksi prinsip-prinsip arsitektur jaringan yang menggariskan pendefinisian dan pengalamatan sumber daya. Istilah ini sering digunakan dengan longgar untuk mendeskripsikan semua antarmuka sederhana yang menyampaikan data dalam domain spesifik melalui HTTP tanpa tambahan lapisan pesan seperti SOAP atau pelacakan sesimenggunakan cookie HTTP. Dua pengertian ini dapat menimbulkan konflik dan juga tumpang tindih. Dimungkinkan untuk merancang suatu sistem perangkat lunak besar sesuai dengan gaya arsitektur REST Fielding tanpa menggunakan HTTP dan tanpa berinteraksi dengan WWW. Juga dimungkinkan untuk merancang antarmuka XML+HTTP sederhana yang tidak mengikuti prinsip-prinsip REST, tapi sebaliknya mengikuti model dari RPC (remote procedure call). Perbedaan penggunaan istilah REST ini cukup menyebabkan permasalahan dalam diskusi-diskusi teknis.
Sistem yang mengikuti prinsip REST Fielding sering disebut sebagai "RESTful".
REST pada dasarnya setiap URL unik adalah representasi dari beberapa objek. Kita dapat memperoleh konten-konten objek tersebut menggunakan HTTP GET, untuk menghapusnya, kita dapat menggunakan POST, PUT, atau DELETE untuk memodifikasi objek (dalam praktiknya, kebanyakan service menggunakan POST untuk ini).
Kunci metodologi REST adalah untuk menulis web service menggunakan antarmuka yang sudah tersedia dan banyak digunakan: URI. Sebagai contoh, service/layanan untuk mengkonversi mata uang, yang mana seorang user memasukkan simbol mata uang untuk mengembalikan harga mata uang secara real-time, dapat dilakukan semudah membuat script yang dapat diakses melalui web server seperti URI:  http://www.ExampleCurrencyBrokerage.com/convert?=us-dollar&value=100&target=pound.
Aplikasi client atau server dengan dukungan HTTP dapat dengan mudah memanggil service tersebut dengan command HTTP GET. Berdasar pada bagaimana cara penyedia service menulis script, hasil respons HTTP kan menjadi lebih simpel seperti beberapa header standar dan string teks yang mengandung harga terkini untuk symbol yang diberikan. Atau, dapat berupa dokumen XML.
(dikutip dari Wikipedia  )

Pada tulisan kali ini akan kita coba membuat REST webservice menggunakan framework Spring MCV dan Maven.
IDE yang digunakan adalah Spring Tools Suite. Jika belum ada dapat didownload disini …link.
IDE ini memudahkan kita membuat aplikasi Spring MVC karena sudah tersedia plugin nya dan kita tidak perlu susah dalam mengimport library spring yang akan digunakan. IDE ini akan mencreate pom.xml sudah lengkap dengan dependency library dari spring mvc. Dependency library akan otomatis didownload begitu project di create.

Langkah pertama, buat spring mvc project dari spring tools suite. Pilih New -> Spring Project.



Maka otomatis akan tercreate project dengan struktur maven seperti dibawah ini.


Pom.xml akan otomatis tercreate lengkap dengan dependency nya.

 <?xml version="1.0" encoding="UTF-8"?>  
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  
      <modelVersion>4.0.0</modelVersion>  
      <groupId>com.sample</groupId>  
      <artifactId>springmvc</artifactId>  
      <name>sample-spring-mvc-rest</name>  
      <packaging>war</packaging>  
      <version>1.0.0-BUILD-SNAPSHOT</version>  
      <properties>  
           <java-version>1.6</java-version>  
           <org.springframework-version>3.2.0.RELEASE</org.springframework-version>  
           <org.aspectj-version>1.6.10</org.aspectj-version>  
           <org.slf4j-version>1.6.6</org.slf4j-version>  
      </properties>  
      <dependencies>  
           <!-- Spring -->  
           <dependency>  
                <groupId>org.springframework</groupId>  
                <artifactId>spring-context</artifactId>  
                <version>${org.springframework-version}</version>  
                <exclusions>  
                     <!-- Exclude Commons Logging in favor of SLF4j -->  
                     <exclusion>  
                          <groupId>commons-logging</groupId>  
                          <artifactId>commons-logging</artifactId>  
                      </exclusion>  
                </exclusions>  
           </dependency>  
           <dependency>  
                <groupId>org.springframework</groupId>  
                <artifactId>spring-webmvc</artifactId>  
                <version>${org.springframework-version}</version>  
           </dependency>  
           <!-- AspectJ -->  
           <dependency>  
                <groupId>org.aspectj</groupId>  
                <artifactId>aspectjrt</artifactId>  
                <version>${org.aspectj-version}</version>  
           </dependency>       
           <!-- Logging -->  
           <dependency>  
                <groupId>org.slf4j</groupId>  
                <artifactId>slf4j-api</artifactId>  
                <version>${org.slf4j-version}</version>  
           </dependency>  
           <dependency>  
                <groupId>org.slf4j</groupId>  
                <artifactId>jcl-over-slf4j</artifactId>  
                <version>${org.slf4j-version}</version>  
                <scope>runtime</scope>  
           </dependency>  
           <dependency>  
                <groupId>org.slf4j</groupId>  
                <artifactId>slf4j-log4j12</artifactId>  
                <version>${org.slf4j-version}</version>  
                <scope>runtime</scope>  
           </dependency>  
           <dependency>  
                <groupId>log4j</groupId>  
                <artifactId>log4j</artifactId>  
                <version>1.2.15</version>  
                <exclusions>  
                     <exclusion>  
                          <groupId>javax.mail</groupId>  
                          <artifactId>mail</artifactId>  
                     </exclusion>  
                     <exclusion>  
                          <groupId>javax.jms</groupId>  
                          <artifactId>jms</artifactId>  
                     </exclusion>  
                     <exclusion>  
                          <groupId>com.sun.jdmk</groupId>  
                          <artifactId>jmxtools</artifactId>  
                     </exclusion>  
                     <exclusion>  
                          <groupId>com.sun.jmx</groupId>  
                          <artifactId>jmxri</artifactId>  
                     </exclusion>  
                </exclusions>  
                <scope>runtime</scope>  
           </dependency>  
           <!-- @Inject -->  
           <dependency>  
                <groupId>javax.inject</groupId>  
                <artifactId>javax.inject</artifactId>  
                <version>1</version>  
           </dependency>  
           <!-- Servlet -->  
           <dependency>  
                <groupId>javax.servlet</groupId>  
                <artifactId>servlet-api</artifactId>  
                <version>2.5</version>  
                <scope>provided</scope>  
           </dependency>  
           <dependency>  
                <groupId>javax.servlet.jsp</groupId>  
                <artifactId>jsp-api</artifactId>  
                <version>2.1</version>  
                <scope>provided</scope>  
           </dependency>  
           <dependency>  
                <groupId>javax.servlet</groupId>  
                <artifactId>jstl</artifactId>  
                <version>1.2</version>  
           </dependency>  
           <!-- Test -->  
           <dependency>  
                <groupId>junit</groupId>  
                <artifactId>junit</artifactId>  
                <version>4.7</version>  
                <scope>test</scope>  
           </dependency>      
      </dependencies>  
   <build>  
     <plugins>  
       <plugin>  
         <artifactId>maven-eclipse-plugin</artifactId>  
         <version>2.9</version>  
         <configuration>  
           <additionalProjectnatures>  
             <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>  
           </additionalProjectnatures>  
           <additionalBuildcommands>  
             <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>  
           </additionalBuildcommands>  
           <downloadSources>true</downloadSources>  
           <downloadJavadocs>true</downloadJavadocs>  
         </configuration>  
       </plugin>  
       <plugin>  
         <groupId>org.apache.maven.plugins</groupId>  
         <artifactId>maven-compiler-plugin</artifactId>  
         <version>2.5.1</version>  
         <configuration>  
           <source>1.6</source>  
           <target>1.6</target>  
           <compilerArgument>-Xlint:all</compilerArgument>  
           <showWarnings>true</showWarnings>  
           <showDeprecation>true</showDeprecation>  
         </configuration>  
       </plugin>  
       <plugin>  
         <groupId>org.codehaus.mojo</groupId>  
         <artifactId>exec-maven-plugin</artifactId>  
         <version>1.2.1</version>  
         <configuration>  
           <mainClass>org.test.int1.Main</mainClass>  
         </configuration>  
       </plugin>  
     </plugins>  
   </build>  
 </project>  

Kemudian kita buat dulu class entity yang nantinya kita pakai sebagai contoh data akan dimanipulasi oleh REST yang nanti kita buat.
Misalnya kita buat entity Student.

 public class Student {  
      private Integer id ;  
      private String firstName;  
      private String lastName;  
      private String address;  
      public Student(){  
      }  
      public Student(Integer id, String firstName, String lastName, String address) {  
           super();  
           this.id = id;  
           this.firstName = firstName;  
           this.lastName = lastName;  
           this.address = address;  
      }  
      // setter getter  

Selanjutnya kita buat class controller yang digunakan untuk menampung method method operation dari Rest.
Misalnya kita buat StudentController.

 @Controller  
 @RequestMapping("/student")  
 public class StudentController {  
      private List<Student> students = new ArrayList<Student>();  
      /**  
       * initial sample data student  
       */  
      private void initialStudent(){  
           students.add(new Student(1, "andri", "sasuke", "alamat 1"));  
           students.add(new Student(2, "susi", "susanti", "alamat 2"));  
           students.add(new Student(3, "budi", "setiawan", "alamat 3"));  
      }  
      /**  
       * sample update student  
       */  
      private void updateStudent(Student student){  
           students.get(student.getId()).setFirstName(student.getFirstName());  
           students.get(student.getId()).setLastName(student.getLastName());  
           students.get(student.getId()).setAddress(student.getAddress());  
      }  

Spring MVC menyediakan baberapa annotation untuk mengatur komunikasi Http

@Controller : Deklarasi Spring MVC Controller
@RequestMapping("/student") --> Map URI dengan controller atau method
@PathVariable --> membaca variable di Url dan mengirimkan nilainya ke class java
@RequestBody --> Deklarasi Pojo (entity) yang akan dikirim ke controller  
@ResponseBody --> Deklarasi Pojo (entity) untuk generate Json content yg akan dikirim ke http client

Kita tambahkan dulu dependency JSON mapper di pom.xml untuk generate JSON

 <dependency>  
    <groupId>org.codehaus.jackson</groupId>  
   <artifactId>jackson-mapper-asl</artifactId>  
   <version>1.7.1</version>  
 </dependency>  

Kita akan coba buat operasi Rest untuk Get, insert, update, delete data di StudentController.

1.       Method Get data
Menggunakan RequestMethod GET
 @RequestMapping(value="/findAll",method = RequestMethod.GET)  
      public @ResponseBody List<Student> getAllStudent(){  
           return students;  
      }  

2.       Method Insert
Menggunakan RequestMethod POST
 @RequestMapping(value="/add",method = RequestMethod.POST)  
      public @ResponseBody void addStudent(@RequestBody Student student){  
           // do something to add student  
           students.add(student);  
      }  

3.       Method Update
Menggunakan RequestMethod PUT
 @RequestMapping(value="/edit",method = RequestMethod.PUT)  
      public @ResponseBody void editStudent(@RequestBody Student student){  
           // do something to update student  
           updateStudent(student);  
      }  

 Method Delete
Menggunakan RequestMethod DELETE
 @RequestMapping(value="/delete/{id}",method = RequestMethod.DELETE)  
      public @ResponseBody void deleteStudent(@PathVariable(value="id") int id){  
           // do something to delete student  
           students.remove(id);  
      }  

Dengan demikian sample Rest web service kita sudah selesai, tinggal mengetesnya saja.

Test method Rest
Run terlebih dulu aplikasi yang sudah kita buat dengan menggunakan jetty -> mvn jetty:run 
Untuk melakukan testing pada Rest yang sudah kita buat bisa menggunakan addOns dari firefox : RestClient. (https://addons.mozilla.org/en-US/firefox/addon/restclient/)

Untuk method GET bisa juga kita coba langsung di browser bisa dengan mengakses Url nya.
Misalnya untuk menampilkan semua Student (http://localhost:8087/student/findAll)

Maka akan tampil output seperti dibawah ini
 [{"id":1,"firstName":"andri","lastName":"sasuke","address":"alamat 1"},{"id":2,"firstName":"susi","lastName":"susanti","address":"alamat 2"},{"id":3,"firstName":"budi","lastName":"setiawan","address":"alamat 3"}]  

Tapi untuk method POST atau PUT harus menggunakan RestClient atau semacamnya.
Untuk test POST data lewat RestClient kita set dulu parameter Content-Type:application/json.
Pilih Method : POST


Kemudian kita masukkan data student dalam format JSON di form Body.
 {"id":4,"firstName":"orang ke 4","lastName":"last name ke 4","address":"alamat 4"}  


Kita test lagi GET data, maka data student akan bertambah
 [{"id":1,"firstName":"andri","lastName":"sasuke","address":"alamat 1"},{"id":2,"firstName":"susi","lastName":"susanti","address":"alamat 2"},{"id":3,"firstName":"budi","lastName":"setiawan","address":"alamat 3"},{"id":4,"firstName":"orang ke 4","lastName":"last name ke 4","address":"alamat 4"}]  

Untuk PUT data prosesnya juga sama. Pilih Method : POST

Kemudian kita masukkan data student yang akan diupdate dalam format JSON di form Body.

 {"id":1,"firstName":"edit first name1","lastName":"edit last name ke 1","address":"alamat 1"}  


Kalau kita GET lagi maka data student akan berubah.

 [{"id":1,"firstName":"andri","lastName":"sasuke","address":"alamat 1"},{"id":2,"firstName":"edit first name1","lastName":"edit last name ke 1","address":"alamat 1"},{"id":3,"firstName":"budi","lastName":"setiawan","address":"alamat 3"},{"id":4,"firstName":"orang ke 4","lastName":"last name ke 4","address":"alamat 4"}]  

Untuk delete data kita menggunakan @PathVariable untuk mengambil value dari Url misalnya id




Kita GET data lagi maka data dengan index ke-1 akan terdelete

 [{"id":1,"firstName":"andri","lastName":"sasuke","address":"alamat 1"},{"id":3,"firstName":"budi","lastName":"setiawan","address":"alamat 3"},{"id":4,"firstName":"orang ke 4","lastName":"last name ke 4","address":"alamat 4"}]  

Sekian dulu. Mudah dan simple kan buat Rest web service itu. 
Selamat mencoba 
Thanks :)


Hitung radius antar 2 Latitutude dan Longitude di SQL query posgresql


Untuk menghitung jarak atau radius 2 lokasi Latitude dan Longitude dalam kilometer (km) di postgresql dapat menggunakan query berikut ini :

 SELECT ( 6371 * acos( cos( radians( LAT1 ) ) * cos( radians( LAT2 ) ) * cos( radians( LONG@ )   
 - radians(LAT1) ) + sin( radians( LONG1 ) ) * sin( radians( LAT2 ) ) ) ) as KM ;  

Misalnya kita punya 2 lokasi:
1. lat/lng ( 5.207654 / 96.695329 )
2. lat/lng ( -6.32479/ 107.322441)

 SELECT ( 6371 * acos( cos( radians( 5.207654 ) ) * cos( radians( -6.32479 ) ) * cos( radians( 107.322441 )   
 - radians(96.695329) ) + sin( radians(5.207654) ) * sin( radians( -6.32479 ) ) ) ) as KM ;  

Maka hasil radius yang didapat adalah :

1742,39355699897 km

Selamat mencoba. :)

Perintah untuk Drop All Table di Postgresql

Jika kita ingin melakukan drop semua table di postgres terkadang agak sulit dilakukan, karena prostgre tidak menyediakan satu perintah untuk melakukan drop semua table.
Cara yang dapat dilakukan mungkin delete table satu persatu. Klik kanan pada tabel, kemudian pilib drop.
Tapi kadang sering error atau gagal delete, karena tabel itu mungkin ada dependency nya dengan tabel lain.
Misalnya salah satu field di tabel itu digunakan sebagai foreign key di tabel lain. Sehingga kita harus mendelete terlebih dahulu tabel yg memakai foreign key itu.
Tapi kalau tabelnya banyak jadi merepotkan juga.

Ada salah satu trik untuk mendelete semua tabel di database. Yakni membuat script drop tabel memakai sql query. Berikut ini scriptnya :

 select 'drop table "' || tablename || '" cascade;' as command   
 from pg_tables where schemaname = 'public';   

'public' ada nama schema yg kita ingin drop semua tabelnya.

Maka hasilnya adalah sebagai berikut :

 drop table "brand" cascade;  
 drop table "demands_files" cascade;  
 drop table "ip_type" cascade;  
 drop table "locations" cascade;  
 drop table "ip_history" cascade;  
 drop table "ip_list" cascade;  
 drop table "division" cascade;  
 drop table "developers" cascade;  
 drop table "material_elements" cascade;  
 drop table "device" cascade;  
 drop table "ip_region" cascade;  
 drop table "files_design" cascade;  
 drop table "files" cascade;  
 drop table "material_types" cascade;  
 drop table "partners" cascade;  
 drop table "typeproject" cascade;  
 drop table "regional_telkomsel" cascade;  
 drop table "telkom_divisions" cascade;  
 drop table "roles" cascade;  
 drop table "users" cascade;  
 drop table "material_list" cascade;  
 drop table "users_roles" cascade;  
 drop table "demand_status" cascade;  
 drop table "demands_estimates" cascade;  
 drop table "demands" cascade;  
 drop table "stos" cascade;  

Copy paste hasil query nya. Kemudian di run semua querynya.  Maka otomatis semua tabel akan terhapus atau terdrop.
Selamat mencoba :)


Monday, September 23, 2013

Logika sederhana - swap 2 variabel integer (angka) tanpa menggunakan variable temp

Bila ada suatu kasus kita ingin menswap atau menukar 2 variabel yg isinya angka terkadang kita harus menggunakan variable  tambahan atau variable temp.
Misalnya contoh codenya seperti ini, maaf kalo code nya pake java. :)


 void swap (int bil1, int bil2){  
 int temp;  
 temp= bil1;  
 bil1= bil2;  
 bil2= temp;  
 }  

Penjelasannya code diatas ;
Misal bil1 = 10 , bil2 =7;
temp = 10,
bil1= 7,
bil2= 10.
Maka bil1 dan bil2 sudah tertukar.

Tapi bagaimana jika untuk melakuakn swap 2 bilangan tidak boleh menggunakan variable temp atau variable tambahan lain.

Sebenarnya ada sedikit trik untuk menukar bil1 dan bil2 tanpa tambahan variable. Memakai operasi penjumlahan dan pengurangan.
Mari kita lihat contohnya.

 void swap (int bil1, int bil2){  
 System.out.println("before swap bil1 "+bil1);  
           System.out.println("before swap bil2 "+bil2+"\n");  
           bil1= bil1+ bil2;  
          
           bil2=bil1-bil2;  
           bil1=bil1-bil2;  
           System.out.println("after swap bil1 "+bil1);  
           System.out.println("after swap bil2 "+bil2);  
 }  

Penjelasannya seperti ini  
Misal bil1 =10 , bil2 =7
Pertama2 ;  bil1 diisi penjumlahan bil1 + bil2 ( 10+7 =17)
Selanjutnya bil2 diisi bil1 yg sudah diisi penjumlahan dikurang bil2 ( 17-7=10)
Terakhir bil1 diisi bil1 yg lama dikurangi bil2 (17-10=7)
Maka kedua bilangan tersebut otomatis tertukar bil1=7, bil2=10
Code diatas mungkin hanya bisa dilakukan jika variabelnya integer atau angka.
tidak akan bisa untuk menswap 2 buah string Misalnya.

Selamat mencoba trik diatas. :)

Saturday, September 7, 2013

Dependency Injection di Android menggunakan RoboGuice

RoboGuice adalah sebuah framework untuk Dependency Injection di Android. Roboguice membuat code kita jadi lebih simple dan lebih mudah.
RoboGuice dapat melakukan inject View, Resource, System Service atau object lain.

Pada tutorial ini saya ingin menjelaskan sekilas saja contoh penggunaannya.
Langkah pertama download library jar RoboGuice terlebih dulu. pada contoh ini menggunakan roboguice versi 2.0

Library jar pendukung yg diperlukan adalah :
  1. Guice.3.0-no_aop.jar  : https://github.com/roboguice/roboguice/tree/master/roboguice/lib
  2. Roboguice-2.0.jar :  http://repo1.maven.org/maven2/org/roboguice/roboguice/2.0/
  3. Javax.inject-1.jar : http://mvnrepository.com/artifact/javax.inject/javax.inject


Import semua jar tersebut ke dalam forlder ‘libs’ android project kita.

Mungkin dengan banyaknya element (misal : TextView, InputText, Button dll )  yg kita gunakan di sebuah Activity akan membuat kita lebih banyak juga menuliskan code untuk casting findById().
Misalnya : (TextView)   findById(R.id.text_name);
Jika tidak dilakukan hal ini maka element yg kita panggil nanti akan null.
Mungkin jika cuma beberapa tidak masalah. Tapi jika sudah banyak sekali jumlahnya jadi membosankan juga ngetiknya.
Roboguice bisa menjembatani hal ini. 

Mari kita lihat contoh dari code yg default tanpa Injection.

 class TestAtivity extends Activity {   
    TextView name;   
    ImageView thumbnail;   
    LocationManager loc;   
    Drawable icon;   
    String myName;   
    public void onCreate(Bundle savedInstanceState) {   
      super.onCreate(savedInstanceState);   
      setContentView(R.layout.main);  
      name   = (TextView) findViewById(R.id.name);   
      thumbnail = (ImageView) findViewById(R.id.thumbnail);   
      loc    = (LocationManager) getSystemService(Activity.LOCATION_SERVICE);   
      icon   = getResources().getDrawable(R.drawable.icon);   
      myName  = getString(R.string.app_name);   
      name.setText( "Hello, " + myName );   
    }   
  }   

Sekarang kita lihat code yg menggunakan roboguice Injection.

 class TestActivity extends RoboActivity {   
    @InjectView(R.id.name)       TextView name;   
    @InjectView(R.id.thumbnail)    ImageView thumbnail;   
    @InjectResource(R.drawable.icon)  Drawable icon;   
    @InjectResource(R.string.app_name) String myName;   
    @Inject              LocationManager loc;   
    public void onCreate(Bundle savedInstanceState) {   
      super.onCreate(savedInstanceState);   
      setContentView(R.layout.main);  
      name.setText( "Hello, " + myName );   
    }   
  }   

Code yg menggunakan RoboGuice jadi lebih pendek dan sederhana. Baris codenya jadi lebih pendek. Mungkin ini bisa menghemat waktu kita dalam mengetik code.

Langkahnya cukup simple Activity yg kita buat tinggal extendnya kita ubah ke RoboActivity.
Kemudian di deklarasi elementnya ditambahkan @InjectView(id). Id ini diambil dari R id element yg sudah kita buat di layout xml.
Misalnya :  @InjectView(R.id.name) TextView name;

Maka di dalam method onCreate() kita tidak perlu lagi casting findById().
Kita bisa langsung memanggil element itu tanpa takut nilainya null. Misalnya ; name.setText( "Hello, " + myName );
Karena sudah dihandle oleh RoboGuice.

Sekian dulu tutorial dari saya. Mungkin hanya sampai pada injectView saja. Untuk bagian selanjutnya akan saya jelaskan di tutorial selanjutnya.
Untuk penjelasan yang lebih lengkap bisa juga dilihat di https://github.com/roboguice/roboguice/wiki

Selamat mencoba.

Thanks. :)

Friday, September 6, 2013

Cara Konfigurasi Tomcat server di Eclipse

Tulisan ini menjelaskan bagaimana menambahkan web server Tomcat ke IDE eclipse.
Dengan demikian kita bisa langsung mendeploy web aplikasi kita ke Tomcat langsung dari eclipse.
Tomcat yang digunakan dalam tutorial ini adalah Tomcat versi 7.0
Untuk memulai kita harus mempersiapkan environment nya dulu.
Download terlebih dahulu IDE eclipse dan Tomcat 7.0
  1.  Eclipse IDE for Java EE Developers (file berbentuk .zip). link
  2.   Apache Tomcat 7 (download yang archive file zip , jangan download yg installer .exe). link
  3.  Ekstraks Eclipse dan Tomcat ke folder tertentu.

Berikut ini adalah langkah langkah yang dilakukan
Buka eclipse, kemudial buka “Servers” tab yang ada di bagian bawah.
Jika belum ada aktifkan dengan cara pilih di menu bar atas : Window -> show view -> Server


Klik kanan di dalam Servers tab, new -> server. Atau dari menu utama File -> New -> Other -> Server


Di Form New Server  pilih : Apache -> Tomcat v.7.0 Server.
Masukkan alamat hostnya, karena ini di dalam computer kita alamatnya biarkan saja localhost.
Masukkan juga Server Name. Klik next.



Di Form selanjutnya masukkan direktori hasil ekstrak tomcat 7 yang sudah didownload tadi.
Pilih juga JRE yg dipakai. Klik Finish.


Untuk start Tomcat  nya. Di bagain Servers tab klik kanan pada Tomcat v.7.0 server , pilih Start.


Buka web browser . Masukkan url http://localhost:8080.  Maka akan tampil halaman home tomcat.



Tapi jika di bwoser tampil error 404 “requested resource is not available”. Kita harus mengubah dulu lokasi tomcat nya.


Di Servers Tab klik kanan di Tomcat servernya pilih properties. Maka akan tampil window properties.
Klik Switch Location. Kemudian Apply










Double klik pada tomcat server makan akan muncul halaman Overview. Di bagian Server Location pilih radio button : User Tomcat installation (takes control of tomcat installation).

Save konfigurasi (Ctrl + S)
Restart tomcat Server (Klik kanan di tomcat server, pilih restart)
Buka kembali browser yang tadi, maka akan tampil halaman tomcat home.
Dengan demikian kita sudah berhasil menambahkan tomcat server ke IDE eclipse.

Untuk run aplikasi kita di tomcat ini. Pilih salah satu aplikasi di tab Project.
Klik kanan pilih Run As -> Run on Server. Maka otomatis aplikasi kita akan di jalankan di tomcat nya.



Selamat mencoba. semoga berguna.
Terima Kasih. J


Saturday, August 20, 2011

Waktu Nayla

oleh : Djenar Maesa Ayu

Dimuat di Kompas (03/31/2002)
dikutip dari : kompasiana.com

************
NAYLA melirik arloji di tangan kanannya. Baru jam lima petang. Namun, langit begitu hitam. Matahari sudah lama tenggelam. Ia menjadi muram seperti cahaya bulan yang bersinar suram. Hatinya dirundung kecemasan. Apakah jam tangannya mati? Lalu jam berapa sebenarnya sekarang? Nayla memeriksa jam di mobilnya. Juga jam lima petang. Jam pada ponselnya pun menunjukkan jam lima petang. Ia memijit nomor satu nol tiga.

Terdengar suara operator dari seberang, “Waktu menunjukkan pukul tujuh belas, nol menit, dan dua puluh tiga detik.” Lalu manakah yang lebih benar. Penunjuk waktu atau gejala alam? Nayla menambah kecepatan laju mobilnya. Kemudi di tangannya terasa licin dan lembab akibat telapak tangannya yang mulai basah berkeringat. Ia harus menemukan seseorang untuk memberinya informasi waktu yang tepat. Tapi jika Nayla berhenti dan bertanya, berarti ia akan kehilangan waktu. Sementara masih begitu jauh jarak yang harus dilampaui untuk mencapai tujuan. Nayla sangat tidak ingin kehilangan waktu. Seperti juga ia tidak ingin kehilangan kesempatan untuk melakukan banyak hal yang belum sempat ia kerjakan.

Namun Nayla pada akhirnya menyerah. Ia menepi dekat segerombolan anak-anak muda yang sedang nongkrong di depan warung rokok dan menanyakan jam kepada mereka. Tapi seperti yang sudah Nayla ramalkan sebelumnya, jawaban dari mereka adalah sama, jam lima petang. Hanya ada sedikit perbedaan pada menit. Ada yang mengatakan jam lima lewat lima, jam lima lewat tiga, dan jam lima lewat tujuh. Nayla semakin menyesal telah membuang waktu untuk sebuah pertanyaan konyol yang sudah ia yakini jawabannya, yaitu jam lima petang. Berarti benar ia masih punya banyak waktu. Sebelum jam tangannya berubah jadi sapu, mobil sedannya berubah jadi labu, dan dirinya berubah menjadi abu. ***

ENTAH kapan persisnya Nayla mulai tidak bersahabat dengan waktu. Waktu bagaikan seorang pembunuh yang selalu membuntuti dan mengintai dalam kegelapan. Siap menghunuskan pisau ke dadanya yang berdebar. Debaran yang sudah pernah ia lupakan rasanya. Debaran yang satu tahun lalu menyapanya dan mengulurkan persahabatan abadi, hampir abadi, sampai ketika sang pembunuh tiba-tiba muncul dengan sebilah belati. Sebelumnya Nayla begitu akrab dengan waktu. Ketika cincin melingkar agung di jari manisnya. Ketika tendangan halus menghentak dinding perutnya. Menyusui. Memandikan bayi. Bercinta malam hari. Menyiapkan sarapan pagi-pagi sekali. Rekreasi. Mengantar anak ke sekolah. Membantu mengerjakan pekerjaan rumah. Memarahi pembantu. Membuka album foto yang berdebu. Mengiris wortel. Pergi ke dokter. Menelepon teman-teman. Berdoa di dalam kegelapan. Doa syukur atas kehidupan yang nyaris sempurna. Kehidupan yang selama ini ia idam-idamkan. Kala itu, waktu adalah pelengkap, sebuah sarana. Mempermudah kegiatannya sehari-hari. Menuntunnya menjadi roda kebahagiaan keluarga. Mengingatkan kapan saatnya menabur bunga di makam orang tua, kakek, nenek dan leluhur. Membeli hadiah Natal, ulang tahun dan hari kasih sayang. Mengirim pesan sms kepada si pencari nafkah supaya tidak terlambat makan. Memperkirakan lauk apa yang lebih mudah dimasak supaya tidak terlambat menjemput anak di tempat les. Bercinta berdasarkan sistem kalender, kapan sperma baik untuk dimasukkan dan kapan lebih baik dikeluarkan di luar. Waktu bukanlah sesuatu yang patut diresahkan. Karena waktu yang berjalan, hanyalah roda yang berputar tiga ribu enam ratus detik kali dua puluh empat jam. Gerakan mekanis rutinitas kehidupan. Menggelinding di atas jalan bebas hambatan. Sementara banyak yang sudah terlupakan. Suara mesin tik membahana dalam kamar yang lengang. Riuh rendah suara karyawan di kafetaria gedung perkantoran. Ngeceng di Plaza Senayan. Mengeluh bersama sahabat tentang cinta yang bertepuk sebelah tangan. Menampar pipi laki-laki kurang ajar di diskotek. Menghapus air mata yang menitik. Melamun. Membaca stensilan. Makan nasi goreng kambing ramai-ramai dalam mobil di pinggir jalan. Masak Indomie rebus rasa kari ayam. Menatap matahari terbenam. Nonton Formula One atau Piala Dunia di Sports Bar. Menatap mata kekasih dengan berbinar-binar. Bersentuhan tangan ketika memasangkan celemek di paha kekasih dengan tangan bergetar. Menanti dering telepon dengan hati berdebar. Memilih kartu ucapan rindu yang tidak terlalu norak tanpa lebih dulu menunggu hari besar datang dengan dada berdebar. Memilih baju terbaik setiap ada janji dengan pacar dengan jantung berdebar. Menanti pujian dengan rasa berdebar. Bercinta dengan rasa, jantung, dada, hati, tangan, kaki, payudara, vagina, leher, punggung, ketiak, mata, hidung, mulut, pipi, raga, berdebar. Yang terlupakan adalah waktu yang mengalir dalam lautan debar, samudera getar, cakrawala harapan. ***

MUNGKIN Nayla tidak bermaksud dengan sengaja melupakan, ia hanya tidak sadar. Ia hanya pingsan keletihan dan belum jua siuman. Ia hanya terhipnotis bandul jam yang bergerak kiri kanan dan berdetak dalam keteraturan. Membuat raganya beku. Lidahnya kelu. Hatinya membatu. Imajinasinya buntu. Kadang dalam tidur imajinasinya memberontak terbang. Mengepakkan sayap bersama dengan burung-burung dan kupu-kupu. Mengendarai ikan paus di samudera lepas. Bungy jumping. Arung jeram. Baca komik Petualangan Tintin. Minum teh di atas awan sambil diskusi tentang cerpen Anton Chekov dengan almarhum ayah dan bertanya mana yang lebih mahal antara berlian dengan Fancy Diamond kepada almarhumah ibu. Menjadi Arnold Schwarzeneger dan menggagalkan aksi teroris yang hendak menabrakkan pesawat ke gedung World Trade Center. Menelan biji durian. Makan rambutan. Nonton Cirque du Soleil. Nonton N’SYNC dan dipanggil ke atas panggung untuk diberi kecupan oleh Justin Timberlake. Bertinju dengan Moehammad Ali. Mengalahkan Michael Jordan. Merebut suami Victoria Beckham. Mengedit karya Gabrielle Garcia Marques. Minum sirup markisa. Baca puisi bareng Presiden Penyair Sutardji Calzoum Bachri. Diculik UFO. Punya toko buku kecil di Taman Ismail Marzuki. Melaju kencang ke pusat getaran yang mendebarkan. Tapi mimpi juga terbatas waktu. Debaran itu mendadak buyar ketika terdengar suara ketukan pembantu di pintu luar kamar. Suara kokok ayam jantan. Kicau burung. Kemilau sinar matahari menerobos jendela. Dan suara alarm jam ketika jarum panjangnya menunjuk angka dua belas dan jarum pendeknya menunjuk angka enam. Suara alarm itu, adalah suara yang sama dengan suara dokter yang menyampaikan bahwa sudah terdeteksi sejenis kanker ganas pada ovariumnya. Suara alarm itu, adalah suara yang sama dengan suara dokter yang memvonis umur Nayla hanya akan bertahan maksimal satu tahun ke depan. Suara alarm itu, adalah suara yang sama dengan suara dokter yang mengatakan bahwa sudah tidak ada harapan untuk sembuh. Suara alarm itu, adalah suara yang menyadarkannya kembali dari pengaruh hipnotis bandul waktu masa lalu, masa kini dan masa depan. ***

MANUSIA sudah menerima hukuman mati tanpa pernah tahu kapan hukuman ini akan dilaksanakan. Karena itu Nayla tidak tahu mana yang lebih layak, merasa terancam atau bersyukur. Di satu sisi ia sudah tidak perlu lagi bertanya-tanya kapan eksekusi akan dilaksanakan. Tapi apakah setahun yang dokter maksudkan adalah 12 bulan, 52 minggu dan 365 hari dari sekarang? Bagaimana kalau satu tahun dimulai dari ketika kanker itu baru tumbuh. Atau satu minggu sebelum Nayla datang ke dokter. Atau mungkin benar-benar pada detik ketika dokter itu mengatakan satu tahun. Lalu berapa lamakah waktu sudah terbuang? Dari manakah Nayla harus mulai berhitung? Mata Nayla berkunang-kunang. Perutnya mulai terasa sakit seiring dengan bunyi dari segala bunyi jam, berdetak keras memekakkan telinganya. Satu, sepuluh, seratus, seribu, sepuluh ribu, seratus ribu, sejuta detik mengejar dan mengepung pendengarannya ke mana pun Nayla melangkah. Memaksa mata Nayla menyaksikan lalu lalang kaki-kaki bergegas, suara klakson dari pengendara yang tak sabaran, lonceng tanda masuk sekolah, jutaan tangan karyawan memasukkan kartu ke dalam mesin absen, aksi dorong mendorong masuk ke dalam bus, tubuh-tubuh meringkuk di atas atap kereta api, semua orang tidak mau ketinggalan. Semua orang harus tepat waktu sampai di tujuan. Semua orang tidak lagi punya kesempatan, untuk sekadar berhenti memandang embun sebelum menitik ke tanah. Matahari yang bersinar tidak terlalu cerah. Awan berbentuk mutiara, semar atau gajah. Kelopak bunga mulai merekah. Kaki anjing pincang sebelah. Semut terinjak-injak hingga lebur dengan tanah. Padi menguning di sawah. Burung bercinta di atas rumah. Semua orang melangkah bagai tidak menjejak tanah. Sejak saat itu, alarm Nayla tidak pernah berhenti berbunyi. ***

NAYLA ingin menunda waktu. Nayla ingin mengulur siang hingga tidak kunjung tiba malam. Nayla ingin merampas bulan supaya matahari selalu bersinar. Nayla ingin menghantamkan palu ke arah jam hingga suara alarmnya bungkam. Nayla ingin menunda kematian. Tapi Nayla selalu terlambat. Nayla selalu berada di pihak yang lemah dan kalah akan rutinitas yang tak mau menyerah. Dan ia mulai merasa kewajibannya sebagai beban. Ia mulai cemburu pada orang-orang yang masih dapat berjalan santai sambil berpegangan tangan. Atau orang-orang yang berjemur di tepi kolam renang sambil membaca koran. Ketika, ia tergesa-gesa menyiapkan air hangat, sarapan dan seragam. Berdesakan di antara hiruk pikuk suara dan keringat dalam pasar. Memastikan pendingin ruangan belum saatnya dibersihkan. Membayar iuran telepon dan listrik bulanan. Memberi makan ikan. Memberi peringatan berkali-kali pada pembantu yang tidak juga mengerjakan perintah yang sudah diinstruksikan. Mengikuti senam seks dan kebugaran. Menjadi pendengar yang baik bagi suami yang berkeluh-kesah tentang pekerjaan. Memutar otak untuk memenuhi kebutuhan sandang pangan dalam sebulan. Menyimpan kekecewaan ketika anak sudah tidak lagi mau mengikuti nasihat yang seharusnya diindahkan. Dan masih saja ada yang kurang. Masih ada saja yang tidak sempurna. Sarang laba-laba di atas plafon. Terlalu banyak menggunakan jasa telepon. Buah dada yang mulai mengendur. Vagina yang tidak lagi lentur. Terlalu letih hingga tidur mendengkur. Seragam sekolah yang luntur. Kurang becus mengatur keuangan. Terlalu banyak pemborosan. Kurang peka. Kurang perhatian. Kurang waktu…. Waktu… Waktu… Waktu… Waktu……………….? Bahkan Nayla merasa sudah tidak punya waktu untuk sekadar memanjakan perasaan. Tidak nongkrong bersama teman-teman. Tidak belanja perhiasan. Tidak pergi ke klab malam. Tidak dalam sehari membaca buku lebih dari dua puluh halaman. Tidak lagi nonton film layar lebar di studio twenty one. Tidak lagi mengerjakan segala sesuatu yang baginya dulu merupakan kesenangan. Nayla mulai merasakan dadanya berdebar. Semangatnya bergetar. Ia ingin menampar suaminya jika membela anaknya yang kurang ajar. Ia ingin ngebut tanpa mengenakan sabuk pengaman. Ia ingin bersendawa keras-keras di depan mertua dan ipar-ipar. Ia ingin berjemur di tepi pantai dengan tubuh telanjang. Ia ingin mengatakan ia senang bercinta dengan posisi dari belakang. Ia ingin mewarnai rambutnya bak Dennis Rodman. Ia ingin berhenti minum jamu susut perut dan sari rapet. Ia ingin memelihara anjing, kucing, babi, penguin, panda dan beruang masing-masing satu pasang. Ia ingin makan soto betawi sekaligus dua mangkok besar. Ia ingin berhenti hanya makan sayur dan buah-buahan waktu malam. ***

APA yang sedang mengkhianati dirinya hingga ia merasa sama sekali tidak bersalah atas debaran di dadanya yang begitu memukau? Apa yang sedang memberi pengakuan sehingga ia merasa begitu lama membuang-buang waktu? Apakah hidup diberikan supaya manusia tidak punya pilihan selain berbuat baik? Dan mengapa pertanyaan ini baru datang ketika sang algojo waktu sudah mengulurkan tangan? Mungkin hidup adalah ibarat mobil berisikan satu tanki penuh bahan bakar. Ketika sang pengendara sadar bahan bakarnya sudah mulai habis, ia baru mengambil keputusan perlu tidaknya pendingin digunakan, untuk memperpanjang perjalanan, untuk sampai ke tujuan yang diinginkan. Nayla memacu laju mobilnya semakin kencang. Memburu kesempatan untuk bersimpuh memohon pengampunan atas dosa-dosa yang Nayla sesali tidak sempat ia lakukan, sebelum jam tangannya berubah jadi sapu, mobil sedannya berubah jadi labu, dan dirinya berubah jadi abu…***