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

Tạo kết nối động đến DB trong mô hình MVC Pattern trên Web Server (Tomcat)

MVC_Voi_DynamicDB

Tạo kết nối động đến DB trong mô hình MVC Pattern trên Web Server (Tomcat)

Mục đích: Chủ đề của bài này chúng tôi mở rộng mô hình của bài MVC Pattern trên Web trong chủ đề “MVC Pattern trên Web – Mô hình thiết kế ứng dụng theo dạng Model – View – Controller” bằng cách thực hiện liên kết động trên với DB – CSDL để có thể deploy ứng dụng khắp mọi nơi mà không cần biên dịch lại code khi địa chỉ kết nối DB bị thay đổi.

Tạo kết nối động đến DB trong mô hình MVC Pattern trên Web Server (Tomcat)

Mục đích: Chủ đề của bài này chúng tôi mở rộng mô hình của bài MVC Pattern trên Web trong chủ đề “MVC Pattern trên Web – Mô hình thiết kế ứng dụng theo dạng Model – View – Controller” bằng cách thực hiện liên kết động trên với DB – CSDL để có thể deploy ứng dụng khắp mọi nơi mà không cần biên dịch lại code khi địa chỉ kết nối DB bị thay đổi.

Chúng ta thấy rằng nội dung chủ đề “MVC Pattern trên Web – Mô hình thiết kế ứng dụng theo dạng Model – View – Controller” đã tạo sự linh hoạt, uyển chuyển và chia từng thành phần component riêng biệt trong thiết kế dẫn đến dễ dàng chỉnh sửa, nâng cấp cho phần mềm. Tuy nhiên, trong mô hình đó chúng ta thấy việc kết nối với DB vẫn là các chuỗi liên kết cố định và hằng trong code, dẫn đến một khuyết điểm mà chúng ta gặp phải là khi deploy đến các server khác thi không thể deploy hay phải có source code để mở code, chỉnh sửa chuỗi kết nối, biên dịch, đóng gói và deploy lại – một vấn đề vô cùng phức tạp và khó khăn

Do vậy, ở chủ đề bài này chúng tôi hướng tới thực hiện liên kết động đến DB và tạo sự thuận lợi nhất cho người dùng – người deloy khi triển khai ứng dụng trên các server và các máy khác nhau tương tự trong tập tin datasource của EJB (cụ thể là jboss-ds.xml) mà chúng ta đã thấy triển khai trong các bài về entity bean trong JBoss Server. Ở đây, chúng ta sẽ thực hiện nội dung tương tự như thế thông qua việc cấu hình tập tin XML cho ứng dụng web

  • Yêu cầu
    • Nắm vững các khái niệm về MVC và cách cài đặt mô hình MVC (vui lòng xem lại chủ đề “MVC Pattern trên Web – Mô hình thiết kế ứng dụng theo dạng Model – View – Controller”)
    • Nắm vững về ngôn ngữ lập trình Java, lập trình thao tác hướng đối tượng
    • Cách thức sử dụng JSTL, EL, HTML
    • Tools sử dụng ở đây là Netbeans 6.9.1
    • JDK 6 update 22
    • Server: Tomcat 6.0.26
    • DBMS: SQL Server 2005
    • Thư viện hỗ trợ: JSTL 1.1, Driver kết nối database SQLServer (sqljdbc.jar hay sqljdbc4.jar)
    • Chúng tôi sẽ sử dụng lại toàn bộ ứng dụng – project MVCDemo để thực hiện một số chức năng kết nối động để tăng thêm tính hiệu quả trong mô hình MVC
  • Các bước cải tiến và bổ sung thực hiện như sau
    • Mở lại project MVCDemo

    • Để cấu hình việc truy cập DB động, chúng ta có khái niệm Datasource là thành phần tên xác định việc truy cập DB mà không cần quan tâm DB được host tại địa chỉ IP nào, ở đâu mà chỉ cần biết tên truy cập Datasource là được.
    • Vấn đề trên là tính ưu việc trong khái niệm Transparency đó là người dùng không cần biết service – dịch vụ ở đâu mà chỉ biết rằng có service đó tồn tại để yêu cầu. Do vậy, trong quá trình dịch vụ đáp ứng yêu cầu nếu có sự cố xảy ra trên server hay việc crash thì hệ thống tự tìm các dịch vụ tương ứng để đáp ứng mà không cần gián đoạn công việc xử lý của server và đáp ứng đúng và nhanh chóng yêu cầu của người dùng
    • Trong nội dung khái niệm mô hình MVC, chúng tôi có để cập cấu trúc thư mục web. Đặc biệt trong đó có thư mục META-INF mà chúng tôi đã nói rằng, nội dung trong tập tin này dùng để ánh xạ với một số thông tin hỗ trợ thêm từ bên ngoài project.
    • Bây giờ, chúng ta sẽ sử dụng thư mục này để mapping động với DB. Cụ thể là tập tin context.xml.

      • Chúng ta mở tập tin này ra và chúng ta thấy nó đang xác định context Path của ứng dụng web thông qua thuộc tính path. Chính nội dung này giúp cho ứng dụng web khi deploy trên server có context path gọi ứng dụng như là chúng ta thấy http://localhost:port/contextPath.
      • Chúng ta có thể đổi tên contextPath thông qua các trị path của tập tin này. Bây giờ, chúng ta sẽ bổ sung nội dung cấu hình để lấy kết nối DB từ bên ngoài vào trong ứng dụng. Và lần nữa, tập tin này tập tin xml, do vậy chúng ta có thể dễ dàng chỉnh sửa và không cần biên dịch lại code hay mở source code chỉnh sửa khi deloy
      • Chúng ta bổ sung chỉnh sửa tập tin context.xml này như sau

        • Lưu ý:
          • name: tên Datasource do chúng ta tự đặt để sau này để kết nối DB chúng ta sẽ tìm kiếm tên datasource này
          • auth: chúng ta thông báo để container hỗ trợ cơ chế thực hiện mở kết nối, đóng kết nối
          • type: xác định kiểu dữ liệu của datasource, ở đây chúng ta sử dụng gói javax.sql.DataSource
          • username và password: username và password dùng để kết nối với DB của thể
          • driverClassName: xác định driver dùng để kết nối đến DB
          • url: chuỗi connect string để kết nối đến DB Server cụ thể
          • maxActive: tại 1 thời điểm cho phép bao nhiêu instance connection được mở cùng 1 lúc
          • maxIde: ở trạng thái không sử dụng thì cho phép bao nhiêu instance connection đuợc duy trì
      • Chúng ta đã mapping và cấu hình liên kết với DB tuy nhiên ứng dụng vẫn không biết datasource nào được đưa vào trong ứng dụng để sử dụng. Do vậy, chúng ta phải thực hiện cấu hình thông báo với ứng dụng web để ứng dụng yêu cầu container cung cấp việc hỗ trợ kết nối đến DB
      • Chúng ta mở tập tin web.xml và chọn tab XML để cập nhật bổ sung tập nội dung vào tập tin như sau

        • Chúng ta bổ sung resource-ref để tham chiếu đến resource bên ngoài. Trong đó
          • res-ref-name: tên ánh xạ tư thuộc tính name khai báo trong context.xml (ở đây sẽ là DBCon)
          • res-type: loại dữ liệu dùng cho resource được khai báo trong type của tập tin context.xml (ở đây sẽ là javax.sql.DataSource)
          • res-auth: cơ chế hỗ trợ được khai báo trong auth của tập tin context.xml (ở đây sẽ là Container)
    • Bây giờ, chúng ta sẽ thực hiện thay thế các liên kết tĩnh bằng liên kết động tương ứng theo các bước sau
      • Bước 1: Xác định context hiện hành của môi trường chúng ta đang làm việc để từ đó chúng ta xác định các đặt tên thư mục và tập tin trong một hệ điều hành cụ thể để tạo nên sự độc lập về hệ điều hành, không lệ thuộc hệ điều hành
      • Bươc 2: Xác định môi trường container hỗ trợ kết nối và tạo kết nối. Đa số qui định trong J2EE/JavaEE server môi trường mặc định là xác định qua context “java:comp/env”
      • Bước 3: Tìm kiếm tên Datasource khai báo thông qua môi trường hỗ trợ của container hay server
      • Bước 4: Thực hiện lấy connection từ datasource và thực hiện các bước xử lý trên database như những bước trong mô hình MVC trước
    • Chúng ta áp dụng bước trước trên để thực hiện chỉnh sửa các phần kết nối tĩnh với kết nối động như sau
      • Chức năng Login

      • Chức năng Search

      • Chức năng insert

      • Chức năng Delete

      • Chức năng Update

    • Start Server Tomcat, Build Project, Deploy và Test

      • Nếu check sai, click vào “here” của nội dung “Click here to try again”, chúng ta sẽ quay lại trang login page. Nếu click vào link Regiser sẽ chuyển sang trang Register

      • Thực hiện chức năng Register với hàm tương ứng là insert
        • DB trước khi thao tác

        • Test

      • DB sau khi Register

      • Sau khi  login in thành công, hệ thống sẽ chuyển sang trang search. Chúng ta test chức năng Search như sau

        • Thực hiện chức năng Delete

 

        • DB được cập nhật tương ứng

      • Chúng ta thực hiện tiếp tục với chức năng Update lastname và roles

          • Nhập liệu chỉnh sửa

          • Nhấn nút Update

        • DB được cập nhật

Chúc mừng các bạn đã hoàn tất việc nâng cao kiến thức về cách cài đặt ứng dụng web theo mô hình MVC để thể hiện tính ưu việt của mô hình và sự hỗ trợ của server hay container để mô hình này mang tính linh hoạt và uyển chuyển cao (đó là kết nối động với database). Qua đó chúng ta thấy được các ưu điểm và khuyết điểm của mô hình này.

Chúng tôi hy vọng nội dung của bài này giúp ích các bạn trong việc cài đặt mô hình ứng dụng web áp dụng MVC trong các ứng dụng thực tế

Rất mong sự góp ý chân thành và chia sẻ của quí vị về vấn đề này. Hẹn gặp lại quý vị ở chủ đề khác

5 nhận xét:

  1. Hi thầy, khi e dùng hàm này
    Context envCtx = (Context) ctx.lookup("java:comp/env");
    thì nó báo lỗi,
    -----
    Exception in thread "main" javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:662)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)
    at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:350)
    at javax.naming.InitialContext.lookup(InitialContext.java:417)
    at mvc.LoginBean.main(LoginBean.java:80)
    ---
    mong thầy kiểm tra và fix giúp e,
    e xin cám ơn.

    Trả lờiXóa
    Trả lời
    1. Mọi thứ vẫn bình thường.
      Lưu ý, bài đang sử dụng server Tomcat. Bên cạnh đó, xem kỹ thư viện import của Context

      Regards

      Xóa
  2. Bài viết tuyệt vời

    Trả lờiXóa