Tulisan ini sekedar langkah awal untuk membuat aplikasi web di Scala. Untuk saat ini, baru berupa pembuatan servlet sederhana. Tujuan dari tulisan ini sebenarnya hanya memberikan dasar-dasar serta rangkaian cara kerja dalam pembuatan aplikasi web menggunakan Scala (http://www.scala-lang.org) dan sbt (simple build tool – versi lama yang saya gunakan adalah versi 0.7.7 di http://code.google.com/p/simple-build-tool/). Tulisan ini merupakan elaborasi dari artikel blog yang dibuat oleh Chee Seng di http://chuacheeseng.blogspot.com/2011/05/learning-scala-hello-world-web-app-with.html).
Software yang digunakan:
- Scala (2.9.0, http://www.scala-lang.org)
- sbt (0.7.7, http://code.google.com/p/simple-build-tool/)
Koneksi Internet diperlukan untuk mengambil paket-paket yang diperlukan.
Pada dasarnya, untuk membuat aplikasi web di Scala, yang diperlukan adalah coding aplikasi web tersebut menggunakan Scala dan menjalankannya menggunakan Jetty. Jika dikehendaki, aplikasi yang sudah dibuat tersebut bisa dipaketkan dalam format WAR (Web Archive) yang bisa di-deploy di berbagai application server yang mendukung API servlet dan JSP (Servlet/JSP container) seperti Tomcat, Resin, dan lain-lain.
Untuk yang pertama, kita akan membuat aplikasi web di direktori intro dan menjalankannya untuk menampilkan satu tulisan menggunakan servlet yang dijalankan oleh Jetty. Langkah pertama, silahkan membuat direktori intro:
[bpdp@bpdp-arch web]$ cd intro/ [bpdp@bpdp-arch intro]$ ls -la total 8 drwxr-xr-x 2 bpdp users 4096 Jun 11 23:02 . drwxr-xr-x 4 bpdp users 4096 Jun 11 23:02 .. [bpdp@bpdp-arch intro]$
Setelah itu, buat proyek menggunakan sbt:
[bpdp@bpdp-arch intro]$ sbt Project does not exist, create new project? (y/N/s) y Name: Introduction to Servlet using Scala Organization: bpdp.name Version [1.0]: Scala version [2.9.0]: sbt version [0.7.7]: Getting net.java.dev.jna jna 3.2.3 ... :: retrieving :: org.scala-tools.sbt#boot-app confs: [default] 1 artifacts copied, 0 already retrieved (838kB/27ms) Getting Scala 2.7.7 ... :: retrieving :: org.scala-tools.sbt#boot-scala confs: [default] 2 artifacts copied, 0 already retrieved (9911kB/50ms) Getting org.scala-tools.sbt sbt_2.7.7 0.7.7 ... :: retrieving :: org.scala-tools.sbt#boot-app confs: [default] 17 artifacts copied, 0 already retrieved (4379kB/51ms) [success] Successfully initialized directory structure. Getting Scala 2.9.0 ... :: retrieving :: org.scala-tools.sbt#boot-scala confs: [default] 4 artifacts copied, 0 already retrieved (20442kB/64ms) [info] Building project Introduction to Servlet using Scala 1.0 against Scala 2.9.0 [info] using sbt.DefaultProject with sbt 0.7.7 and Scala 2.7.7 >
sbt akan menanyakan nama proyek, organisasi, versi, versi Scala dan sbt yang digunakan, setelah itu akan membuat berbagai rangka struktur direktori, mengambil komponen dari Internet, serta mengisinya dengan berbagai file dan komponen yang diperlukan. Hasilnya adalah sebagai berikut:
[bpdp@bpdp-arch intro]$ tree . . |-- lib |-- project | |-- boot | | |-- other | | | `-- net.java.dev.jna | | | `-- jna | | | `-- 3.2.3 | | | `-- jna-3.2.3.jar | | |-- sbt.boot.lock | | |-- scala-2.7.7 | | | |-- lib | | | | |-- scala-compiler.jar | | | | `-- scala-library.jar | | | `-- org.scala-tools.sbt | | | `-- sbt | | | `-- 0.7.7 | | | |-- classpath_2.7.7-0.7.7.jar | | | |-- compile_2.7.7-0.7.7.jar | | | |-- compiler-interface-bin_2.7.7.final | | | | `-- compiler-interface-bin-0.7.7.jar | | | |-- compiler-interface-bin_2.8.0.final | | | | `-- compiler-interface-bin-0.7.7.jar | | | |-- compiler-interface-bin_2.8.1.final | | | | `-- compiler-interface-bin-0.7.7.jar | | | |-- compiler-interface-bin_2.9.0.final | | | | `-- compiler-interface-bin-0.7.7.jar | | | |-- compiler-interface-src | | | | |-- compiler-interface-src-0.7.7.jar | | | | `-- jline-0.9.94.jar | | | |-- control_2.7.7-0.7.7.jar | | | |-- io_2.7.7-0.7.7.jar | | | |-- ivy-2.2.0.jar | | | |-- ivy_2.7.7-0.7.7.jar | | | |-- jsch-0.1.31.jar | | | |-- launcher-interface-0.7.7.jar | | | |-- sbt_2.7.7-0.7.7.jar | | | |-- test-interface-0.5.jar | | | `-- xsbti | | | `-- interface-0.7.7.jar | | |-- scala-2.9.0 | | | `-- lib | | | |-- jansi.jar | | | |-- jline.jar | | | |-- scala-compiler.jar | | | `-- scala-library.jar | | `-- update.log | `-- build.properties |-- src | |-- main | | |-- resources | | `-- scala | `-- test | |-- resources | `-- scala `-- target28 directories, 27 files [bpdp@bpdp-arch intro]$
Langkah berikutnya adalah mendefinisikan build yang akan digunakan untuk mengelola aplikasi web ini dari sbt. Definisi ini diletakkan di project/build/ dengan nama file bebas, biasanya NamaProyekBuild.scala. Secara default, belum ada direktori build sehingga harus dibuat terlebih dahulu:
[bpdp@bpdp-arch intro]$ cd project/ [bpdp@bpdp-arch project]$ ls -la total 16 drwxr-xr-x 3 bpdp users 4096 Jun 11 23:03 . drwxr-xr-x 6 bpdp users 4096 Jun 11 23:03 .. drwxr-xr-x 5 bpdp users 4096 Jun 11 23:03 boot -rw-r--r-- 1 bpdp users 220 Jun 11 23:03 build.properties [bpdp@bpdp-arch project]$ mkdir build [bpdp@bpdp-arch project]$
Di dalam direktori build tersebut, buat file IntroBuild.scala sebagai berikut:
import sbt._class IntroBuild(info: ProjectInfo) extends DefaultWebProject(info) { val jetty6 = "org.mortbay.jetty" % "jetty" % "6.1.26" % "test" val servletApi = "javax.servlet" % "servlet-api" % "2.5" }
Catatan: IntroBuild.scala adala source code Scala. Di file tersebut kita definisikan jenis proyek (DefaultWebProject) serta komponen utama untuk membangun proyek tersebut: jetty6 (saya menggunakan versi 6.1.26) dan servlet-api (versi 2.5).
Setelah itu, dari prompt sbt (>) ketikkan reload (untuk me-reload definisi proyek) diikuti dengan update (untuk mengambil komponen utama proyek):
> reload [info] Recompiling project definition... [info] Source analysis: 1 new/modified, 0 indirectly invalidated, 0 removed. [info] Building project Introduction to Servlet using Scala 1.0 against Scala 2.9.0 [info] using IntroBuild with sbt 0.7.7 and Scala 2.7.7 > update [info] [info] == update == [info] downloading http://repo1.maven.org/maven2/org/mortbay/jetty/jetty/6.1.26/jetty-6.1.26.jar ... [info] [SUCCESSFUL ] org.mortbay.jetty#jetty;6.1.26!jetty.jar (6048ms) [info] downloading http://repo1.maven.org/maven2/org/mortbay/jetty/jetty-util/6.1.26/jetty-util-6.1.26.jar ... [info] [SUCCESSFUL ] org.mortbay.jetty#jetty-util;6.1.26!jetty-util.jar (1585ms) [info] :: retrieving :: bpdp.name#introduction-to-servlet-using-scala_2.9.0 [sync] [info] confs: [compile, runtime, test, provided, system, optional, sources, javadoc] [info] 4 artifacts copied, 0 already retrieved (933kB/39ms) [info] == update == [success] Successful. [info] [info] Total time: 17 s, completed Jun 11, 2011 11:16:52 PM >
Hasil dari komponen tersebut akan diletakkan di direktori lib_managed/ sebagai berikut:
[bpdp@bpdp-arch intro]$ tree lib_managed/ lib_managed/ `-- scala_2.9.0 |-- compile | `-- servlet-api-2.5.jar `-- test |-- jetty-6.1.26.jar |-- jetty-util-6.1.26.jar `-- servlet-api-2.5-20081211.jar3 directories, 4 files [bpdp@bpdp-arch intro]$
Setelah definisi proyek serta komponen kita peroleh, tiba saatnya untuk membuat servlet. Servlet akan diletakkan di src/main/scala/. Pada direktori tersebut, buatlah file IntroServlet.scala:
import javax.servlet.http._
class IntroServlet extends HttpServlet {
override def doGet(req: HttpServletRequest, resp: HttpServletResponse) = {
resp.getWriter().print("Hello World!")
}
}
Setelah itu, definisikan metadatanya. Buat direktori webapp di src (defaultnya belum dibuat) dan di dalam direktori tersebut, buat direktori WEB-INF. Definisi servlet diletakkan di file web.xml di irektori WEB-INF sebagai berikut:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd"> <web-app><servlet> <servlet-name>Intro</servlet-name> <servlet-class>IntroServlet</servlet-class> </servlet><servlet-mapping> <servlet-name>Intro</servlet-name> <url-pattern>/Intro</url-pattern> </servlet-mapping> </web-app>
Setelah itu, di prompt sbt, gunakan perintah reload (untuk mem-build proyek) dan jetty-run (untuk menjalankan aplikasi web):
> reload [info] Building project Introduction to Servlet using Scala 1.0 against Scala 2.9.0 [info] using IntroBuild with sbt 0.7.7 and Scala 2.7.7 > jetty-run [info] [info] == copy-resources == [info] == copy-resources == [info] [info] == compile == [info] Source analysis: 0 new/modified, 0 indirectly invalidated, 0 removed. [info] Compiling main sources... [info] Nothing to compile. [info] Post-analysis: 1 classes. [info] == compile == [info] [info] == prepare-webapp == [info] == prepare-webapp == [info] [info] == jetty-run == 2011-06-11 23:34:19.105:INFO::Logging to STDERR via org.mortbay.log.StdErrLog [info] jetty-6.1.26 [info] NO JSP Support for /, did not find org.apache.jasper.servlet.JspServlet [info] Started SelectChannelConnector@0.0.0.0:8080 [info] == jetty-run == [success] Successful. [info] [info] Total time: 0 s, completed Jun 11, 2011 11:34:19 PM >
Setelah jetty-run, kita bisa mengakses servlet kita menggunakan http://namaserver:8080/Intro (lihat web.xml untuk mengetahui pemetaan / mapping servlet). Jika ingin membuat WAR, gunakan perintah package di prompt sbt:
> package [info] [info] == compile == [info] Source analysis: 0 new/modified, 0 indirectly invalidated, 0 removed. [info] Compiling main sources... [info] Nothing to compile. [info] Post-analysis: 1 classes. [info] == compile == [info] [info] == copy-resources == [info] == copy-resources == [info] [info] == prepare-webapp == [info] == prepare-webapp == [info] [info] == package == [info] Packaging ./target/scala_2.9.0/introduction-to-servlet-using-scala_2.9.0-1.0.war ... [info] Packaging complete. [info] == package == [success] Successful. [info] [info] Total time: 1 s, completed Jun 11, 2011 11:36:14 PM >
File WAR yang dibuat diletakkan di direktori target/versi_scala/nama-proyek.war (lihat baris [info] Packaging ./target/scala_2.9.0/introduction-to-servlet-using-scala_2.9.0-1.0.war …). File WAR ini kemudian bisa di deploy di berbagai application server.
Setelah memahami cara kerja ini, tinggal mempelajari dependency management oleh sbt untuk mengelola berbagai komponen yang nantinya akan digunakan di aplikasi web kita. Jika ingin menggunakan framework, silahkan mempelajari berbagai framework berbasis Scala berikut ini:
- Lift (http://www.liftweb.net)
- Bowler (http://bowlerframework.org/)
- Play Scala (http://scala.playframework.org/)
Selamat mencoba

June 19th, 2011 → 23:41
[...] Tagged: sbt, xsbt-web-plugin Posted in: Scala, Software Development ← Membuat Aplikasi Web dengan Scala, Servlet, dan sbt LikeBe the first to like this post. Be the first to start a [...]