ICTsharing - Blog chia sẻ kiến thức về ICT: spring-mvc

Hot

Post Top Ad

Hiển thị các bài đăng có nhãn spring-mvc. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn spring-mvc. Hiển thị tất cả bài đăng

Thứ Sáu, 22 tháng 7, 2016

Giới thiệu về Spring Framework

14:14 0
Spring Framework, hay ngắn hơn là Spring, là một cấu trúc dùng để xây dựng chương trình ứng dụng mã nguồn mở dành cho ngôn ngữ lập trình Java. Phiên bản đầu tiên của nó do Rod Johnson viết, và đã được ông xuất bản cùng với quyển sách đầu tay Expert One-on-One Java EE Design and Development (Nhà xuất bản Wrox Press, Tháng 10 năm 2002) - tạm dịch là "Thiết kế và kiến tạo Java EE - tương giao cá nhân một đối một chuyên ngành". Phiên bản phần mềm này cũng còn được xuất sang nền tảng .NET (.NET platform), được gọi là Spring.net.


Kiến trúc của Spring Framework được ra mắt công chúng lần đầu tiên hồi tháng 6 năm 2003 dưới Giấy phép Apache - phiên bản 2.0. Phiên bản 1.0 đánh dấu mốc thành đạt đầu tiên được xuất bản vào tháng 3 năm 2004, và tiếp đó vào tháng 9 năm 2004, tháng 3 năm 2005.

Tuy Spring Framework không bắt buộc người ta phải tuân theo một mô hình lập trình (programming model) cụ thể nào, song nó lan truyền rộng rãi trong cộng đồng những người viết chương trình dùng Java, như một hình thức chủ yếu thay thế cho mô hình Enterprise JavaBean. Theo thiết kế, bộ khung hình này giải phóng lập trình viên dùng Java, cho phép họ nhiều quyền tự do hơn, và đồng thời cung cấp một giải pháp tiện lợi, đầy đủ dẫn chứng bằng tài liệu, dễ dàng sử dụng, phù hợp với những thực hành thông dụng trong công nghệ phần mềm.

Bên cạnh những đặc trưng nền tảng của Spring Framework là những cái có thể dùng được trong bất cứ một chương trình ứng dụng Java nào, rất nhiều các mở rộng và tiến bộ trong việc kiến tạo các trình ứng dụng dành cho nền tảng mạng web (web-based application) dựa trên nền Java Enterprise cũng tồn tại nữa. Spring Framework nổi tiếng cũng một phần do chính đặc thù kể trên và được giới thương mại công nhận như một nền tảng kiến trúc có tầm quan trọng trong chiến lược kiến tạo phần mềm.

Tính năng chủ yếu

- Bao gồm bộ quản lý cài đặt rất có hiệu lực dựa trên JavaBeans, áp dụng lý thuyết đảo ngược quyền khống chế (IoC) làm cho việc mắc nối các chương trình ứng dụng trở nên nhanh chóng và dễ dàng hơn. Việc sử dụng (IoC) trong khung hình Spring Framework còn được ám chỉ đến với cái tên Dependency Injection (DI) (Nghĩa đen: bơm hay tiếp thành phần phụ thuộc, từ bên ngoài vào, lúc cần thiết, thay vì phải tự tạo từ bên trong). Nguyên lý của IoC sử dụng trong Spring Framework là một kỹ thuật nhằm ngoại biên hóa (externalize) việc kiến tạo và quản lý những thành phần phụ thuộc. Lấy ví dụ trường hợp lớp "Foo" phụ thuộc vào một trường hợp cá biệt của lớp "Bar" để thi hình một nhiệm vụ nào đấy. Theo phương pháp cổ truyền, "Foo" phải tự kiến tạo trường hợp cá biệt của lớp "Bar", dùng hành động "new", hoặc phải tiếp nhận trường hợp cá biệt của lớp này từ một lớp chế xuất nào đấy (factory class). Nếu sử dụng tiếp cận của IoC thì một tiến trình ngoại biên sẽ phải cung cấp trường hợp của "Bar" (hoặc một tiểu lớp của nó) cho "Foo" trong thời gian chạy (runtime). Đây chính là nguyên nhân tại sao "DI" là một thành ngữ diễn tả tính năng của Spring Framework rõ hơn "IoC".

- Bao gồm một mẫu hình chế xuất trừu tượng (abstract factory pattern) Enterprise Java Beans (EJB) nòng cốt, có thể sử dụng trong bất cứ môi trường nào, từ những khung chứa (containers) applet cho đến Java EE.

- Một lớp trừu tượng chung quản lý giao dịch cơ sở dữ liệu (database transaction), cho phép các bộ phận quản lý giao dịch được bổ trợ theo lối lắp ráp (pluggable), và tạo điều kiện thuận lợi cho việc phân định danh giới các giao dịch (demarcate transactions) mà không cần phải xử lý với những vấn đề ở tầng dưới (low-level issues).

- Bao gồm một số các chiến lược phổ thông đã được cài sẵn bên trong (Built-in generic strategies) dành cho JTA và một đơn thể nguồn dữ liệu JDBC (DataSource). Đối lập với những giao dịch do khung chứa quản lý (Container-Managed Transactions - CMT) đơn thuần trong JTA hoặc EJB, hỗ trợ giao dịch trong bộ khung Spring không đòi hỏi môi trường Java EE.

- Tầng liên nối với cơ sở dữ liệu (JDBC abstraction layer ) cung cấp một cơ chế tầng cấp đầy ý nghĩa đối với những ngoại lệ (exception hierarchy) (không còn phải dựa vào việc nắn bóp mã nguồn của nhà sản xuất phần mềm như đối với SQLException nữa), đơn giản hóa việc xử lý lỗi, và cũng đồng thời thuyên giảm số lượng dòng lệnh mà lập trình viên cần phải viết. Lập trình viên sẽ không bao giờ phải viết khối 'finally' trong các dòng mã sử dụng JDBC nữa.

- Tích hợp với Hibernate, JDO và iBATIS SQL Maps: trên phương diện cầm dữ tài nguyên (resource holders), hỗ trợ phần thực thi DAO (Data Access Object - Đối tượng truy cập dữ liệu), và các chiến lược giao dịch (transaction strategies). Đứng hàng đầu trong việc hỗ trợ Hibernate với rất nhiều tính năng IoC tiện dụng, giải quyết nhiều nan đề trong việc tích hợp với Hibernate. Tất cả những tính năng này đều phục tùng cơ chế tầng cấp giao dịch chung cùng tầng cấp ngoại lệ DAO của Spring.

- Khung hình mô hình-giao diện-điều khiển (Model-view-controller, hay MVC) linh hoạt dành cho ứng dụng mạng (web application), được gây dựng trên tính năng nền tảng của Spring. Các nhà xây dựng phần mềm (lập trình viên) có quyền khống chế cao độ trong khung hình này thông qua những giao diện chiến lược (strategy interfaces), đồng thời điều tiết với những kỹ thuật đa giao diện (multiple view technologies) như JSP, FreeMarker, Velocity, Tiles, iText, và POI. Nên nhớ là Tầng trung gian của Spring có thể dễ dàng kết hợp với một tầng mạng sử dụng bất cứ một khung hình MVC mạng nào đó (web MVC framework), như Struts, WebWork, hoặc Tapestry.

- Khung hình lập trình định dạng (Aspect-oriented programming - hay AOP) nhằm cung cấp các dịch vụ như dịch cụ quản lý giao dịch (transaction management). AOP cung cấp khả năng thực thi lôgic đan kết (crosscutting logic) - tức những lôgic tác động đến rất nhiều phần của chương trình ứng dụng - tại cùng một chỗ (nhóm lại) và để cho lôgic ấy áp dụng xuyên suốt chương trình ứng dụng của mình một cách tự động.

- Vì những khó khăn trong việc kiến lập một cấu trúc mạch lạc để thiết kế phần mô hình (Model part) trong chương trình ứng dụng, khi áp dụng mô hình MVC (design pattern) (ví như Struts), khả năng Spring tạo điều kiện cho người sử dụng làm việc một cách dễ dàng có nghĩa là các nhà xây dựng có thể nhanh chóng điều chỉnh lại những tiếp cận không thành quả của mình để lợi dụng tầng lớp JDBC trừu tượng của Spring Framework.

Các module


Spring Framework được coi như là một tổ hợp của nhiều khung hình nhỏ, hay nói cách khác, nó là tổ hợp của khung hình trong khung hình. Đại bộ phận các khung hình này được thiết kế để hoạt động biệt lập với các khung hình khác, song lại tạo nên nhiều chức năng tốt hơn khi được phối hợp làm việc với nhau. Những khung hình này được phân loại theo các khối nền cơ bản mà những chương trình phần mềm phức tạp điển hình thường sử dụng:

 - Khung chứa đảo ngược khống chế (Inversion of Control container): Sự cài đặt các thành phần của chương trình ứng dụng và quản lý chu trình của các đối tượng trong Java (lifecycle management of Java objects).

 - Khung hình lập trình định dạng (Aspect-oriented programming framework): làm việc với những chức năng không thể sử dụng năng lực lập trình hướng đối tượng của Java để thực thi mà không phải hy sinh.

 - Khung hình truy cập dữ liệu (Data access framework): làm việc với các hệ quản trị cơ sở dữ liệu quan hệ trên nền tảng Java sử dụng JDBC và các công cụ liên kết quan hệ đối tượng (Object-relational mapping) cung cấp giải pháp cho những thử thách về kỹ thuật mà chúng có thể tái sử dụng trong bội số các môi trường sử dụng Java.

 - Khung hình quản lý giao dịch (Transaction processing / Transaction management framework): Sự đồng hòa các API quản lý giao dịch và sự điều hợp quản lý giao dịch đối với các đối tượng Java dùng phương pháp cài đặt.

 - Khung hình mô hình-giao diện-điều khiển (Model-view-controller framework): Khung hình dựa trên nền tảng HTTP và Servlet cung cấp rất nhiều móc điểm có thể mở rộng và cải biên (extension and customization).
 
 - Khung hình truy cập từ xa (Remote Access framework): Xuất nhập khẩu các đối tượng Java trên mạng lưới truyền thông hỗ trợ các giao thức dựa trên nền HTTP, sử dụng phong cách RPC (Remote procedure call) thông qua cài đặt , như RMI (Java remote method invocation - khởi động phương pháp từ xa trong Java), CORBA và dịch vụ mạng (web services - SOAP).

 - Khung hình xác thực và ủy quyền (Authentication and authorization framework): Sự điều hợp các quá trình xác thực và ủy quyền thông qua cài đặt hỗ trợ nhiều tiêu chuẩn công nghiệp và những tiêu chuẩn được sử dụng phổ biến, cũng như các giao thức, công cụ và các thói quen thực hành phổ dụng.

 - Khung hình quản lý từ xa (Remote Management framework): Sự quản lý và quảng bá các đối tượng Java đối với các bố trí địa phương và bố trí ngoại biên thông qua JMX (Java Management Extension - quản lý mở rộng của Java cho phép các phần mềm không trực thuộc Java có thể lắp ráp vào và sử dụng được trong nền tảng Java).

 - Khung hình truyền thông điệp (Messaging framework): đăng ký các đối tượng lắng nghe thông điệp dùng để tiếp thu và sử dụng thông điệp từ các hàng thông điệp (message queue) thông qua JMS (Java Message Service - Dịch vụ Thông điệp của Java), cải tiến việc truyền gửi thông điệp dùng tiêu chuẩn trong API của JMS.

 - Khung hình kiểm thử phần mềm (Software testing framework): Những chủ thể (lớp) hỗ trợ việc viết các kiểm thử đơn vị và các kiểm thử tích hợp (unit tests and integration tests).

Bài viết tham khảo trên laptrinh
Xem thêm

Thứ Sáu, 8 tháng 7, 2016

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

16:17 0
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:

HelloSpring > pom.xml 



File pom.xml:

<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
Xem thêm

Post Top Ad

Your Ad Spot