12/14/2013

Web-Applicatoin với Servlet3.0 và CDI

1. Giới Thiệu

Trong bài này mình sẽ tạo ứng dụng đơn giản sử dụng CDI và Servlet 3.0

Những công cụ cần thiết:

 - Eclipse
 - Tomcat7
 - CDI (Context and Dependency Injection) là
 - Servlet 3.0

2. Tạo project

Để việc phát triển dễ dàng thì mình sẽ tạo project Maven. Với maven thì việc thêm các thư viện cần thiết (dependencies) sẽ được làm tự động. Các bước tạo như sau:

1. Chọn new project và chọn maven project





2. Vì tạo project maven đơn giản nên ở đây sẽ check vào checkbox "Create a simple project"

3. Nhập thông tin về package, tên project, version


4. Thêm các thư việc cần thiết để phát triển.

Ở đây chúng ta sẽ dùng Servet 3.0, CDI 1.0 và Weld 1.1.16 là thư viện implement cho CDI.
File pom.xml sẽ như sau:


 4.0.0
 vn.com.giaphd.sample
 web-cdi-sample
 0.0.1-SNAPSHOT

 
  
  
   javax.servlet
   javax.servlet-api
   3.0.1
  
  
  
   javax.enterprise
   cdi-api
   1.0
   provided
  
  
  
   org.jboss.weld.servlet
   weld-servlet
   1.1.16.Final
  
 




3. Coding

Để sử dụng CDI thì chúng ta sử dụng annotation @Inject
Với việc sử dụng annotation này thì CDI sẽ tự động Inject vào Servlet và quản lý bới Context của CDI.
Chú ý: Với version hiện tại, thì CDI chỉ support Injection vào Servlet, Filter và Listener. Ngoài ra thì không thể inject được.

#1. Viết Servlet có sử dụng CDI.

Từ Servlet3.0 thì chúng ta có thể sử dụng annotation để khai báo Servlet mà không cần phải khai báo trong file web.xml. (Servlet2.5 trở về trước thì bắt buộc phải khai báo trong web.xml)

package vn.com.giaphd.sample.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.inject.Inject;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import vn.com.giaphd.sample.service.HelloService;

/**
 * @author giapmaster@gmail.com
 * 
 * @version 0.0.1
 * @since 0.0.1
 */
@WebServlet("/sample")
public class SampleServlet extends HttpServlet {
 /** serialVersionUID */
 private static final long serialVersionUID = 1L;

 static String PAGE_HEADER = "";

 static String PAGE_FOOTER = "";

 @Inject
 private HelloService helloService;

 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

  PrintWriter writer = resp.getWriter();
  writer.println(PAGE_HEADER);
  writer.println("

" + helloService.createHelloMessage("GiapHD") + "

"); writer.println(PAGE_FOOTER); writer.close(); } }

Ở đây chúng ta sử dụng CDI để @Inject helloService bằng CDI.
Với CDI thì khi sử dụng chúng ta không cần phải khai báo New mà Context sẽ quản lý và làm giúp:

 @Inject
 private HelloService helloService;

#2. Tạo HelloService để @Inject

Class HelloService chỉ là clas Java bình thường thông thường là class thực hiện bussiness của ứng dụng.
Để có thể CDI thì class phải thõa mãn một số điều kiện (ở đây mình không đề cập).
Về nội dung class như sau:

package vn.com.giaphd.sample.service;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

/**
 * @author giapmaster@gmail.com
 * 
 * @version 0.0.1
 * @since 0.0.1
 */
public class HelloService {
 
 public String createHelloMessage(String name) {
  return "Hello " + name + "!";
 }
}


#3. Tạo file beans.xml

Khi sử dụng CDI thì bắt buộc phải tạo file beans.xml để khai báo rằng chúng ta sẽ sử dụng CDI.
File beans.xml phải được đặt trong folder WEB-INF/beans.xml (hoặc META-INF/beans.xml đối với không phải là web).
Nội dung file beans.xmls dùng để config tùy biến cách dùng của CDI. Thông thường thì là file trống không chứa nội dung gì hoặc chỉ chứa phần định nghĩa scheme.




#4. Tạo file web.xml

Với việc sử dụng Servlet3.0 thì chúng ta sẽ không cần khai báo servlet trong web.xml nữa.
Ở đây chúng ta sẽ khai báo Weld listener để khởi động cho CDI và resource

 web-cdi-sample
 CDI Web sample by GiapHD

 
 
  org.jboss.weld.environment.servlet.Listener
 
 
 
  BeanManager
  javax.enterprise.inject.spi.BeanManager
 




#5. Tạo file context.xml


    
    WEB-INF/web.xml
    META-INF/context.xml


4. Demo

Thực hiện deploy ứng dụng lên Tomcat7.
Khi deploy thành công thì console sẽ hiển thị thông tin như sau:



Vào browser gõ địa chỉ sau để xem kết quả:
http://localhost:8080/web-cdi-sample/sample
Và kết quả sẽ như sau:



5. Xử lý lỗi

Trường hợp deploy mà chương trình thông báo không tìm thấy class Listener của Weld thì hãy thêm đoạn setting như sau:

Right click tại project, chọn Property -> Deployment Assembly.
T/H chưa có thư viện maven thì hãy chọn Add -> [Java build path entry] -> [Maven Dependencies]
Kết quả sẽ như bên dưới.



Như vậy chúng ta đã hoàn thành tạo ứng dụng web đơn giản sử dụng công nghệ CDI và Servlet 3.0. YEAH!
Về source code của chương trình các bạn có thể download tại link sau:
https://github.com/giapmaster/samples

Không có nhận xét nào:

Đăng nhận xét

Bạn thấy nội dung bài viết thế nào?