Phát Triển Web với Java: Hướng Dẫn Thực Hành Cơ Bản

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();
    }
}

Thẻ: JavaWeb Servlet HttpServletResponse HttpServletRequest Session

Đăng vào ngày 27 tháng 5 lúc 12:06