Breaking

31 tháng 5, 2021

tháng 5 31, 2021

Kết nối Database trong Jakarta Servlet dùng Connection Pooling

 


Bước 1. Cấu hình các thư viện cần thiết trong file "porm.xml".  (tất cả code dưới đây copy được nhé).

a. Thư viện MySql:

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.24</version>
</dependency>


b. Thư viện JSTL:

<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
<version>2.0.0</version>
</dependency>


Chú ý: những đoạn mã trên nằm trong thẻ <dependencies>, như sau:

<dependencies>
<!-- Copy vào đây nè, ở trong thẻ 'dependencies' -->
</dependencies>


Sau khi chỉnh sửa file "porm.xml", nút  sẽ xuất hiện ở góc trên cùng bên phải. Ấn vào nút này để intellij-idea tải lại các thư viện cần thiết theo đúng theo cấu hình vừa sửa trong file "porm.xml".



Bước 2. Tạo cơ sở dữ liệu mẫu:

# 00. Tạo Tài khoản truy cập cơ sở dữ liệu (tùy chọn, nếu cần):
GRANT ALL PRIVILEGES ON *.* TO javauser@localhost
IDENTIFIED BY 'javadude' WITH GRANT OPTION;

# 01. Tạo Cơ sở dữ liệu:
create database DatabaseName_Test;
use DatabaseName_Test;

# 02. Tạo Bảng:
create table TableName_Test (
id int not null auto_increment primary key,
foo varchar(25),
bar int);

# 03. Nhập dữ liệu mẫu vào bảng vừa tạo:
insert into TableName_Test value (null, 'hello', 12345);
insert into TableName_Test value (null, 'welcome', 56789);



Bước 3. Tạo file "webapp/META-INF/context.xml" (chưa có thư mục 'META-INF' thì tạo nhé)

<Context>
<Resource name="jdbc/mysql/DatabaseName_Test"
auth="Container"
type="javax.sql.DataSource"

maxTotal="100"
maxIdle="30"
maxWaitMillis="10000"

username="root"
password=""
driverClassName="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://localhost:3306/DatabaseName_Test"/>

<!-- maxTotal(int): số lượng kết nối tối đa tại 1 thời điểm. -->
<!-- maxIdle(int): số lượng kết nối nhàn rỗi được duy trì tối đa. -->
<!-- maxWaitMillis: số mili giây tối đa đợi kết nối,         sau số giây này thì coi như ko kết nối được, để hệ thống chuyển sang việc khác. -->

<!-- CHÚ Ý: Sửa lại username, password và tên cơ sở dữ liệu trong url cho đúng -->
</Context>



Bước 4. Cấu hình file "webapp/WEB-INF/web.xml"

(Không cần làm bước này code vẫn chạy)

<resource-ref>
<description>Database Connection Test</description> <!-- Mô tả này là tùy chọn -->
<res-ref-name>jdbc/mysql/DatabaseName_Test</res-ref-name> <!-- Tên Resource đã khai báo
trong file "META-INF/context.xml" -->
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>



Bước 5. Tạo file "webapp/test.jsp", để kiểm tra kết nối và hiển thị kết quả.

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<sql:query var="resultSet" dataSource="jdbc/mysql/DatabaseName_Test">
select * from TableName_Test
</sql:query>

<html>
<head>
<title>DB Test</title>
</head>
<body>

    <h2>Results</h2>

    <c:forEach var="row" items="${resultSet.rows}">
    Foo: ${row.foo} <br>
     Bar: ${row.bar} <br>         <br>
    </c:forEach>

</body>
</html>



Kết quả nè:



💜 Cảm ơn bạn đã đọc bài, mọi thắc mắc hoặc góp ý hãy để lại bình luận cho mình nhé 💜

Chúc các bạn thành công!


Nguồn tham khảo: 



Cùng chủ đề, đọc tiếp:


29 tháng 5, 2021

tháng 5 29, 2021

DataBase JDBC và Listener trong Jakarta Servlet

 


DataBase JDBC và Listener - Jakarta Servlet


1. Chuẩn bị cơ sở dữ liệu: bạn tải về file .sql ở đây và nhập cơ sở dữ liêu từ PhpMyAdmin:

Sau khi tải về file, hãy vào PhpMyAdmin và làm theo hướng dẫn của tôi để nhập cấu trúc bảng và dữ liệu mẫu nhé. Tên cơ sở dữ liệu tôi để giúp bạn là: WCD_WebComponentDevelopment




2. Khai báo dependency trong file porm.xml (Chú ý: bạn có thể dùng phiên bản mới nhất thời điểm lúc bạn làm dự án)

<dependency>
    <groupId>
mysql</groupId>
    <artifactId>
mysql-connector-java</artifactId>
    <version>
8.0.24</version>
</dependency>


1.    3. Cấu hình các giá trị DataBase trong file webapp/WEB-INF/web.xml

    Khởi tạo các giá trị cấu hình ban đầu: username, password, driver, dbUrl

<context-param>
    <param-name>
username</param-name>
    <param-value>
root</param-value>
</context-param>
<context-param>
    <param-name>
password</param-name>
    <param-value>
123456</param-value>
</context-param>
<context-param>
    <param-name>
driver</param-name>
    <param-value>
com.mysql.cj.jdbc.Driver</param-value>
</context-param>
<context-param>
    <param-name>
dbUrl</param-name>
    <param-value>
jdbc:mysql://192.168.0.3:3306/DatabaseName</param-value>
</context-param>



4. Tạo class: Database/ DatabaseConnectionManager

Khởi tạo và kết nối đến cơ sở dữ liệu, lấy đối tượng connection để Listener sử dụng.

public class DatabaseConnectionManager {
   
private Connection connection;

    public
DatabaseConnectionManager(String username, String password, String driver, String dbUrl) throws ClassNotFoundException, SQLException {
        Class.forName(driver)
;
        this
.connection = DriverManager.getConnection(dbUrl, username, password);
   
}

   
public Connection getConnection() {
       
return this.connection;
   
}
}



1.    5. Tạo class: Listener/ApplicationContextListener


Cl    Class này nẽ lắng nghe sự kiện kích hoạt DataBase để khởi tạo một kết nối đến cơ sở dữ liệu để Controller sử dụng.


@WebListener
public class ApplicationContextListener  implements ServletContextListener {
   
@Override
   
public void contextInitialized(ServletContextEvent sce) {
        ServletContext context = sce.getServletContext()
;

       
String username = context.getInitParameter("username");
       
String password = context.getInitParameter("password");
       
String driver = context.getInitParameter("driver");
       
String dbUrl = context.getInitParameter("dbUrl");

        try
{
            DatabaseConnectionManager databaseConnectionManager =
new DatabaseConnectionManager(username, password, driver, dbUrl);
           
Connection connection = databaseConnectionManager.getConnection();
           
context.setAttribute("dbConnection", connection);
       
} catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace()
;
       
}
    }

   
@Override
   
public void contextDestroyed(ServletContextEvent sce) {
        Connection connection = (Connection) sce.getServletContext().getAttribute(
"dbConnection");
        try
{
            connection.close()
;
       
} catch (SQLException e) {
            e.printStackTrace()
;
       
}
    }
}




1.    6. Tạo class: Controller/TestConnectionDatabase


    Đây là một Controller, Sau khi gọi sự kiện kết nối DataBase thành công, nó thực hiện câu truy vấn lấy danh sách dữ liệu từ bảng User. Dữ liệu trả về sẽ được gửi tiếp đến View. 


    (Đây là một ví dụ đơn giản nên tôi sẽ không sử dụng View ở đây. Tôi chỉ đơn giản lặp và hiển thị các bản ghi thôi. Các bạn hãy phát triển bài toán tiếp nhé. Ví dụ thêm View để hiển thị đẹp và xịn xò nè) 😄😊


@WebServlet({"/test-connection-database", "/test-connection-database/"})
public class TestConnectionDatabase extends HttpServlet {
   
@Override
   
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType(
"text/html");
       
PrintWriter out = response.getWriter();
       
Connection connection = (Connection) request.getServletContext().getAttribute("dbConnection");
        try
{
            PreparedStatement statement = connection.prepareStatement(
"

                    select * from wcd_webcomponentdevelopment.user

                ");
           
ResultSet resultSet = statement.executeQuery();
            while
(resultSet != null && resultSet.next()){
                out.println(
                        resultSet.getString(
"username") +": "
                               
+ resultSet.getString("firstname") +", "
                               
+ resultSet.getString("lastname")
                )
;
           
}
        }
catch (SQLException e) {
            e.printStackTrace()
;
       
}
    }
}



Kết quả nè:



💜 Cảm ơn bạn đã đọc bài, hãy để lại bình luận góp ý cho mình nhé 💜

Chúc các bạn thành công!


27 tháng 5, 2021

tháng 5 27, 2021

JSTL Trong Java Servlet

Mục lục:


A. Lý thuyết

JSTL Là gì

  • JSTL viết tắt của jsp standard tag library là  bộ thư viện thẻ tiêu chuẩn của JSP 
  • Đại diện cho một tập hợp các thẻ để đơn giản hóa sự phát triển của JSP
  • Thẻ JSTL có thể được phân loại, theo chức năng của chúng:


JSTL chủ yếu cung cấp năm loại thẻ:

Tag Name Description
Core tags Thẻ lõi JSTL cung cấp hỗ trợ biến, quản lý URL, điều khiển lưu lượng, v.v. URL cho thẻ lõi là http://java.sun.com/jsp/jstl/core. Tiền tố của thẻ lõi là c.
Function tags Các thẻ chức năng cung cấp hỗ trợ để thao tác chuỗi và độ dài chuỗi. URL cho các thẻ chức năng là http://java.sun.com/jsp/jstl/functions và tiền tố là fn.
Formatting tags Các thẻ định dạng cung cấp hỗ trợ cho định dạng tin nhắn, định dạng số và ngày, v.v. URL cho các thẻ định dạng là http://java.sun.com/jsp/jstl/fmt và tiền tố là fmt.
XML tags Các thẻ XML cung cấp điều khiển dòng chảy, chuyển đổi, vv URL cho các thẻ XML là http://java.sun.com/jsp/jstl/xml và tiền tố là. x.
SQL tags Các thẻ SQL JSTL cung cấp hỗ trợ SQL. URL cho các thẻ SQL là http://java.sun.com/jsp/jstl/sql và tiền tố là. sql.


Cách cài đặt thư viện JSTL

  • Một trong số những mã sau đều hoạt động, có thể có những mã khác cũng hoạt động.
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
<version>2.0.0</version>
</dependency>

<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>apache-jstl</artifactId>
<version>11.0.0.beta2</version>
</dependency>

Cách sử dụng thẻ JSTL:

Core
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

Function
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

Formatting
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

XML
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>

SQL
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>

Danh sách thẻ JSTL Core:


Tags Description
c:out Nó hiển thị kết quả của một biểu thức, tương tự như cách <%=...%> Tag hoạt động.
c:import Nó đã truy cập lại tương đối hoặc một URL tuyệt đối và hiển thị nội dung cho chuỗi 'var', một trình đọc trong 'varreader' hoặc trang.
c:set Nó đ ặt kết quả của một biểu thức đang được đánh giá trong một Biến 'scope' .
c:remove Nó được sử dụng để loại bỏ biến phạm vi được chỉ định khỏi một phạm vi cụ thể.
c:catch Nó được sử dụng để bắt bất kỳ ngoại lệ nào có thể xảy ra nào xảy ra trong cơ thể.
c:if Nó là thẻ có điều kiện được sử dụng để thử nghiệm điều kiện và chỉ hiển thị nội dung cơ thể nếu biểu thức đánh giá là true.
c:choose, c:when, c:otherwise Nó là thẻ có điều kiện đơn giản bao gồm nội dung cơ thể của nó nếu điều kiện được đánh giá là true.
c:forEach Nó là thẻ lặp cơ bản. Nó lặp lại hàm lượng cơ thể lồng nhau cho số lần cố định hoặc bộ sưu tập hơn.
c:forTokens Nó lặp qua các token được phân tách bằng các dấu hiệu được cung cấp.
c:param Nó thêm một tham số chứa  trong một 'import'  URL.
c:redirect Nó chuyển hướng trình duyệt sang một URL mới và hỗ trợ các URL tương đối ngữ cảnh.
c:url Nó tạo một URL với các tham số truy vấn tùy chọn.

Danh sách thẻ JSTL Function:


JSTL Functions Description
fn:contains() Nó được sử dụng để kiểm tra nếu một chuỗi đầu vào chứa chuỗi con được chỉ định trong một chương trình.
fn:containsIgnoreCase() Nó được sử dụng để kiểm tra nếu một chuỗi đầu vào chứa chuỗi con được chỉ định như một cách không phân biệt trường hợp.
fn:endsWith() Nó được sử dụng để kiểm tra nếu một chuỗi đầu vào kết thúc bằng hậu tố được chỉ định.
fn:escapeXml() Nó thoát khỏi các ký tự sẽ được hiểu là đánh dấu XML.
fn:indexOf() Nó trả về một chỉ mục trong một chuỗi xuất hiện đầu tiên của một chuỗi con được chỉ định.
fn:trim() Nó loại bỏ các khoảng trắng khỏi cả hai đầu của một chuỗi.
fn:startsWith() Nó được sử dụng để kiểm tra xem chuỗi đã cho có được bắt đầu với một giá trị chuỗi cụ thể hay không.
fn:split() Nó chia chuỗi thành một loạt các chuỗi con.
fn:toLowerCase() Nó chuyển đổi tất cả các ký tự của một chuỗi thành chữ thường.
fn:toUpperCase() Nó chuyển đổi tất cả các ký tự của một chuỗi thành chữ hoa.
fn:substring() Nó trả về tập hợp con của một chuỗi theo vị trí bắt đầu và kết thúc đã cho.
fn:substringAfter() Nó trả về tập hợp con của chuỗi sau một chuỗi con cụ thể.
fn:substringBefore() Nó trả về tập hợp con của chuỗi trước một chuỗi con cụ thể.
fn:length() Nó trả về số lượng ký tự bên trong một chuỗi hoặc số lượng mục trong một bộ sưu tập.
fn:replace() Nó thay thế tất cả sự xuất hiện của một chuỗi với một chuỗi chuỗi khác.

Danh sách thẻ JSTL Formatting

Formatting Tags Descriptions
fmt:parseNumber Nó được sử dụng để phân tích chuỗi đại diện của một loại tiền tệ, phần trăm hoặc số.
fmt:timeZone Nó chỉ định một hành động phân tích cú pháp lồng nhau trong body của nó hoặc múi giờ cho bất kỳ định dạng thời gian nào.
fmt:formatNumber Nó được sử dụng để định dạng giá trị số với định dạng hoặc độ chính xác cụ thể.
fmt:parseDate Nó phân tích chuỗi đại diện của một thời gian và ngày.
fmt:bundle Nó được sử dụng để tạo các đối tượng ResourceBundle sẽ được sử dụng bởi thẻ body của chúng.
fmt:setTimeZone Nó lưu trữ múi giờ bên trong biến cấu hình múi giờ.
fmt:setBundle Nó tải gói tài nguyên và lưu trữ nó trong biến cấu hình bó hoặc biến có tên có tên.
fmt:message Nó hiển thị một tin nhắn quốc tế hóa.
fmt:formatDate Nó định dạng thời gian và / hoặc ngày sử dụng mẫu và kiểu được cung cấp.

Danh sách thẻ JSTL XML


XML Tags Descriptions
x:out Tương tự như thẻ <%= ... >, nhưng đối với các biểu thức XPath.
x:parse Nó được sử dụng để phân tích dữ liệu XML được chỉ định trong phần thân thẻ hoặc thuộc tính.
x:set Nó được sử dụng để đặt một biến thành giá trị của biểu thức XPath.
x:choose Nó là một thẻ có điều kiện thiết lập bối cảnh cho các hoạt động có điều kiện loại trừ lẫn nhau.
x:when Nó là một tinh tế của nó sẽ bao gồm cơ thể của nó nếu điều kiện được đánh giá là 'true'.
x:otherwise Nó là SUBTAG theo đó các thẻ và chỉ chạy nếu tất cả các điều kiện trước được đánh giá là 'false'.
x:if Nó được sử dụng để đánh giá biểu thức XPath thử nghiệm và nếu true    , nó sẽ xử lý nội dung cơ thể của nó.
x:transform Nó được sử dụng trong một tài liệu XML để cung cấp chuyển đổi XSL (ngôn ngữ biểu định kiểu mở rộng).
x:param Nó được sử dụng cùng với thẻ biến đổi để cài đặt tham số trong bảng kiểu XSLT.


Danh sách thẻ JSTL SQL


SQL Tags Descriptions
sql:setDataSource Nó được sử dụng để tạo một nguồn dữ liệu đơn giản chỉ phù hợp để tạo mẫu.
sql:query Nó được sử dụng để thực hiện truy vấn SQL được xác định trong thuộc tính SQL hoặc body của nó.
sql:update Nó được sử dụng để thực hiện bản cập nhật SQL được xác định trong thuộc tính SQL của nó hoặc trong thẻ body.
sql:param Nó được sử dụng để đặt tham số trong câu lệnh SQL thành giá trị được chỉ định.
sql:dateParam Nó được sử dụng để đặt tham số trong câu lệnh SQL thành giá trị java.util.date được chỉ định.
sql:transaction Nó được sử dụng để cung cấp hành động cơ sở dữ liệu lồng nhau với một kết nối phổ biến.



B. Ví dụ mẫu về các thẻ JSTL


Các thẻ Format

Khai báo:

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"  %> 


Ví dụ 1: Thẻ fmt:parseNumber 

Cú pháp được sử dụng để bao gồm thẻ <fmt: parseNumber>là:

<fmt:parseNumber thuộc tính > nội dung </fmt:parseNumber>


Nó được sử dụng để phân tích chuỗi đại diện của một loại tiền tệ, phần trăm hoặc số.


- Ví dụ đơn giản để hiểu định dạng thẻ <fmt: parseNumber>:


- Sau khi khởi chạy thì ta được kết quả:

 


Ví dụ 2: Thẻ fmt:paseDate

Cú pháp được sử dụng để bao gồm thẻ <fmt: parseDate> là:

< fmt: parseDate  thuộc tính />  


Nó phân tích chuỗi đại diện của một thời gian và ngày.


-Ví dụ đơn giản để hiểu định dạng thẻ <fmt: parseDate>:



- Sau khi khởi chạy thì ta được kết quả:



Các thẻ Core

Khai báo:

  1. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>  


Ví dụ 1: 

Thẻ <c: if> được sử dụng để kiểm tra điều kiện và nó hiển thị nội dung phần thân, nếu biểu thức được đánh giá là đúng.

Đây là một thẻ điều kiện đơn giản được sử dụng để đánh giá nội dung nội dung, nếu điều kiện được cung cấp là đúng.

Hãy xem ví dụ đơn giản về thẻ <c: if>:

 

Trong file isp viết đoạn code:



Và đây là kết quả đoạn if này cho biết nếu giá trị của biến income lớn hơn 800 thì sẽ hiền thị như sau


Ví dụ 2:

Thẻ JSTL Core <c:choose> là thẻ có điều kiện thiết lập ngữ cảnh cho các hoạt động có điều kiện loại trừ lẫn nhau. Nó hoạt động giống như một câu lệnh chuyển đổi Java trong đó chúng ta chọn giữa một số lựa chọn thay thế.

Thẻ <c:when> là thẻ phụ của <choose> sẽ bao gồm phần nội dung của nó nếu điều kiện được đánh giá là 'true'.

Thẻ <c:otherwise> cũng là thẻ phụ của <choose> nó theo sau thẻ & l; twhen> và chỉ chạy nếu tất cả điều kiện trước đó được đánh giá là 'false'.

Câu lệnh c: when và c: else hoạt động giống như câu lệnh if-else. Nhưng nó phải được đặt bên trong thẻ c: select.

Hãy xem ví dụ đơn giản về thẻ <c: choose>, <c: when> <c:otherwise>

Kết quả trả về là Income is very good vì giá trị Income lớn hơn 10000:


Ví dụ 3:
Một ví dụ nữa về ví dụ chẵn lẻ và cách sử dụng <c:when> và <c:otherwise>

Trong file jsp:


Kết quả: Sẽ trả về biến num và thông báo nó là số chẵn

Ví dụ 4: Thẻ <c: for each>  đơn giản

Code:



Kết quả:




Ví dụ 5: Thẻ <c: for each>  là thẻ lặp được sử dụng để lặp lại nội dung phần thân lồng nhau mà người dùng đã chọn để hiển thị kết quả

Code:




Kết quả:



Các thẻ Functions

Khai báo:

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> 


Ví dụ 1: sử dụng fn:toUpperCase() để in hoa chữ:

Code:


Kết quả:



Ví dụ 2: sử dụng fn:length():  trả về số lượng ký tự bên trong một chuỗi hoặc số lượng các mục trong một bộ sưu tập.


Kết quả:




Cảm ơn bạn đã đọc bài viết. Hãy để lại bình luận cho chúng tôi nhé! 💜
Chúc các bạn học tập hiệu quả.