Xây dựng ứng dụng từ A - Z với Spring MVC Framework (Phần 2)

Trong phần này tôi sẽ hướng dẫn tạo 1 ứng dụng đơn giản bằng Spring MVC Framework , đồng thời giải thích các luồng dữ liệu được xử lý khi chạy ứng dụng. Ứng dụng này hiển thị một thông điệp ra trình duyệt web. Tôi đảm bảo khi nghiên cứu chi tiết bài viết này sẽ hiểu khá rõ về Spring MVC Framwork ^_^


Spring Web model-view-controller (MVC) framework được thiết kế xung quanh một DispatcherServlet xử lý hết tất cả các HTTP yêu cầu và HTTP phản hồi lại. Các luồng xử lý của Spring MVC được mô tả trong sơ đồ sau:


[1] Sau khi nhận được 1 yêu cầu HTTP, DispatcherServlet sẽ tư vấn HandlerMapping Controller thích hợp.
[2] Controller nhận các yêu cầu và gọi phương thức thích hợp bằng cách sử dụng phương thức GET hoặc POST. Tại đây phương thích hợp được gọi sẽ thiết lập model dữ liệu và trả về tên View cho DispatcherServlet.
[3] DispatcherServlet sẽ nhận được sự trợ giúp từ ViewResolver để xác định View cho các yêu cầu.
[4] Quá trình chọn View hoàn thành, DispatcherServlet chuyển model dữ liệu tới View  đó và cuối cùng chuyển tới trình duyệt.

Chúng ta bắt đầu tạo 1 ứng dụng Spring MVC:

1. Tạo Project.
Trong Eclipse => Vào File/ New / Project... trong danh sách chọn Maven => Chọn tiếp Maven Project và nhấn Next

Ở cửa sổ tiếp theo Bạn chọn Use default Workspace location để chọn nơi đặt Project mặc định và nhấn Next:

Ở cửa sổ tiếp chọn tới dòng "org.apache.maven.archetypes  -  maven-archetype-webapp  -  RELEASE" và nhấn Next :


Cửa sổ tiếp, bạn nhập Group Id và Artifac Id => Nhấn Finish


Tới đây bạn tiếp tục thực hiện các bước sau để cấu hình Project bằng cách nhấn chuột phải vào Project vừa tạo chọn Properties => Cửa sổ hiện ra bạn chọn mục "Project Facets" ở menu bên trái => Bạn chọn tab Runtimes và Click chọn vào server tomcat => Nhấn Apply:

Cuối cùng bạn nhấn OK. Tới đây quá trình khởi tạo một Maven project thành công.

Tại project bạn vừa tạo, trong thư mục src/ main bạn tạo mới 1 thư mục java nếu thư mục này chưa được tự tạo ra. Cấu trúc project bây giờ sẽ tương tự như sau:


2. Khai báo, cấu hình các bộ thư viện của Spring MVC

- File pom.xml
Đây là file mà maven sẽ dùng để quản lý các bộ thư viện được sử dụng trong Project. Khi bạn sử dụng một bộ thư viện nào thì bạn cần khai báo tại đây. Đối với ứng dụng SpringMVC của chúng ta tôi thực hiện 1 file pom 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>CNS</groupId>
  <artifactId>2System</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>2System Maven Webapp</name>
  <url>http://maven.apache.org</url>

  <properties>
      <spring.version>3.0.5.RELEASE</spring.version>
      <jdk.version>1.6</jdk.version>
      <sitemesh.version>2.4.2</sitemesh.version>
  </properties>

  <dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <finalName>2System</finalName>
  </build>
</project>

- File web.xml trong webapp/WEB-INF
Đây là nơi bạn cấu hình các yêu cầu mà bạn muốn DispatcherSerrvlet xử lý. Trong ứng dụng của chúng ta:
<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_2_5.xsd"
    version="2.5">
  <display-name>Archetype Created Web Application</display-name>
   <servlet>
    <servlet-name>mvc-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
   <servlet-name>mvc-dispatcher</servlet-name>
   <url-pattern>*.htm</url-pattern>
</servlet-mapping>
<context-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
</context-param>  

<listener>
   <listener-class>
      org.springframework.web.context.ContextLoaderListener
   </listener-class>
</listener>
</web-app>

File web.xml sẽ khởi tạo DispatcherServlet có tên là "mvc-dispatcher", Framework sẽ tải ngữ cảnh ứng dụng từ file "mvc-dispatcher-servlet.xml" ( [servlet-name]-servlet.xml ) trong thư mục webapp/WEB-INF.
Tiếp theo tag  <servlet-mapping>  chỉ ra những URL sẽ được xử lý bởi DispatcherServlet. Ở đây tất cả các yêu cầu HTTP  kết thúc với .htm sẽ được xử lý bởi DispatcherServlet mvc-dispatcher
Nếu bạn không muốn sử dụng tên file mặc định là  [servlet-name]-servlet.xml và vị trí mặc định là WebContent/WEB-INF, bạn có thể tùy chỉnh bằng cách thêm tag <listener> vào file web.xml

- File mvc-dispatcher-servlet.xml

Trong thư mục webapp/WEB-INF bạn tạo mới một file XML có tên mvc-dispatcher-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    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="cns.system.controller" />
 
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix">
            <value>/WEB-INF/view/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>
 
</beans>  

File mvc-dispatcher-servlet.xml sẽ  được sử dụng để tạo ra định nghĩa các bean. 
Tag <context:component-scan...> sẽ được sử dụng để kích hoạt khả năng tìm kiếm quét các chú thích của Spring MVC như  @Controller và @RequestMapping ...
InternalResourceViewResolver sẽ có các quy luật xác định để quyết định các tên View.

3. Tạo Controller

Tạo Package cns.system.controller trong src/main/java. Trong package cns.system.controller bạn tạo mới 1 class : HelloWorldController.java:

package cns.system.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("/hello")
public class HelloWorldController{

   @RequestMapping(method = RequestMethod.GET)
   public String printHello(ModelMap model) {
      model.addAttribute("message", "Hello Spring MVC Framework!");
      return "hello";
   }
}



Chú thích @Controller định nghĩa lớp là một controller Spring MVC. 
@RequestMapping chỉ ra rằng tất cả các phương thức xử lý trên controller này có liên quan tới đường dẫn  /hello. 
@RequestMapping(method = RequestMethod.GET)  được sử dụng để khai báo phương thức  printHello() là phương thức mặc định của controller để xử lý yêu cầu HTTP GET. Bạn cũng có thể định nghĩa một phương thức khác để xử lý bất kỳ yêu cầu POST tại cùng một URL.

Bạn cũng có thể viết gọn hơn như sau:

@Controller
public class HelloController{
 
   @RequestMapping(value = "/hello", method = RequestMethod.GET)
   public String printHello(ModelMap model) {
      model.addAttribute("message", "Hello Spring MVC Framework!");
      return "hello";
   }

}

4. Tạo View

Spring MVC hỗ trợ nhiều kiểu view với các công nghệ khác nhau như: JSP, HTML, PDF, Excel worksheets, XML, Velocity templates, XSLT, JSON, Atom and RSS feeds, JasperReports. Nhưng phổ biến nhất vẫn là sử dụng JSP để tạo view. Bây giờ chúng ta sẽ tạo 1 view hello.jsp được đặt trong thư mục /WEB-INF/view/ (Thư mục này đã được khai báo trong file mvc-dispatcher-servlet.xml) :

<html>
   <head>
   <title>Hello Spring MVC</title>
   </head>
   <body>
   <h2>${message}</h2>
   </body>
</html>

Ở đây ${message} là thuộc tính chúng ta đã cài đặt bên trong controller. Bạn có thể có nhiều thuộc tính được hiển thị trong View.  

Cấu trúc Project của chúng ta hiện tai như sau:



5. Chạy ứng dụng
Click chuột phải vào Project -> Run as -> Run on Server => Nhấn Finish
Bạn nhập đường dẫn "http://localhost:8080/2System/hello.htm" vào trình duyệt để kiểm tra và sẽ nhận được kết quả như sau :




8 nhận xét:

  1. Bạn có thể giải thích kĩ các tag trong các file xml ko

    Trả lờiXóa
  2. Nhận xét này đã bị quản trị viên blog xóa.

    Trả lờiXóa
  3. cho mình Form login của Strust1 đi bạn theo MVC bạn à

    Trả lờiXóa
  4. mình gặp rắc rối khi tạo và cấu hình các file xml.vì không biết các thẻ có ý nghĩa gì, phải tạo những file nào và trong các file đó phải dùng các thẻ nào

    Trả lờiXóa
  5. bài viết rất hay, cảm ơn ad

    Trả lờiXóa

Rất mong các ý kiến của các bạn khi đọc bài viết này !