Mempelajari dasar-dasar Spring MVC

Spring MVC merupakan Framework dari Spring dengan menggunakan konsep MVC (Model View Controller). Seperti kita ketahui bahwa konsep MVC beserta Frameworknya sudah banyak digunakan di bahasa pemrograman sebagai sebuah pattern, tidak terkecuali di Java.

Di Java, flow dari Spring MVC dapat dilihat dari gambar berikut

Workflow dari Spring MVC

Setiap request yang datang dari User (aplikasi front end) akan di terima oleh Front Controller (yang di dalam prakteknya merupakan sebuah servlet bernama DispatcherServlet) untuk kemudian di dispatch ke Controller. Controller akan menghandle request tersebut, memproses request, kemudian memberikan response ke Front Controller berupa model. Model disini merupakan sebuah placeholder yang memegang informasi yang akan di sajikan kepada penerima. Front Controller akan merender model tersebut ke View Template (seperti JSP, Thymeleaf, dsb) dan View Template menampilkan model ke User melalui Front Controller.

Dapat dilihat dari workflow diatas bahwasannya Front Controller bertanggung jawab terhadapt request dan response secara keseluruhan. Secara teknis, Front Controller merupakan sebuah Servlet Class yang mewarisi (inherit) kelas HttpServlet. DispatcherServlet ini di declare di dalam file web.xml. kita dapat melakukan konfigurasi di dalam web.xml ini.

Konfigurasi DispatcherServlet

<web-app>

<servlet>
<servlet-name>example</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>example</servlet-name>
<url-pattern>*.form</url-pattern>
</servlet-mapping>

</web-app>

Karena dia adalah kelas Servlet, maka konfigurasi nya pun sama seperti deklarasi Servlet pada umumnya. Pada konfigurasi di atas, terdapat value *.form pada tag url-pattern yang berarti bahwa setiap request yang berakhiran dengan .form akan di handle oleh kelas ini. Kita bisa mengganti valuenya sesuai dengan kebutuhan. Jika misalkan valuenya kita ganti menjadi “/” (tanpa tanda petik) maka kelas ini akan menghandle request yang berakhiran dengan /.

Kelas tersebut berada ada pada package javax.servlet. Oleh karena itu kita perlu menambahkan dependency terhadap kelas tersebut di pom.xml. Caranya bisa dengan klik kanan pada folder Dependencies kemudian ketikan “javax.servlet” tanpa tanda petik pada text field query lalu pilih yang artifactId nya javax.servlet.api. Jika baru pertama kali memanggil dependency tersebut maka Maven akan mendownload nya untuk kita dan menyimpan di Repository.

Setelah di declare di web.xml, kita butuh membuat objek-objek (various beans) nya. Beans tersebut dibuat di dalam sebuah file konfigurasi Spring.

Hirarki Context dalam Spring MVC

DispatcherServlet memiliki WebApplicationContext yang mana mewarisi root dari WebApplicationContext.

Selama inisialisasi DispatcherServlet, Kelas tersebut akan mencari nama dengan format [nama servlet]-servlet.xml di dalam folder WEB-INF. Intinya secara default, file konfigurasi spring tersebut harus ada di folder tersebut. Nama Servlet wajib sama dengan servlet name yang telah di declare di web.xml. Jika tadi kita declare Servlet Name nya dengan nama example maka file spring configuration harus bernama example-servlet.xml. Jika ingin memindahkan lokasi dari file tersebut, maka di DispatcherServlet perlu menambahkan parameter.

Note : spring context version yang digunakan harus sesuai dengan version servlet yang digunakan. Misalkan kita menggunakan Servlet dengan version 3.x.x maka version dari application context nya pun harus sesuai dengan version servlet nya.

Di dalam file Spring tersebut, kita dapat melakukan banyak hal. seperti misalkan menscan kelas-kelas Controller, membuat objek, atau mengoverride objek parent.

Agar pemahamannya lebih dalam lagi mengenai konsep dasar Spring MVC, maka perlu sambil praktek (koding).

Disini kita akan membuat aplikasi sederhana dengan Spring MVC. Build Tools yang akan kita gunakan adalah Maven dengan IDE Netbeans dan Application Server Apache Tomcat.

Untuk membuat sebuah project Maven, dapat menggunakan command prompt atau create langsung dari Netbeans karena Netbeans sudah support dengan Maven.

Command untuk create project Maven

Setelah project dibuat, agar memudahkan kita koding, kita buka project tersebut di Netbeans dengan cara klik tab File kemudian Open Project dan pilih project yang telah kita buat.

NB : Jika masih belum paham Maven, maka dapat mengunjungi link ini https://medium.com/@acep.abdurohman90/mengenal-maven-sebagai-java-build-tools-5ba752f75812

Karena aplikasi yang akan kita buat adalah berbasis web, maka packagingnya kita rubah dari jar menjadi war (dapat dilihat di pom.xml). Selain itu kita perlu menambahkan folder untuk web page kita dan resources (optional) untuk membaca file konfigurasi kita di dalam classpath. Caranya kita dapat menambahkan di Netbeans atau di explorer.

Struktur folder

Tidak cukup sampai di atas, kita harus menambahkan folder WEB-INF di dalam folder webapp dan menambahkan file web.xml di dalam WEB-INF yang baru saja dibuat.

Untuk web.xml kita tidak perlu repot-repot membuat sendiri, bisa dengan cara mengcopy di folder Apache Tomcat. Lokasinya adalah : root-folder-tomcat\webapps\ROOT\WEB-INF\web.xml.

Struktur akhir project

Setelah strukturnya terbentuk maka kita perlu menambahkan dependency dari Spring MVC. Caranya cukup mudah dengan cara menambahkan di pom.xml.

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>

Jika sebelumnya belum pernah menggunakan dependency tersebut, maka kita harus clean package project tersebut. Artinya kita akan mengclean dan membuild hasil dari project kita. Caranya cukup mudah, dengan cara memasukan command sebagai berikut pada command prompt.

mvn clean package

NB : sebelum mengeksekusi command tersebut, pastikan bahwa lokasi kita sedang berada di dalam project.

Selanjutnya adalah mendeklarasikan Front Controller / DispatcherServlet yang tadi sudah di bahas. Caranya adalah dengan cara masuk ke file web.xml lalu masukan koding sebagai berikut

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0"
metadata-complete="true">
<display-name>Aplikasi Spring Web MVC</display-name>
<description>
Ini adalah aplikasi dasar dari Spring Web MVC
</description>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>

Terdapat tag servlet yang berisi deklarasi servlet name dan class nya. servlet name dapat di isi bebas, sedangkan servlet class merupakan full path kelas dari DispatcherPatch. Kemudian tag load-on-startup berisi value angka urutan servlet di jalankan.

Setelah kita declare servlet nya, kemudian tinggal mapping. tag pertama adalah servlet name dari yang tadi kita sudah declare

Setelah itu kita perlu membuat file Spring untuk membuat objek-objek yang dibutuhkan. Caranya adalah klik kanan pada folder WEB-INF kemudian New->Other->Spring Framework->Spring XML Configuration File. File Name nya harus sesuai dengan ketentuan defaultnya yaitu [nama servlet]-servlet.xml. jika tidak maka akan menimbulkan error ketika aplikasi di running. kemudian namespacenya kita checklist pilihan yang context saja karena kita hanya butuh itu untuk kebutuhan scanning kelas-kelas Controller.

Agar semua request dapat di dispatch ke kelas-kelas Controller maka kita perlu menscan kelas-kelas Controller tersebut. Sebelumnya kita buat dulu package controller dibawah root package. Lalu kita buat kelas java untuk didaftarkan sebagai kelas Controller.

Setelah kelas Controller nya dibuat maka kita scan semua kelas yang ada di package controller tersebut dengan cara menambahkan kode berikut di spring file configuration.

<context:component-scan base-package="com.acepabdurohman.belajar.controller"/>

Masih di dalam file spring configuration, kita harus mengoverride isi dari kelas InternalResourceViewResolver. Kelas tersebut berfungsi sebagai View Resolver yang mana DispatcherServlet akan mengecek entry dari kelas tersebut dan memanggil view template sesuai dengan yang diberikan oleh Controller. Kelas InternalResourceViewResolver tersebut akan kita override property nya.

Sebelumnya kita akan membuat struktur folder untuk web page. Kita buat folder jsp di dalam folder WEB-INF untuk menyimpan semua file-file jsp. Mengapa di folder WEB-INF ? Itu agar user tidak bisa memanggil file tersebut melalui url. setiap kali user melakukan request, harus melalui Controller dulu. Misalkan kita membuat file jsp dengan nama hello.jsp untuk menampilkan pesan yang dilemparkan oleh Controller.

Kembali lagi ke spring configuration, kita akan mengoverride value yang ada di kelas tersebut. Caranya adalah dengan memasukan kode sebagai berikut.

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>

Kita memanggil kelas InternalResourceViewResolver. Kelas tersebut mempunyai property bernama prefix dan suffix. Lalu kita override property tersebut. Pada kode diatas value prefix kita isi dengan “/WEB-INF/jsp/” dan suffix dengan “.jsp” yang artinya setiap kali Controller memberikan model kepada DispatcherServlet, DispatcherServlet akan mengecek entry dari property InternalResourceViewResolver yang mana prefix adalah path folder dari nama file yang diberikan oleh Controller dan suffix adalah ekstensi dari file tersebut. Maka dapat disimpulkan bahwa DispatcherServlet mencari file yang diberikan oleh Controller dengan cara sebagai berikut : prefix+file+suffix.

Full Code nya seperti berikut :

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
">

<context:component-scan base-package="com.acepabdurohman.belajar.controller"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>

Setelah selesai dengan konfigurasi diatas kemudian masuk ke kelas Controller, buka kelas HelloJava.java yang telah kita buat lalu tambahkan annotasi @contoller yang menandakan bahwa kelas tersebut adalah kelas Controller.

package com.acepabdurohman.belajar.controller;
import org.springframework.stereotype.Controller;
@Controller
public class HelloJava {

}

Setelah itu kita akan membuat method yang akan memproses request dari user. User pada dasarnya melakukan request melalui HTTP Protocol biasa, maka kita harus memanggil annotasi @RequestMapping yang berisi path dari method tersebut. Lalu di dalam method tersebut kita akan melemparkan model yang telah kita buat untuk kemudian ditampilkan di jsp. Misalkan kita buat kode seperti berikut

package com.acepabdurohman.belajar.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class HelloJava {
@RequestMapping(value = "/hello")
public ModelAndView hello(){
String myMessage = "Hallo ini dari kelas HelloJava";
ModelAndView mav = new ModelAndView();
mav.setViewName("hello");
mav.addObject("message", myMessage);
return mav;
}
}

Pada kode diatas kita akan melemparkan sebuah pesan pada variable myMessage. Kemudian kita set nama view nya apa dan menambahkan object / model apa yang akan dilemparkan ke DispatcherServlet untuk kemudian ditampilkan di web page kita (jsp). Parameter pertama pada method addObject adalah nama paramater yang akan di panggil oleh file jsp. Parameter kedua adalah isi/value dari parameter pertama.

Setelah model nya kita buat, maka tinggal di tampilkan di web page (jsp). Caranya adalah kita buka file jsp nya berdasarkan nama file yang di lemparkan oleh Controller pada method setViewName. Lalu tampilkan message yang telah dibuat pada kelas Controller dengan cara menuliskan kode sebagai berikut

<%@page contentType="text/html" pageEncoding="windows-1252"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>My Hello Page</title>
<style>
body{
background-color : tan;
}
</style>
</head>
<body>
${message}
</body>
</html>

Sampai disini kita telah selesai dengan pengkodean. Kita clean and build project kita dengan cara klik kanan project lalu clean and build atau melalui command prompt seperti yang telah kita lakukan sebelumnya. setelah build succes kemudian kita run aplikasi dengan cara klik kanan project dan run. Dengan cara tersebut kita secara otomatis mendeploy aplikasi kita ke Application Server (Apache Tomcat). Setelah itu cek di browser.

Url nya adalah sebagai berikut : [host]:port/nama-aplikasi/hello

  • host di isi dengan host server kita menjalankan aplikasi, jika local maka di isi localhos
  • port diisi jika kita menjalankan aplikasi di port selain default (8080)
  • nama-aplikasi/hello adalah nama aplikasi kita ditambah dengan value dari request mapping yang telah kita definisikan sebelumnya. Dengan memanggil mapping tersebut maka aplikasi akan menjalankan method hello() pada kelas ModelAndView.

Jika berhasil, maka akan muncul display message di halaman web kita

Selamat, anda telah membuat aplikasi web dengan menggunakan Spring MVC pertama :)

Selain itu kita bisa juga menambahkan annotasi PathVariable pada method kita untuk mengambil value pada variable dari url

Kodenya hanya perlu kita tambahkan di kelas HelloJava

@RequestMapping(value = "/person/{nama}")
public ModelAndView tampilkanNama(@PathVariable String nama) {
String msg = "Hello " + nama;
return new ModelAndView("hello", "message", msg);
}

Referensi :

http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-controller

Show your support

Clapping shows how much you appreciated Acep Abdurohman’s story.