Tạo project đơn giản với Spring MVC 4 Annotation.

1. Giới thiệu

Spring MVC là 1 trong những Framework Java được sử dụng phổ biến nhất. 

2. Chuẩn bị

  1. Download và cài đặt JDK. Các bạn nên sử dụng phiên bản 8, vì hiện tại Spring MVC vẫn chưa được tối ưu để thích ứng hoàn toàn với JDK 9 trở lên.
  2. IDE. Bài viết sử dụng Eclipse.
  3. Download và cài đặt Maven. Bài viết sẽ sử dụng Maven để build các gói dependency. Maven sẽ tự động download và cài đặt các gói thư viện chúng ta cần, ở đây là thư viện Spring, chúng ta không cần phải download và thêm từng gói Jar vào project, ngoài ra Maven hỗ trợ các câu lệnh để build ứng dụng để deploy một cách dễ dàng. Nếu bạn vẫn chưa quen với Maven thì có thể dành ra 10 phút để học cách sử dụng tại: 
  4. Download và cài đặt Apache Tomcat. Bài viết sử dụng Apache Tomcat 8.

 3. Tạo project bằng Maven

Chọn menu File -> New Project -> Project

Tick chọn Create a simple project (skip archetype selection). Mục đích của việc này là chúng ta sẽ chỉ tạo ra 1 project Maven đơn thuần không kèm theo bất kỳ thư viện tạo sẵn nào cả, mục đích cũng là để hướng dẫn các bạn thêm từng thư viện vào mà không bị rối bởi những cấu hình có sẵn.

Và nhấn Next.

Nhập GroupId và ArtifactId, chọn packaging là WAR. Nhấn Finish

Và chúng ta sẽ được 1 Project Maven như hình:

Tạo thư mục WEB-INF/views để chứa các file jsp.

4. Coding

Step 1: Build file pom.xml, thêm các thư viện của Spring.

<project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>thecoderoot</groupId>
  <artifactId>SpringMVCHelloWorld</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
 
  <properties>
        <springframework.version>4.0.6.RELEASE</springframework.version>
  </properties>
 
 	<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${springframework.version}</version>
        </dependency>
 
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.1</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
    </dependencies>
    
    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.2</version>
                    <configuration>
                        <source>1.6</source>
                        <target>1.6</target>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>2.4</version>
                    <configuration>
                        <warSourceDirectory>src/main/webapp</warSourceDirectory>
                        <failOnMissingWebXml>false</failOnMissingWebXml>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

Trong đó các thư viện của Spring được khai báo trong thẻ dependencies, Maven sẽ giúp bạn download các file jar này về từ repository của Maven và tự đồng bộ lại các khai báo trong Project, kết quả là chúng ta sẽ không còn bị lỗi thiếu thư viện nữa. 

Lưu ý: Các khai báo trong thẻ build của file pom.xml cũng quan trọng không kém các thư viện, trong phần này chúng ta sẽ chỉ định plug-in maven dùng để build source code thành gói war, đồng thời chỉ rõ thư mục webapp để  load các file resource như file jsp hay css, ...

Step 2: Class configuration

Trong bài viết này chúng ta sẽ sử dụng kỹ thuật Annotation để khai báo các cấu hình cho Spring, mà không sử dụng xml, Annotation có ưu điểm là code Java nên dễ đọc và thao tác thân thiện hơn dùng file xml.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "thecoderoot.springmvc.p1")
public class WebSpringConfiguration {
	@Bean
	public ViewResolver viewResolver() {
		InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
		viewResolver.setViewClass(JstlView.class);
		viewResolver.setPrefix("/WEB-INF/views/");
		viewResolver.setSuffix(".jsp");

		return viewResolver;
	}
}

Annotation @Configuration đánh dấu đây là class chứa các thông tin cấu hình cho Spring, khi project bắt đầu chạy, Server sẽ quét qua các class này trước đọc qua tất cả các thông tin cấu hình. Có nghĩa là chúng ta sẽ không phải chỉ có mỗi 1 mà có thể có nhiều file class cấu hình, tùy theo chức năng, nhiệm vụ mà chúng được chia ra, ví dụ như class cấu hình cho View, class cấu hình cho Database, Authentication, ... Trong những bài sắp tới website thecoderoot sẽ giới tiếp tục đến các bạn những bài nâng cao hơn để các bạn thể hiểu được rõ hơn cách làm việc với Spring MVC.

Step 3: Tạo class cấu hình Dispatcher Servlet.

Nếu các bạn đã từng làm việc với Servlet của Java thì sẽ thấy ngay sự quen thuộc. Đúng vậy, bản chất của Spring Dispatcher Servlet cũng chỉ là Java Servlet, tuy nhiên nó đã được tùy chỉnh lại để làm việc một cách tối ưu hơn với Spring Framework. Dispatcher Servlet là 1 FrontController, nó sẽ đóng vai trò cửa ngõ hứng hết tất cả http/https request được gửi đến Website và sau đó Dispatcher Servlet sẽ dựa vào  khai báo của các class Controller của chúng ta mà điều hướng request đến Controller tương ứng.

package thecoderoot.springmvc.p1.configuration;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class WebSpringInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
	@Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] {WebSpringConfiguration.class };
    }
  
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return null;
    }
  
    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
}

Step 4:  Tạo Controller

Có thể nói tạo Controleller chính là công việc mang lại hứng thú hơn cả cho lập trình hơn cả, bởi chính đây là lúc chúng ta "tận hưởng" coding trên những công việc cấu hình ở bên trên. Ở đây chúng ta sẽ define những url mà website cung cấp cho người dùng cùng với logic xử lý những request từ người dùng. Chúng ta sẽ tạo 1 Controller để hiện 1 dòng thông báo đơn giản khi người dùng mới vào trang web từ đường dẫn "/" sơ khởi nhất và 1 đường link khác nhận vào 1 parameter. Trong bài viết sau sẽ hướng dẫn các bạn cách khai báo Controller và cách nhận vào các parameter từ người dùng.

package thecoderoot.springmvc.p1.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
 
@Controller
@RequestMapping("/")
public class HelloWorldController {
 
    @RequestMapping(method = RequestMethod.GET)
    public String sayHello(ModelMap model) {
        model.addAttribute("greeting", "Hello World from Spring 4 MVC");
        return "welcome";
    }
 
    @RequestMapping(value = "/helloagain", method = RequestMethod.GET)
    public String sayHelloAgain(ModelMap model) {
        model.addAttribute("greeting", "Hello World Again, from Spring 4 MVC");
        return "welcome";
    }
 
}

Với 2 Annotation Request Mapping, chúng ta sẽ cung cấp cho người dùng 2 đường link: "/" và "/hello", 2 method này trả về 1 kết quả kiểu String chính là tên file của file jsp tương ứng trong folder "/WEB-INF/views/" mà chúng ta đã khai báo ở trên. Và bước cuối cùng của chúng ta chỉnh là tạo file welcome.jsp.

Step 5: Tạo file welcome.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>HelloWorld page</title>
</head>
<body>Greeting : ${greeting}
</body>
</html>

Final step: Chạy ứng dụng.

Chúng ta cần 1 Application Server để deploy và chạy ứng dụng Spring MVC, trong bài viết sử dụng Apache Tomcat 8.5,  bạn có thể dùng bất kỳ Application Server nào bạn muốn, miễn là có hỗ trợ deploy được gói War.

Một số hình ảnh cài đặt nhanh Tomcat cho các bạn mới bắt đầu, nếu bạn nào đã cài rồi thì có thể bỏ qua bước này.

Các bạn có thể download nhanh Apache Tomcat trên trang Apache, ví dụ: https://tomcat.apache.org/download-80.cgi, các bạn có thể sử dụng các phiên bản Tomcat 7, Tomcat 8, Tomcat 8.5, ... miễn là không quá cũ.

Mở cửa sổ Preferences và chọn Server > Runtime Enviroments. Khung bên phải chọn Add, chọn phiên bản Tomcat tương ứng của bạn và bấm Apply và chúng ta sẽ có như sau

Bấm Apply and Close để kết thúc thêm Server.

OK, đã đến lúc chúng ta bắt đầu test thử ứng dụng. Chuột phải vào thư mục source và chọn Run as > Run on Server. Chọn phiên bản Tomcat mà chúng ta cần. Finish.

Chúng ta sẽ được kết quả như bên dưới:

Chúc các bạn thành công.

minhnhatict@gmail.com Spring MVC