HomeLập trình

Bài 1: Lập trình Spring MVC cho người mới bắt đầu – Hello Spring 4 MVC

Like Tweet Pin it Share Email

Tài liệu này viết trên phiên bản Spring MVC 4

  • Eclipse 4.4 (LUNA)
  • Spring 4.0.3.RELEASE

Để tạo một project chạy Spring MVC trên Eclipse ta có thể tạo project theo hai cách: sử dụng Maven, hoặc tạo Dynamic web project ở bài này tôi sẽ hướng dẫn các bạn sử dụng Maven để khai báo các thư viện Spring thay vì phải sử dụng download các thư viện add vào lib theo hướng thông thường.

Maven là một công cụ giúp bạn quản lý các thư viện một cách tự động và hiệu quả và nó đã trở thành thông dụng mà bất cứ một lập trình viên Java nào đều phải biết. Nếu bạn chưa biết hay search từ khóa “hướng dẫn sử dụng Maven” trên google để hiểu rõ hơn về công cụ này.

1. Spring Framework

Đầu tiên các bạn xem mô tả cấu trúc của Spring Framework qua hình mình họa sau:

Trong đó:

Core: The IoC Container: Đây là phần quan trọng nhất và cũng là phần cơ bản, nền tảng của Spring. Nó giữ vai trò về cấu hình và quản lý lifecycle của các java object. Bài hôm nay chúng ta sẽ tìm hiểu về phần này.

AOP (Spring AOP AspectJ integration): Spring AOP module tích hợp chức năng lập trình hướng khía cạnh vào Spring framework thông qua cấu hình của nó. Spring AOP module cung cấp các dịch vụ quản lý giao dịch cho các đối tượng trong bất kỳ ứng dụng nào sử dụng Spring. Với Spring AOP chúng ta có thể tích hợp declarative transaction management vào trong ứng dụng mà không cần dựa vào EJB component. Spring AOP module cũng đưa lập trình metadata vào trong Spring. Sử dụng cái này chúng ta có thể thêm annotation vào source code để hướng dẫn Spring nơi và làm thế nào để liên hệ với aspect.

DAO (Spring JDBC transaction management): Tầng JDBC và DAO đưa ra một cây phân cấp exception để quản lý kết nối đến database, điều khiển exception và thông báo lỗi được ném bởi vendor của database. Tầng exception đơn giản điều khiển lỗi và giảm khối lượng code mà chúng ta cần viết như mở và đóng kết nối. Module này cũng cung cấp các dịch vụ quản lý giao dịch cho các đối tượng trong ứng dụng Spring.

ORM (Hibernate, JPA OJB TopLink, JDO OJB iBatis): Spring có thể tích hợp với một vài ORM framework để cung cấp Object Relation tool bao gồm: JDO, Hibernate, OJB và iBatis SQL Maps.

Spring Web module: Nằm trên application context module, cung cấp context cho các ứng dụng web. Spring cũng hỗ trợ tích hợp với Struts, JSF và Webwork. Web module cũng làm giảm bớt các công việc điều khiển nhiều request và gắn các tham số của request vào các đối tượng domain.

Spring MVC Framework: MVC Framework thì cài đặt đầy đủ đặc tính của MVC pattern để xây dựng các ứng dụng Web. MVC framework thì cấu hình thông qua giao diện và chứa được một số kỹ thuật view bao gồm: JSP, Velocity, Tiles và generation of PDF và Excel file.

(*) Khái niệm Inversion of Control & Dependency Injection
 Để hiểu khái niệm này chúng ta xem các class dưới:

//Đây là một interface
public interface HelloWorld {
  public void sayHello();
}
//Class thi hành interface HelloWorld
public class SpringHelloWorld implements HelloWorld {
 public void sayHello()  {
         System.out.println(“Spring say Hello!”);
 }
}
//Một class khác thi hành Interface HelloWorld
public class StrutsHelloWorld implements HelloWorld {
 public void sayHello()  {
         System.out.println(“Struts say Hello!”);
 }
}

//Và một class dịch vụ
public class HelloWorldService {
 
   // Một trường có kiểu HelloWorld
   private HelloWorld helloWorld;
 
   // Cấu tử tạo đối tượng HelloWorldService
   // Nó khởi tạo giá trị cho trường ‘helloWorld’
   public HelloWorldService()  {
         this.helloWorld = new StrutsHelloWorld();
   }
}

Có thể nhận thấy một điều rằng class HelloWorldService quản lý việc tạo ra đối tượng HelloWorld.

– Trong trường hợp trên khi một đối tượng HelloWorldService được tạo ra từ cấu tử của nó, đối tượng HelloWorld cũng được tạo ra và nó được tạo từ StrutsHelloWorld

Câu hỏi đặt ra là bạn muốn tạo ra đối tượng HelloWorldService đồng thời đối tượng HelloWorld được tạo, nhưng nó phải là SpringHelloWorld.

Như vậy ở đây là HelloWorldService đang điều khiển “object creation” của HelloWorld. Tại sao chúng ta không chuyển việc tạo HelloWorld cho một bên thứ 3 sử lý thay vì làm ở HelloWorldService. Chúng ta có khái niệm “inversion of control” nghĩa là “Sự đảo ngược điều khiển” (IoC).

IoC Container sẽ đóng vai trò người quản lý việc tạo ra cả HelloWorldService lẫn HelloWorld.

IoC = Inversion of Control

IoC Container tạo ra đối tượng HelloWorldService và đối tượng HelloWorld sau đó pass HelloWorld vào HelloWorldService thông qua setter. 

Việc IoC Container đang làm chính là “tiêm sự phụ thuộc” ( Dependency Injection) vào HelloWorldService . Sự phụ thuộc ở đây nghĩa là sự phụ thuộc giữa các object : HelloWorldServiceHelloWorld

Tới đây ta đã xác định được rõ thế nào là IoC& DI. Hãy cùng làm ví dụ HelloWorld để hiểu rõ hơn.

2. Tạo Project Java Spring MVC:

Nhấn File > New > Other> chọn Maven> Maven Project sau đó nhấn next

Làm theo như hình dưới:

Nhập vào:

Group Id: ictdiscovery
Artifact Id: HelloSpring

Cấu trúc file và thư mục được tạo ra giống phần ô đỏ dưới hình sau:

Hãy chắc chắn rằng Project được buil trên Java 7 hoặc lớn hơn bằng cách chọn vào project HelloSpring chọn properties

3. Cấu hình và khai báo các thư viện cho Spring MVC 4:

Phần khai báo các thư viện này rất quan trọng chúng ta nên đọc kỹ và lưu lại để tái sử dụng lần sau.

Giải bài toán kinh điển HelloWorld trong lập trình này, chỉ cần sử dụng thư viện spring cơ bản (core)

Mở file pom.xml khai báo các thư viện sẽ sử dụng:

<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>ictdiscovery</groupId>
 <artifactId>HelloSpring</artifactId>
 <version>0.0.1-SNAPSHOT</version> 
      <dependencies>
       <!-- Spring Core -->
       <!-- http://mvnrepository.com/artifact/org.springframework/spring-core -->
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-core</artifactId>
           <version>4.1.4.RELEASE</version>
       </dependency>
     
       <!-- Spring Context -->
       <!-- http://mvnrepository.com/artifact/org.springframework/spring-context -->
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-context</artifactId>
           <version>4.1.4.RELEASE</version>
       </dependency>    
   </dependencies>

</project>

4. Tạo và viết code cho các Controller

Code file HelloWorld.java 

package ictdiscovery.spring.helloworld;
/*
 * author ictDiscovery
 * Vesion 1.0 Jul 8, 2016
 */
public interface HelloWorld {
 
    public void sayHello();
   
 }

Code file HelloWorldService.java

package ictdiscovery.spring.helloworld;
/*
 * author ictDiscovery
 * Vesion 1.0 Jul 8, 2016
 */
public class HelloWorldService {
 private HelloWorld helloWorld;
 
    public HelloWorldService() {
 
    } 
    public void setHelloWorld(HelloWorld helloWorld) {
        this.helloWorld = helloWorld;
    } 
    public HelloWorld getHelloWorld() {
        return this.helloWorld;
    }
}

Code file SpringHelloWorld.java 

package ictdiscovery.spring.helloworld.impl;
import ictdiscovery.spring.helloworld.HelloWorld;
/*
 * author ictDiscovery
 * Vesion 1.0 Jul 8, 2016
 */
public class SpringHelloWorld implements HelloWorld {
  public void sayHello() {
        System.out.println("Spring Say Hello!!");
    }
}

Code file StrutsHelloWorld.java

package ictdiscovery.spring.helloworld.impl;
import ictdiscovery.spring.helloworld.HelloWorld;
/*
 * author ictDiscovery
 * Vesion 1.0 Jul 8, 2016
 */
public class StrutsHelloWorld implements HelloWorld {
 
    public void sayHello() {
        System.out.println("Struts Say Hello!!");
    } 
 }

Code file HelloProgram.java

package ictdiscovery.spring;
import ictdiscovery.spring.helloworld.HelloWorld;
import ictdiscovery.spring.helloworld.HelloWorldService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/*
 * author ictDiscovery
 * Vesion 1.0 Jul 8, 2016
 */
public class HelloProgram {
 public static void main(String[] args) {
     
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
       
        HelloWorldService service = (HelloWorldService) context.getBean("helloWorldService");
       
        HelloWorld hw= service.getHelloWorld();
       
        hw.sayHello();
    }
}

Code file beans.xml

<beans xmlns="http://www.springframework.org/schema/beans"
   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.xsd">

   <bean id="springHelloWorld"
       class="ictdiscovery.spring.helloworld.impl.SpringHelloWorld"></bean>
   <bean id="strutsHelloWorld"
       class="ictdiscovery.spring.helloworld.impl.StrutsHelloWorld"></bean>

   <bean id="helloWorldService"
       class="ictdiscovery.spring.helloworld.HelloWorldService">
       <property name="helloWorld" ref="springHelloWorld" />
   </bean>

</beans>

5. Chạy kết quả
Chạy class HelloProgram.java bằng cách nhấn chuột phải 

Kết quả chạy class HelloProgram.

Như vậy là chúng ta đã kết thúc bài.

Download code của project  tại đây: http://bit.ly/29niww5

Comments (0)

Leave a Reply

Your email address will not be published. Required fields are marked *