Spring MVC – Code ví dụ Spring MVC Hello sử dụng XML config

Spring MVC – Code ví dụ Spring MVC Hello sử dụng XML config

Ứng dụng web Hello World sử dụng Spring MVC

Các công nghệ sử dụng trong bài viết này

1. Tạo ứng dụng web bằng Spring MVC + Maven

Đây là bài đầu tiên ví  dụ về Spring MVC nên mình sẽ hướng dẫn chi tiết từng bước từ tạo project tới cấu hình.

B1. Tạo Maven Project

Spring MVC - Code ví dụ Spring MVC Hello sử dụng XML config

Spring MVC - Phần 2: Tạo Ứng dụng Spring MVC Hello sử dụng XML config

Tạo file web.xml (bạn có thể tạo bằng tay và copy vào folder webapp/WEB-INF

B2. Thêm các thư viện của Spring vào file pom.xml

Thư viện spring-webmvc đã bao gồm cả spring-core, spring-context, spring-beans

<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>stackjava.com</groupId>
  <artifactId>SpringMVCHello</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>

  <properties>
    <spring.version>5.0.2.RELEASE</spring.version>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.0</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>
</project>
Spring MVC – Code ví dụ Spring MVC Hello sử dụng XML config

B3. Khai báo Spring MVC trong file web.xml

Trong các ví dụ trong Spring Core chúng ta thường dùng applicationContext hoặc beanFactory để load file config còn trong ứng dụng web, file config sẽ được load thông qua file web.xml lúc khởi động ứng dụng.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://java.sun.com/xml/ns/javaee"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  version="2.5">
  <display-name>SpringMVCHello</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

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

  <servlet-mapping>
    <servlet-name>spring-mvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

</web-app>

Mình mapping url-pattern là ‘/’ tức là tất cả các request sẽ đều đi qua dispatcher servlet (Các bạn có thể sửa lại url-pattern để tùy chọn những request nào sẽ đi qua dispatcher servlet)

Ở file web.xml trên mình không chỉ rõ file config cho Spring (Dispatcher Servlet) thì mặc định Spring sẽ tìm file WEB-INF/{servlet-name}-servlet.xml

Trong ví dụ trên, Spring sẽ tìm file spring-mvc-servlet.xml trong foler WEB-INF.

Chúng ta cũng có thể định nghĩa file Spring XML thông qua tham số: contextConfigLocation

Ví dụ dưới đây mình định nghĩa file Spring XML config sẽ là file WEB-INF/spring-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://java.sun.com/xml/ns/javaee"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  version="2.5">
  <display-name>SpringMVCHello</display-name>

  <servlet>
    <servlet-name>spring-mvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/spring-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>spring-mvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

B4. Cấu hình file xml config cho Spring

spring-mvc-servlet.xml

<?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.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">

  <context:component-scan base-package="stackjava.com.springmvchello" />

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

<context:component-scan base-package="stackjava.com.springmvchello" />Thực hiện auto scan component với package stackjava.com.springmvchello

InternalResourceViewResolver: thực hiện mapping các file view tương ứng, ở trong ví dụ này nó sẽ map các file trong folder WEB-INF/views/jsp có đuôi là .jsp

B5. Tạo controller xử lý request.

package stackjava.com.springmvchello.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class HelloController {

  @RequestMapping("/")
  public String index() {
    return "index";
  }

  @RequestMapping(value = "/hello", method = RequestMethod.GET)
  public String hello() {
    return "hello";
  }

}

Class HelloController được đánh dấu là @Controller và nằm trong package được scan nên dispatcherServlet khi nhận request sẽ kiểm tra những request sẽ được xử lý bảo HelloController

method index()

  • Giá trị maping là “/” tức là khi gửi một request tới url “/” nó sẽ được xử lý bởi method index()
  • return “index”: nó sẽ kiểm tra xem các file view map trong spring là gì và trả về, trong ví dụ này nó sẽ trả về file index.jsp trong folder WEB-INF/views/jsp
  • Trong @RequestMapping không chỉ rõ request method là Get, Post, Put… nên nó sẽ chấp nhận tất cả các request method tới.

method hello()

  • Giá trị maping là “/” tức là khi gửi một request tới url “/” nó sẽ được xử lý bởi method index()
  • return “hello”: nó sẽ kiểm tra xem các file view map trong spring là gì và trả về, trong ví dụ này nó sẽ trả về file hello.jsp trong folder WEB-INF/views/jsp
  • Trong @RequestMapping chỉ rõ method = Get nên chỉ có request = Get mới được xử lý bởi method này

B6. Tạo file view

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>index</title>
</head>
<body>
  <h1>Spring MVC Hello World!</h1>
  <a href="hello">hello</a>
</body>
</html>

hello.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>index</title>
</head>
<body>
  <h1>Spring MVC Hello World!</h1>
  <a href="hello">hello</a>
</body>
</html>

Cấu trúc project sau khi hoàn thành các bước tạo:

B7. Chạy ứng dụng web trên tomcat

Kết quả:

Okay, Done!

Download code ví dụ trên tại đây

Spring MVC – Code ví dụ Spring MVC Hello sử dụng XML config

References:

https://spring.io/guides/gs/serving-web-content/

stackjava.com