Loading...

Hello World Spring MVC - Annotation/JavaConfig - Lập Trình Web Spring MVC

Ở bài trước, ta đã có một ví dụ Hello world với Spring MVC cấu hình bằng XML. Bài này mình sẽ chuyển XML config của bài trước sang dùng Annotation với Java Config.

Quay lại với bài trước, ta dùng XML để cấu hình. Và nó có 2 điểm chính cần quan tâm:

  • Đầu tiên là spring-servlet.xml, nơi mà ta định nghĩa một view-resolver để chỉ định view thực sự nằm ở đâu, và chỉ ra nơi để tìm beans thông qua component-scanning.
  • Thừ 2 là web.xml, nơi mà ta định nghĩa một front-controller và url partern cho các request tới ứng dụng.
Bài này ta sẽ tao một ứng dụng tương tự, nhưng sẽ xóa hết các XML config, thay bằng annotation config.
Bắt đầu thôi.

1. Tạo project

Bạn tạo mới một project từ Eclipse như ở bài trước nha.


2. Update pom.xml

Mở file pom.xml và thêm vào như sau:

<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.nmt.springmvc</groupId>
  <artifactId>helloworldNoXml</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>helloworldNoXml Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <properties>
  <springframework.version>4.1.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>
  <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>3.8.1</version>
   <scope>test</scope>
  </dependency>
 </dependencies>
  <build>
    <finalName>helloworldNoXml</finalName>
  </build>
</project>

3. Thêm controller

Thêm một controller vào src/main/java. Nhớ tạo thêm một package trước khi thêm vào nha.
com.nmt.springmvc.controller.HelloWorldController
Nội dung thì tương tự như bài trước.

package com.nmt.springmvc.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("nameUser", "nmtien");
        return "welcome";
    }
 
    @RequestMapping(value="/helloagain", method = RequestMethod.GET)
    public String sayHelloAgain(ModelMap model) {
        model.addAttribute("nameUser", "nmtien");
        return "welcome";
    }
}

Phần giải thích cho đoạn code trên, bạn vui lòng quay lại bài trước xem nha.

4. Thêm JSP view

Tương tự bài trước, ta thêm một jsp file tên welcome.jsp vào thư mục WEB-INF/views/welcome.jsp
Nội dung như sau:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ page isELIgnored ="false" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Hello World - Spring MVC</title>
</head>
<body>
 Hello ${nameUser}
</body>
</html>

Phần giải thích cho đoạn code trên, bạn vui lòng quay lại bài trước xem nha.

5. Thêm Class cấu hình

Bạn thêm một package configuration để chứa các class cấu hình nha.
Tạo một class ApplicationConfiguration trong package vừa tạo với nội dung:

package com.nmt.springmvc.configuration;

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 = "com.nmt.springmvc")
public class ApplicationConfiguration {

 @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }
}


Bạn có thể thấy, class này tương ứng với những gì cấu hình trong file spring-servlet.xml ở bài trước với component-scanning và view-resolver.



  • @Configuration: chỉ định rằng class này chứa một hoặc nhiều beans methods được đánh dấu với @Bean. Các method này khai báo các bean dùng trong ứng dụng và được quản lý bời spring container.
  • @EnableWebMvc tương đương với mvc:annotation-driven trong cấu hình XML. Nó kích hoạt cho phép dùng @Controller cho classes và dùng @RequestMapping để ánh xạ (map) các requests đến ứng dụng. Xem lại bài trước để hiểu rõ hơn.
  • @ComponentScan tương đương với context:component-scan base-package="..."  chỉ ra nơi để tìm kiếm beans.

6. Thêm Initialization class

Cũng trong package configuration, thêm một class tên HelloWebApplicationInitializer implement từ interface WebApplicationInitializer. Class này dùng để thay thế các cấu hình trong web.xml trước kia. Trong lúc mà Servlet 3.0 Container startup, class này sẽ được load và khởi tạo, method onStartup sẽ được gọi bởi servlet container.
Nội dung com.nmt.springmvc.configuration.HelloWebApplicationInitializer như sau:

package com.nmt.springmvc.configuration;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;

import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

public class HelloWebApplicationInitializer implements WebApplicationInitializer {
 
    public void onStartup(ServletContext container) throws ServletException {
 
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(ApplicationConfiguration.class);
        ctx.setServletContext(container);
 
        ServletRegistration.Dynamic servlet = container.addServlet("dispatcher", new DispatcherServlet(ctx));
 
        servlet.setLoadOnStartup(1);
        servlet.addMapping("/");
    }

}

Ta có thể thấy, những cấu hình khai báo trong class này tương tự như trong web.xml ở bài trước.



Ta định nghĩa một front-controller DispatherServler, gán cho nó một mapping url pattern. Và thay vì chi định tới một file spring-servlet.xml ta register một ApplicationConfiguration đã tạo trước đó.

7. Build và chạy ứng dụng

Start Tomcat để chạy ứng dụng, ta có kết quả tương tự như bài trước:


Ok. Bài viết hôm này xin kết thúc tại đây.

Download source code tại đây.
nmT - Nguyễn Minh Tiến


Previous
Next Post »
Loading...