Trong bài viết này chúng ta sẽ đi dựng project java web để tiến hành lập trình, thêm dữ liệu mẫu vào database và thực hiện kết nối tới databse

#1 Dựng project

– Các bạn tạo một Dynamic Web Project mới với tên bất kỳ.

– Tạo các folder và các package mới như trong hình.
hoc-lap-trinh-java-web

* Lưu ý: Để tạo folder mới trong thư mục WebContent các bạn kích chuột phải vào WebContent chọn New -> Folder, đặt tên và Finish.

Trong đó:

Các folder:
css: chứa các file css
– images: chứa các hình ảnh như logo,… trong đó có folder con là bg: chứa các hình ảnh được dùng làm background trong website
js: chứa các file JavaScript
jsp: chứa các file .jsp (View) trong đó folder backend: chứa các trang jsp admin, frontend: chứa các trang jsp client
upload: chứa các hình ảnh được tải lên bao gồm avatar người dùng chứa trong thư mục avatar, hình ảnh bài viết chứa trong thư mục thumb.

Các packge:
com.khanhspring.javawebdemo.model: chứa các class ánh xạ tới các bảng trong cơ sở dữ liệu
com.khanhspring.javawebdemo.dao: chứa các class có nhiệm vụ thực hiện các tương tác tới cơ sở dữ liệu.
com.khanhspring.javawebdemo.service: chứa các class có nhiệm vụ thực hiện các business logic (xử lý nghiệp vụ).
com.khanhspring.javawebdemo.controller: chứa các class servlet thực hiện nhận request từ client và trả về view tương ứng
com.khanhspring.javawebdemo.utils: chứa các class utilities.

#2 Thêm dữ liệu mẫu

Để dễ dàng cho việc lập trình, kiểm tra sự chính xác của các đoạn code khi tương tác với database chúng ta cần thêm dữ liệu mẫu cho các bảng trong database.

* Lưu ý: Để không bị lỗi khi thêm chúng ta cần thêm ở các bảng không có khóa chính trước.

– Ở đây mình sẽ demo việc thêm dữ liệu ở bảng App_Params để các bạn dễ hình dung chức năng của bảng này. Đây là một số bản ghi:
(null, ‘COMMENT_STATUS’, ‘Chờ duyệt’, 0, ‘Chờ duyệt’, 1, 0, “#F8DB65”),
(null, ‘COMMENT_STATUS’, ‘Hiển thị’, 1, ‘Hiển thị’, 1, 1, “#2DCC70”),
(null, ‘COMMENT_STATUS’, ‘Spam’, 2, ‘Spam’, 1, 2, “#E84C3D”),
(null, ‘COMMENT_STATUS’, ‘Bin’, 3, ‘Đã chuyển vào thùng rác’, 1, 3, “#BFC2C7”).

-> đây là các trạng thái comment. Ví dụ: khi comment được đánh dấu là “chờ duyệt” thì đặt trường status của bảng comment đó với giá trị là 0. Khi truy vấn để hiển thị ra màn hình chúng ta chỉ cần select với Par_Type = ‘COMMENT_STATUS’ và Par_Code là 0 => ‘Chờ duyệt’.

– Tương tự với Post Status:
(null, ‘POST_STATUS’, ‘draft’, 0, ‘draft’, 1, 0, “#F8DB65”),
(null, ‘POST_STATUS’, ‘publish’, 1, ‘publish’, 1, 1, “#2DCC70”),
(null, ‘POST_STATUS’, ‘bin’, 3, ‘Đã chuyển vào thùng rác’, 1, 3, “#BFC2C7”),

– Tương tự với Page Status:
(null, ‘PAGE_STATUS’, ‘draft’, 0, ‘draft’, 1, 0, “#F8DB65”),
(null, ‘PAGE_STATUS’, ‘publish’, 1, ‘publish’, 1, 1, “#2DCC70”),
(null, ‘PAGE_STATUS’, ‘bin’, 3, ‘Đã chuyển vào thùng rác’, 1, 3, “#BFC2C7”)

* Lưu ý: ở đây trường Par_ID đề để null là vì trường này được xác định là Autoincrement (Tự động tăng) nên khi insert vào là null thì nó sẽ tự động set giá trị tăng tự động cho trường này.

– Như vậy bảng App_Params đã khá đầy đủ rồi. Các bạn có thể thêm nếu thấy hợp lý.

– Thêm dữ liệu cho bảng categories:
(1, ‘Học tập’, ‘Các bài viết về học tập’, null, ‘hoc-tap’, null),
(2, ‘Java’, ‘Các bài viết về Java’, 1, ‘java’, ‘/1/’),
(3, ‘Java Core’, ‘Các bài viết về Java Core’, 2, ‘java-core’, ‘/1/2/’)

– Thêm dữ liệu cho bảng: Images
* Trước tiên bạn thêm một vài hình ảnh vào các thư mục trong upload sau đó insert các giá trị tương ứng:
(null, ‘image1’, ‘/upload/avatar/image1.jpg’, null, ‘2015-06-07 00:00:00’),
(null, ‘image2’, ‘/upload/thumb/image2.jpg’, null, ‘2015-06-07 00:00:00’),
(null, ‘image3’, ‘/upload/thumb/image3.jpg’, null, ‘2015-06-07 00:00:00’),
(null, ‘image4’, ‘/upload/thumb/image4.jpg’, null, ‘2015-06-07 00:00:00’)

– Thêm dữ liệu cho bảng: Users
(1, ‘Xuân Khánh’, ‘Trần’, 1, ‘xuankhanhyb@gmail.com’, SHA1(‘123456’), ‘ADMIN_ROLE’, null, ‘2015-06-07 00:00:00’, ‘/upload/avatar/image1.jpg’);

– Thêm dữ liệu cho bảng Posts:
(null, ‘Java web demo’, 2, 1, ‘Đây là nội dung bài viết 1’, ‘bai-viet-1’, ‘2015-06-07 00:00:00’, ‘2015-06-07 00:00:00’, ‘/upload/thumb/image2.jpg’, 0, 1);

* Lưu ý các trường hình ảnh (Image trong bảng post, Avatar trong bảng Users) chúng ta lưu đường dẫn tới ảnh chứ không lưu khóa trong bảng Images.

– Tương tự các bạn tự thêm một số bản ghi vào các bảng còn lại nhé!

#3 Xây dựng lớp quản lý các kết nối tới database

– Chúng ta sẽ xây dựng một ConnectionPool để quản lý các kết nối tới database.

* ConnectionPool là gì, các bạn có thể google sẽ ra rất nhiều bài viết giải thích về nó. Đại loại khi người dùng thực hiện hành động cần kết nối tới DB thì chương trình sẽ tạo ra 1 connect tới DB (Connection Object) khi người dùng sử dụng xong chương trình sẽ thu hồi lại kết nối đó và lưu trữ lại (vào một Stack chẳng hạn) mà không hủy nó đi. Khi có 1 người dùng khác kết nối tới DB thì chương trình sẽ lấy kết nối đã được lưu trữ ra cho người dùng mà không phải khởi tạo lại. Nếu trong Stack hết kết nối thì chương trình mới tạo mới kết nối.

– Tuy nhiên để thực hiện được kết nối tới DB (ở đây là MySQL) chúng ta cần sử dụng thư viện JDBC: mysql-connector-java-5.1.27.jar (các bạn chịu khó tìm google nhé!).

– Sau khi tải về thành công bộ thư viện này các bạn copy và paste vào thư mục lib trong WEB-INF ngay trên eclipse nhé. Sau đó kích chuột phải và chọn Buil Path -> Add to Buid Path Như hình
hoc-lap-trinh-java-web

– Add xong thư viện chúng ta tiếp tục tạo một file properties trong Java Resources/src: chuột phải vào folder src chọn New -> File và đặt tên file là “database_info.properties” (Nếu Chọn New mà không thấy File thì chọn Other xong tìm nhé). File được sử dụng như file cấu hình các thông số kết nối tới database: khi chúng ta thay đổi các thông số này thì chỉ cần thay đổi trong file này mà không phải sửa code. Tuy nhiên bạn cũng có thể fig cứng trong code cũng được.

– Nội dung file này như sau:

#MySQL config
URL=jdbc:mysql://localhost/ten_database?useUnicode=true&characterEncoding=utf8
USER=ten_nguoi_dung_trong_mysql
PASSWORD=mat_khau_cua_ban

* Ở đây: dấu # là comment code, ten_database bạn thay bằng tên database trong MySQL mà bạn đã tạo, ten_nguoi_dung_trong_mysql thay bằng tên đăng nhập vào MySQL như tài khoản mặc định của mình là root, mat_khau_cua_ban là mật khẩu vào MySQL nếu không tài khoản không đặt mật khẩu thì để trống.

– Bây giờ chúng ta đi tạo Interface ConnectionPool trong package utils của chúng ta – Interface này xác định các phương thức cần thiết của một Pool Connection:

package com.khanhspring.javawebdemo.utils;
import java.sql.Connection;
import java.sql.SQLException;
public interface ConnectionPool {
    //tra ve connection
    public Connection getConnection() throws SQLException;
    //lay lii ket noi
    public void releaseConnection(Connection con) throws SQLException;
    //lam moi pool
    public void refreshConnectionPool();
}

– Sau đó chúng ta tạo một class ConnectionPoolImpl để implement interface vừa tạo cũng trong package utils:

package com.khanhspring.javawebdemo.utils;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
import java.util.Stack;
public class ConnectionPoolImpl implements ConnectionPool {
    // Thong tin account truy cap db
    private String username;
    private String userpass;
    // Thong tin trinh dieu khien
    private String driver;
    // Thong tin duong dan toi CSDL trong MYSQL
    private String url;
    // Ngan xep luu tru cac ket noi
    private Stack<Connection> pool;
    public ConnectionPoolImpl() {
        Properties p = new Properties();
        try {
            p.load(Thread.currentThread().getContextClassLoader()
                    .getResourceAsStream("database_info.properties"));
            this.username = p.getProperty("USER");
            this.userpass = p.getProperty("PASSWORD");
            this.url = p.getProperty("URL");
            // Thong tin chinh dieu khien
            this.driver = "com.mysql.jdbc.Driver";
            // Khoi tao Stack lưu cac connection
            this.pool = new Stack<Connection>();
            // load JDBC driver
            Class.forName(this.driver).newInstance();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    @Override
    public Connection getConnection() throws SQLException {
        if (this.pool.isEmpty()) {
            return DriverManager.getConnection(this.url, this.username,
                    this.userpass);
        } else {
            return (Connection) this.pool.pop();
        }
    }
    @Override
    public void releaseConnection(Connection con)
            throws SQLException {
        this.pool.push(con);
    }
    @Override
    public void refreshConnectionPool() {
        while(!pool.empty()){
            try {
                pool.pop().close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

=> Như vậy là chúng ta đã xong lớp kết nối tới Database. Để test xem lớp này đã hoạt động chưa chúng ta viết hàm main trong class ConnectionPoolImpl như sau:

public static void main(String [] agrs){
    ConnectionPool cp = new ConnectionPoolImpl();
    try {
        Connection con = cp.getConnection();
        if(con!=null){
            System.out.println(con);
        }else{
            System.out.println("connection is null");
        }
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

=> các bạn kích chuột phải vào class này và chọn Run As -> Java Application. Nếu không có Exception và output không phải “connection is null” thì kết nối thành công.

Đánh giá của bạn
Java Web với JSP/Servlet – Tạo project, thêm dữ liệu mẫu, kết nối tới database

Trả lời

Thư điện tử của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *