1. Servlet
Để cấu hình Servlet trong ứng dụng web, bạn cần thiết lập các thông tin trong tệp web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
<servlet>
<servlet-name>app</servlet-name>
<servlet-class>vn.example.controller.AppServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>/app</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>errorHandler</servlet-name>
<servlet-class>vn.example.controller.ErrorHandler</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>errorHandler</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
Thực hiện định nghĩa Servlet:
package vn.example.controller;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class AppServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter writer = response.getWriter();
writer.print("<h1>Chào mừng đến với ứng dụng</h1>");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
2. ServletContext
ServletContext đại diện cho ứng dụng web hiện tại, cho phép chia sẻ dữ liệu giữa các Servlet.
2.1 Chia sẻ dữ liệu
package vn.example.controller;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class DataStoreServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = getServletContext();
String user = "Nguyen Van A";
context.setAttribute("user_name", user);
}
}
package vn.example.controller;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class DataRetrieveServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = getServletContext();
String userName = (String) context.getAttribute("user_name");
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
response.getWriter().print("Xin chào: " + userName);
}
}
2.2 Lấy tham số khởi tạo
<!-- Cấu hình tham số khởi tạo -->
<context-param>
<param-name>db_url</param-name>
<param-value>jdbc:mysql://localhost:3306/app_db</param-value>
</context-param>
package vn.example.controller;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class ConfigReaderServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = getServletContext();
String dbUrl = context.getInitParameter("db_url");
response.getWriter().print("Kết nối cơ sở dữ liệu: " + dbUrl);
}
}
3. HttpServletResponse
Đối tượng HttpServletResponse dùng để phản hồi cho khách hàng.
3.1 Tải xuống tập tin
package vn.example.controller;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.net.URLEncoder;
public class FileDownloader extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String filePath = "/var/www/app/files/document.pdf";
String fileName = filePath.substring(filePath.lastIndexOf("/") + 1);
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
response.setContentType("application/pdf");
FileInputStream fis = new FileInputStream(filePath);
OutputStream os = response.getOutputStream();
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = fis.read(buffer)) != -1) {
os.write(buffer, 0, bytesRead);
}
fis.close();
os.close();
}
}
3.2 Tạo mã xác thực
package vn.example.controller;
import javax.servlet.*;
import javax.servlet.http.*;
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import java.util.*;
public class CaptchaGenerator extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setHeader("refresh", "5");
BufferedImage image = new BufferedImage(120, 40, BufferedImage.TYPE_INT_RGB);
Graphics2D g = (Graphics2D) image.getGraphics();
g.setColor(Color.WHITE);
g.fillRect(0, 0, 120, 40);
g.setColor(Color.BLACK);
g.setFont(new Font("Arial", Font.BOLD, 24));
String code = generateRandomCode();
g.drawString(code, 10, 30);
response.setContentType("image/png");
response.setDateHeader("Expires", -1);
ImageIO.write(image, "png", response.getOutputStream());
}
private String generateRandomCode() {
String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
StringBuilder sb = new StringBuilder();
Random rand = new Random();
for (int i = 0; i < 6; i++) {
sb.append(chars.charAt(rand.nextInt(chars.length())));
}
return sb.toString();
}
}
4. HttpServletRequest
HttpServletRequest chứa thông tin từ yêu cầu HTTP của khách hàng.
4.1 Xử lý dữ liệu từ form
package vn.example.controller;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class LoginFormServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
String[] hobbies = request.getParameterValues("interests");
// Xử lý dữ liệu
response.getWriter().print("Tên đăng nhập: " + username + "<br>");
response.getWriter().print("Mật khẩu: " + password + "<br>");
response.getWriter().print("Sở thích: " + Arrays.toString(hobbies));
// Chuyển tiếp đến trang thành công
request.getRequestDispatcher("/success.jsp").forward(request, response);
}
}
5. Cookie và Session
5.1 Cookie
package vn.example.controller;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.net.*;
public class WelcomeServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html");
Cookie[] cookies = request.getCookies();
PrintWriter writer = response.getWriter();
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("last_visit".equals(cookie.getName())) {
writer.print("Lần truy cập cuối: " + URLDecoder.decode(cookie.getValue(), "UTF-8"));
}
}
} else {
writer.print("Lần truy cập đầu tiên!");
}
Cookie lastVisit = new Cookie("last_visit", URLEncoder.encode(new java.util.Date().toString(), "UTF-8"));
lastVisit.setMaxAge(24 * 60 * 60);
response.addCookie(lastVisit);
}
}
5.2 Session
package vn.example.controller;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class UserSessionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
session.setAttribute("user", "Nguyen Van A");
response.getWriter().print("Session ID: " + session.getId());
response.getWriter().print("<br>User: " + session.getAttribute("user"));
}
}
6. JSP
JSP cho phép tích hợp mã Java vào trang HTML để tạo nội dung động.
6.1 Cú pháp cơ bản
<%-- Biểu thức JSP --%>
<%= new java.util.Date() %>
<%-- Khối mã JSP --%>
<%
int total = 0;
for (int i = 1; i <= 10; i++) {
total += i;
}
out.print("Tổng: " + total);
%>
<%-- Khai báo JSP --%>
<!
private int counter = 0;
public void increment() {
counter++;
}
%>
6.2 Chỉ định JSP
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Trang chủ</title>
</head>
<body>
<h1>Chào mừng đến trang chủ</h1>
<c:if test="${param.username == 'admin'}">
<p>Xin chào quản trị viên!</p>
</c:if>
</body>
</html>
7. MVC
Mô hình MVC chia ứng dụng thành ba phần:
- Model: Xử lý nghiệp vụ và truy cập cơ sở dữ liệu
- View: Giao diện người dùng
- Controller: Xử lý yêu cầu từ người dùng và điều phối giữa Model và View
8. Filter
Filter dùng để xử lý yêu cầu trước khi đến Servlet.
package vn.example.filter;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class EncodingFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
}
9. Listener
Listener theo dõi các sự kiện trong ứng dụng.
package vn.example.listener;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
public class SessionListener implements HttpSessionListener {
private static int activeSessions = 0;
@Override
public void sessionCreated(HttpSessionEvent se) {
activeSessions++;
se.getSession().getServletContext().setAttribute("activeSessions", activeSessions);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
activeSessions--;
se.getSession().getServletContext().setAttribute("activeSessions", activeSessions);
}
}
10. JDBC
Kết nối và thao tác với cơ sở dữ liệu.
package vn.example.db;
import java.sql.*;
public class DatabaseConnection {
public static void main(String[] args) throws SQLException {
String url = "jdbc:mysql://localhost:3306/app_db?useUnicode=true&characterEncoding=UTF-8";
String user = "root";
String password = "password";
Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE username = ?");
stmt.setString(1, "admin");
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
System.out.println(rs.getString("name"));
}
rs.close();
stmt.close();
conn.close();
}
}