JavaWeb 开发的核心基础知识

时间:2025-05-14 19:51:12

JavaWeb 基础知识

一、JavaWeb 概述

1. 什么是 JavaWeb

  • 使用 Java 技术解决 Web 领域相关问题的技术总和
  • 基于请求/响应模型的应用程序开发

2. 核心组件

  • Servlet:处理请求和响应的 Java 类
  • JSP:Java Server Pages,动态页面技术
  • Filter:过滤器,预处理请求和后处理响应
  • Listener:监听器,监听 Web 应用中的事件

二、Servlet 技术

1. Servlet 基础

  • 生命周期
    • init():初始化,只执行一次
    • service():处理请求(内部调用 doGet/doPost)
    • destroy():销毁,只执行一次
  • 常用类
    • HttpServlet:抽象基类
    • HttpServletRequest:请求对象
    • HttpServletResponse:响应对象

2. Servlet 配置

  • web.xml 配置

    <servlet>
        <servlet-name>DemoServlet</servlet-name>
        <servlet-class>com.example.DemoServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>DemoServlet</servlet-name>
        <url-pattern>/demo</url-pattern>
    </servlet-mapping>
    
  • 注解配置(Servlet 3.0+):

    @WebServlet("/demo")
    public class DemoServlet extends HttpServlet {...}
    

3. 请求与响应

  • 获取请求参数

    String username = request.getParameter("username");
    String[] hobbies = request.getParameterValues("hobby");
    
  • 设置响应

    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    out.println("<html><body>Hello World</body></html>");
    

三、JSP 技术

1. JSP 基础

  • JSP 本质:最终会被编译为 Servlet
  • JSP 组成
    • HTML 代码
    • Java 代码(脚本、表达式、声明)
    • JSP 指令和动作

2. JSP 脚本元素

  • 脚本片段<% Java代码 %>
  • 表达式<%= 表达式 %>(输出表达式结果)
  • 声明<%! 变量或方法声明 %>

3. JSP 指令

  • page 指令

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8" import="java.util.*" %>
    
  • include 指令(静态包含):

    <%@ include file="header.jsp" %>
    
  • taglib 指令(引入标签库):

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

4. JSP 内置对象

对象名 类型 说明
request HttpServletRequest 请求对象
response HttpServletResponse 响应对象
session HttpSession 会话对象
application ServletContext 应用上下文
out JspWriter 输出流
pageContext PageContext 页面上下文
page Object 当前页面实例
config ServletConfig Servlet 配置
exception Throwable 异常对象(仅错误页可用)

四、会话跟踪技术

1. Cookie

  • 创建 Cookie

    Cookie cookie = new Cookie("name", "value");
    cookie.setMaxAge(60*60*24); // 有效期1天
    response.addCookie(cookie);
    
  • 读取 Cookie

    Cookie[] cookies = request.getCookies();
    for (Cookie c : cookies) {
        if ("name".equals(c.getName())) {
            String value = c.getValue();
        }
    }
    

2. Session

  • 获取 Session

    HttpSession session = request.getSession(); // 获取或创建
    HttpSession session = request.getSession(false); // 只获取不创建
    
  • Session 操作

    session.setAttribute("user", userObj); // 设置属性
    User user = (User)session.getAttribute("user"); // 获取属性
    session.removeAttribute("user"); // 移除属性
    session.invalidate(); // 销毁Session
    

五、Filter 过滤器

1. Filter 基础

  • 作用:在请求到达 Servlet 前或响应返回客户端前进行预处理/后处理
  • 生命周期
    • init():初始化
    • doFilter():过滤处理
    • destroy():销毁

2. Filter 配置

  • web.xml 配置

    <filter>
        <filter-name>EncodingFilter</filter-name>
        <filter-class>com.example.EncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>EncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
  • 注解配置

    @WebFilter("/*")
    public class EncodingFilter implements Filter {...}
    

3. 常见应用场景

  • 字符编码过滤
  • 权限验证
  • 日志记录
  • 数据压缩

六、Listener 监听器

1. 监听器类型

  • ServletContext 监听器
    • ServletContextListener:应用启动/销毁
    • ServletContextAttributeListener:属性变化
  • Session 监听器
    • HttpSessionListener:Session创建/销毁
    • HttpSessionAttributeListener:Session属性变化
    • HttpSessionBindingListener:对象绑定到Session
  • Request 监听器
    • ServletRequestListener:请求创建/销毁
    • ServletRequestAttributeListener:请求属性变化

2. 监听器配置

  • web.xml 配置

    <listener>
        <listener-class>com.example.MyListener</listener-class>
    </listener>
    
  • 注解配置

    @WebListener
    public class MyListener implements ServletContextListener {...}
    

七、JSTL 与 EL 表达式

1. EL 表达式(Expression Language)

  • 语法${expression}

  • 作用:简化 JSP 页面中的 Java 代码

  • 示例

    ${user.name} <!-- 相当于 <%= ((User)request.getAttribute("user")).getName() %> -->
    ${param.username} <!-- 获取请求参数 -->
    ${sessionScope.cart} <!-- 获取session中的属性 -->
    

2. JSTL(JSP Standard Tag Library)

  • 核心标签库(prefix=“c”):

    <c:set var="name" value="value" scope="session"/> <!-- 设置变量 -->
    <c:out value="${name}"/> <!-- 输出 -->
    <c:if test="${age > 18}">成年</c:if> <!-- 条件判断 -->
    <c:forEach items="${list}" var="item" varStatus="status"> <!-- 循环 -->
        ${status.index}: ${item}
    </c:forEach>
    

八、MVC 设计模式

1. MVC 组成

  • Model:数据模型(JavaBean、DAO、Service)
  • View:视图(JSP、HTML)
  • Controller:控制器(Servlet)

2. MVC 工作流程

  1. 用户发送请求到控制器(Servlet)
  2. 控制器调用模型(Service/DAO)处理业务逻辑
  3. 模型返回处理结果给控制器
  4. 控制器选择视图(JSP)并传递数据
  5. 视图渲染响应返回给用户

九、数据库访问(JDBC)

1. JDBC 基本步骤

// 1. 加载驱动
Class.forName("com.mysql.jdbc.Driver");

// 2. 获取连接
Connection conn = DriverManager.getConnection(
    "jdbc:mysql://localhost:3306/dbname", "username", "password");

// 3. 创建Statement
PreparedStatement ps = conn.prepareStatement(
    "SELECT * FROM users WHERE id=?");

// 4. 设置参数并执行
ps.setInt(1, 1);
ResultSet rs = ps.executeQuery();

// 5. 处理结果集
while (rs.next()) {
    String name = rs.getString("name");
    // ...
}

// 6. 关闭资源
rs.close();
ps.close();
conn.close();

2. 数据库连接池

  • 常见连接池

    • DBCP
    • C3P0
    • Druid(阿里开源)
  • 使用示例(以Druid为例):

    DruidDataSource dataSource = new DruidDataSource();
    dataSource.setUrl("jdbc:mysql://localhost:3306/dbname");
    dataSource.setUsername("username");
    dataSource.setPassword("password");
    
    Connection conn = dataSource.getConnection();
    // 使用连接...
    conn.close(); // 实际是返回到连接池
    

十、AJAX 与 JSON

1. AJAX 基础

  • XMLHttpRequest 对象

    var xhr = new XMLHttpRequest();
    xhr.open("GET", "url", true);
    xhr.onreadystatechange = function() {
        if (xhr.readyState == 4 && xhr.status == 200) {
            var data = JSON.parse(xhr.responseText);
            // 处理响应数据
        }
    };
    xhr.send();
    
  • jQuery AJAX

    $.ajax({
        url: "url",
        type: "GET/POST",
        data: {key: value},
        dataType: "json",
        success: function(data) {...},
        error: function() {...}
    });
    

2. JSON 处理

  • Java 对象转 JSON(使用 Jackson):

    ObjectMapper mapper = new ObjectMapper();
    String json = mapper.writeValueAsString(user); // 对象转JSON字符串
    User user = mapper.readValue(json, User.class); // JSON字符串转对象
    
  • JSP 中输出 JSON

    response.setContentType("application/json;charset=UTF-8");
    PrintWriter out = response.getWriter();
    out.print(json);
    out.flush();
    

十一、文件上传与下载

1. 文件上传

  • 表单设置

    <form action="upload" method="post" enctype="multipart/form-data">
        <input type="file" name="file">
        <input type="submit" value="上传">
    </form>
    
  • Servlet 处理(使用 Apache Commons FileUpload):

    DiskFileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload upload = new ServletFileUpload(factory);
    List<FileItem> items = upload.parseRequest(request);
    
    for (FileItem item : items) {
        if (!item.isFormField()) { // 文件字段
            String fileName = item.getName();
            File file = new File("上传路径", fileName);
            item.write(file);
        }
    }
    

2. 文件下载

response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", 
    "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));

InputStream in = new FileInputStream(file);
OutputStream out = response.getOutputStream();

byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) != -1) {
    out.write(buffer, 0, len);
}

in.close();
out.flush();

十二、Web 安全基础

1. 常见安全问题

  • SQL 注入:使用 PreparedStatement 预防
  • XSS 跨站脚本攻击:对用户输入进行 HTML 转义
  • CSRF 跨站请求伪造:使用 token 验证
  • 会话固定攻击:登录后重置 sessionId

2. 安全措施

  • 密码加密

    // 使用MD5加密(需加盐)
    MessageDigest md = MessageDigest.getInstance("MD5");
    byte[] hash = md.digest((password + salt).getBytes());
    
  • 权限控制:使用 Filter 进行访问控制

  • HTTPS:配置 SSL 证书

以上是 JavaWeb 开发的核心基础知识,掌握这些内容可以胜任基本的 JavaWeb 开发工作。