JSP与Servlet核心开发与CRUD实战笔记

一、 开发环境与项目构建

  1. Tomcat 服务器

    • 目录结构 :conf(配置文件如server.xml)、webapps(网站存放位置,ROOT为默认网站)、work(JSP编译成Java和class文件的地方)。

    • 常见状态码 :404(未找到资源)。

    • 常见报错 :java.net.BindException: Address already in use: bind(端口被占用,如8081/8080)。

  2. Gradle 编译工具

    • 作用:代替手动下载jar包,自动解决依赖。

    • 环境变量 :需将gradle的bin目录加入Path。

    • 核心配置 (build.gradle):

      • plugins:引入功能(如 id 'java'、id 'application')。

      • repositories:配置下载源(如阿里云maven)。

      • dependencies:引入类库坐标(如 implementation 'org.hsqldb:hsqldb:2.7.4'、Lombok)。

  3. IDEA 建立 Web 工程

    • 使用 Jakarta EE / Web application 模板,服务器选 Tomcat。

    • 修改默认部署网站名 :在 Tomcat 运行配置中修改 Application context(如改为 /jsp14)。

    • 开发目录结构 :src/main/java(代码)、src/main/resources(资源)、src/main/webapp(网站根目录,含 JSP、HTML、WEB-INF)。

    • 部署后目录结构 :WEB-INF 下包含 classes(自己写的类)、lib(第三方库)、web.xml(部署描述符)。

二、 HTML表单与请求接收

  1. 表单标签

    • 单选框(radio)、多选框(checkbox)、下拉列表(select)、文件上传(file)。

    • 注意 :单选框/多选框必须提供 value 属性发给服务器。

    • form 的 method 默认是 GET,提交到 action 指定的路径。

  2. Request 接收参数

    • 单值 :request.getParameter("username");

    • 多值(如多选框) :String[] hobbies = request.getParameterValues("hobbies");(注意校验 hobbies != null)。

    • 中文乱码解决 :JSP 头部需加 <%@ page contentType="text/html;charset=UTF-8" %>。

  3. GET 与 POST 的区别

    • GET:参数放在 URL(Query String Parameters),长度有限,安全性低。

    • POST:参数放在请求体(Form Data),长度不限,相对安全。

    • 可在浏览器 F12 的 Network 面板中观察数据交互。

三、 JSP 与 Servlet 核心机制

  1. JSP 本质与生命周期

    • JSP 最终会被 Tomcat 编译为 Servlet(.java 和 .class 文件存放在 work 目录)。

    • JSP = Java + HTML。

    • 生命周期 :init(初始化,运行1次)、service(访问一次运行一次)、destroy(销毁,运行1次)。

  2. Servlet 基础

    • 使用 @WebServlet("/路径") 配置访问地址。

    • 继承 HttpServlet,重写 doGet 和 doPost,通常在 doGet 中调用 doPost 统一处理。

  3. Servlet 与 JSP 的分工

    • JSP:负责显示页面,接收用户输入。

    • Servlet:负责判断、业务处理、访问数据库,然后跳转到 JSP 显示结果。

四、 页面跳转与作用域

  1. 转发 (Forward):服务器内部跳转,地址栏不变,只有 1 次请求,参数和 request 数据都在。

    • 代码:request.getRequestDispatcher("login_suc.jsp").forward(request, response);
  2. 重定向 (Redirect):客户端跳转,地址栏改变,发送 302 状态码和 location,有 2 次请求,参数丢失。

    • 代码:response.sendRedirect(req.getContextPath() + "/login_suc.jsp");
  3. 四大作用域

    • request:一次请求内有效。

    • session :会话级别,跨多个 request 共享数据(如登录状态、保护页面)。注销使用 session.invalidate()。

    • application (ServletContext):全局级别,服务器启动到停止,跨所有 session 共享(如网站访问计数器)。

    • 存取值:setAttribute("key", value) / getAttribute("key") / removeAttribute("key")。

五、 JavaBean 与 Lombok

  1. 赋值给 Java 对象

    • 接收页面参数后,实例化对象并用 setter 赋值,再在页面用 getter 取值。
  2. Lombok 插件

    • 作用:自动生成 Getter、Setter、toString 等。

    • 依赖配置 :在 build.gradle 中配置 compileOnly 和 annotationProcessor。

    • 使用 :在实体类上加 @Getter、@Setter 注解。

六、 数据库操作与 CRUD 实战 (HSQLDB)

  1. HSQLDB 嵌入式数据库

    • 只需一个 jar 包即可运行,包含服务器、JDBC驱动、图形管理界面。

    • 启动命令:java -cp hsqldb.jar org.hsqldb.server.Server 和 java -cp hsqldb.jar org.hsqldb.util.DatabaseManagerSwing。

    • 连接参数 :URL jdbc:hsqldb:hsql://localhost/,用户 sa,密码空。

  2. JDBC 标准流程

    • 加载驱动 Class.forName(driver)。

    • 获取连接 DriverManager.getConnection(url, user, pass)。

    • 预编译语句 PreparedStatement(防止 SQL 注入)。

    • 执行查询/更新,处理 ResultSet。

    • 使用 try-with-resources 自动关闭资源。

  3. DAO 设计模式

    • 把数据库的 ResultSet 转换为 List<String[]>(多行多列)。

    • 查 (Select) :返回 List<String[]>,遍历 rs.next() 填充数组。

    • 增 (Insert) / 改 (Update) :使用 pstmt.executeUpdate(),返回受影响行数。

  4. 登录与权限控制

    • 数据库中登录 :select * from user where username=? and pass=?,如果 rs.next() 为 true 则登录成功。

    • 保护页面 :在 JSP/Servlet 开头判断 session.getAttribute("login_user") 是否为 null,若为 null 则重定向回登录页。

  5. SQL 执行监控 (p6spy)

    • 引入 p6spy 依赖,配置 spy.properties,将 URL 改为 jdbc:p6spy:hsqldb:hsql://localhost/,即可在控制台打印带参数的完整 SQL 语句,方便调试。

七、 典型业务场景(CRUD开发套路)

  • 显示列表 :请求 Servlet -> DAO查询(List<String[]>) -> 存入 session -> 重定向到 JSP -> JSP 校验 null -> 表格遍历展示。

  • 新增数据:JSP 表单提交到 Servlet -> 获取参数 -> DAO执行 Insert -> 返回行数 -> 存入 session (提示信息) -> 重定向回列表页。

  • 编辑数据 :列表页传 id -> 查询 Servlet 找出对应记录 -> 存入 session -> 重定向到编辑页 -> 表单中 value 回显 -> 提交 Update Servlet -> 更新数据库 -> 重定向回列表页。

相关推荐
知守观3 小时前
技术考古:iBATIS 2.3.4 时代的持久层,是如何用 Map 玩转 307 个存储过程的?
java·后端·mybatis
La Pulga4 小时前
【FreeRTOS源码学习笔记】链表的实现
数据结构·笔记·stm32·mcu·链表·嵌入式·freertos
captain3764 小时前
MyBatis Plus(1)
java·服务器·mybatis
香蕉大香蕉(06敬畏市场)4 小时前
MySQL 单点详解(08)
java·数据库·mysql·面试·八股
thefool1122664 小时前
HTTPS协议
java
acd120095 小时前
Nginx 反向代理的缓冲区坑:后端响应大时接口偶发 502
java·运维·nginx
装不满的克莱因瓶5 小时前
支付订单成功异步MQ权益发放设计和开发
java·架构·系统架构·rabbitmq·硬件架构
高冷小鱼殿下5 小时前
内部类Lambda与枚举
java·开发语言
小蒜学长6 小时前
编程语言在线学习平台的设计与实现(代码+数据库+LW)
java·spring boot·后端·编程语言在线学习平台·在线编码