一、以下是注册登录的小项目。如果是没有登录的状态访问index.jsp则显示欢迎并提供注册或者登录的链接。如果已登录状态访问主页则显示退出登录和显示所有所有注册用户的链接。在显示所有注册用户的链接页面可以对前面所注册的用户进行删除和修改。二、撰写项目文件1、新建项目并把之前的表单文件拷贝到新项目相应的文件夹下面2、添加新的增删改查的文件index.jsp% page languagejava contentTypetext/html; charsetUTF-8 pageEncodingUTF-8% !DOCTYPE html html head meta charsetUTF-8 title首页/title style body { text-align: center; margin-top: 60px; } a { margin: 0 8px; } /style /head body h1这是主页/h1 % // 从 session 中读取当前登录用户用于控制页面显示内容 Object loginUser session.getAttribute(loginUser); if (loginUser ! null) { % h1登录成功/h1 p欢迎您% loginUser %/p a hrefselect.jsp查看所有注册用户信息/a a hreflogout.jsp退出登录/a % } else { % h1欢迎来到系统/h1 p您还没有登录请先注册或登录/p a hrefzhuce.jsp去注册/a a hreflogin.jsp去登录/a % } % /body /htmllogin.jsp% page contentTypetext/html;charsetUTF-8 languagejava % !DOCTYPE html html head title用户登录/title style form { width: 320px; margin: 60px auto; padding: 20px; border: 1px solid #ddd; border-radius: 8px; background: #fafafa; } .item { margin: 12px 0; } label { display: inline-block; width: 90px; } input { width: 190px; padding: 6px; } button { margin-left: 90px; padding: 6px 18px; } /style /head body h2 styletext-align: center登录页面/h2 form actionloginCheck.jsp methodpost div classitem label用户名/label input typetext nameusername required / /div div classitem label密码/label input typepassword namepassword required / /div button typesubmit登录/button /form /body /htmlloginCheck.jsp% page contentTypetext/html;charsetUTF-8 languagejava % % page importjava.sql.* % % request.setCharacterEncoding(UTF-8); String username request.getParameter(username); String password request.getParameter(password); boolean loginSuccess false; // 使用占位符避免 SQL 注入 String sql SELECT id FROM t_user WHERE username ? AND password ?; try { // 加载 JDBC 驱动并建立数据库连接 Class.forName(com.mysql.jdbc.Driver); String uri jdbc:mysql://127.0.0.1/2026shangke?useUnicodetruecharacterEncodingUTF-8; String user root; String password1 123; // PreparedStatement 负责预编译 SQL 并安全绑定参数 try (Connection conn DriverManager.getConnection(uri, user, password1); PreparedStatement ps conn.prepareStatement(sql)) { ps.setString(1, username); ps.setString(2, password); try (ResultSet rs ps.executeQuery()) { loginSuccess rs.next(); } } } catch (Exception e) { request.setAttribute(errorMsg, 数据库异常 e.getMessage()); } if (loginSuccess) { // 登录成功后写入 session后续页面可据此判断登录状态 session.setAttribute(loginUser, username); response.sendRedirect(index.jsp); return; } % !DOCTYPE html html head title登录结果/title /head body styletext-align: center; margin-top: 60px h2 % request.getAttribute(errorMsg) ! null ? request.getAttribute(errorMsg) : 登录不成功用户名或者密码不正确。 % /h2 a hreflogin.jsp返回登录/a /body /htmllogout.jsp% page contentTypetext/html;charsetUTF-8 languagejava % % // 清理登录标记并销毁 session完成退出登录 session.removeAttribute(loginUser); session.invalidate(); // 退出后返回首页 response.sendRedirect(index.jsp); %select.jsp% page contentTypetext/html;charsetUTF-8 languagejava % % page importjava.sql.* % !DOCTYPE html html head meta charsetUTF-8 / title用户列表/title style body { margin: 30px; font-family: Microsoft YaHei, sans-serif; } table { border-collapse: collapse; width: 100%; } th, td { border: 1px solid #ddd; padding: 8px 10px; text-align: center; } th { background: #f5f5f5; } .actions a { margin: 0 6px; } .top-link { margin-bottom: 14px; } /style /head body h2所有注册用户信息/h2 p classtop-linka hrefindex.jsp返回首页/a/p table tr thID/th th用户名/th th密码/th th性别/th th年龄/th th爱好/th th操作/th /tr % // 查询所有用户结果用于列表展示 String sql SELECT id, username, password, gender, age, hobby FROM t_user ORDER BY id DESC; try { // 加载 JDBC 驱动并建立数据库连接 Class.forName(com.mysql.jdbc.Driver); String uri jdbc:mysql://127.0.0.1/2026shangke?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingUTF-8; String user root; String password1 123; // PreparedStatement 执行预编译 SQLResultSet 逐行读取结果 try (Connection conn DriverManager.getConnection(uri, user, password1); PreparedStatement ps conn.prepareStatement(sql); ResultSet rs ps.executeQuery()) { while (rs.next()) { % tr td% rs.getInt(id) %/td td% rs.getString(username) %/td td% rs.getString(password) %/td td% rs.getString(gender) %/td td% rs.getInt(age) %/td td% rs.getString(hobby) %/td td classactions a hrefupdateUser.jsp?id% rs.getInt(id) %修改/a a hrefdeleteUser.jsp?id% rs.getInt(id) % onclickreturn confirm(确认删除该用户吗); 删除/a /td /tr % } } } catch (Exception e) { % tr td colspan7 stylecolor: red查询失败% e.getMessage() %/td /tr % } % /table /body /htmlupdateUser.jsp% page contentTypetext/html;charsetUTF-8 languagejava % % page importjava.sql.* % % request.setCharacterEncoding(UTF-8); String jdbcDriver com.mysql.jdbc.Driver; String jdbcUrl jdbc:mysql://127.0.0.1/2026shangke?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingUTF-8; String jdbcUser root; String jdbcPassword 123; // 加载 JDBC 驱动后续通过 DriverManager 建立连接 Class.forName(jdbcDriver); String method request.getMethod(); String idText request.getParameter(id); String username ; String password ; String gender ; String ageText ; String hobby ; String msg null; if (idText null || idText.trim().isEmpty()) { msg 缺少用户 id无法修改。; } else { try { int userId Integer.parseInt(idText); // 共享同一个连接POST 执行更新GET 执行回显查询 try (Connection conn DriverManager.getConnection(jdbcUrl, jdbcUser, jdbcPassword)) { if (POST.equalsIgnoreCase(method)) { username request.getParameter(username); password request.getParameter(password); gender request.getParameter(gender); ageText request.getParameter(age); hobby request.getParameter(hobby); String updateSql UPDATE t_user SET username?, password?, gender?, age?, hobby? WHERE id?; // 预处理语句绑定参数并提交更新 try (PreparedStatement ps conn.prepareStatement(updateSql)) { ps.setString(1, username); ps.setString(2, password); ps.setString(3, gender); ps.setInt(4, Integer.parseInt(ageText)); ps.setString(5, hobby); ps.setInt(6, userId); int rows ps.executeUpdate(); msg rows 0 ? 修改成功。 : 修改失败用户不存在。; } } else { String querySql SELECT username, password, gender, age, hobby FROM t_user WHERE id ?; // 预处理语句按 id 查询用于表单回显 try (PreparedStatement ps conn.prepareStatement(querySql)) { ps.setInt(1, userId); try (ResultSet rs ps.executeQuery()) { if (rs.next()) { username rs.getString(username); password rs.getString(password); gender rs.getString(gender); ageText String.valueOf(rs.getInt(age)); hobby rs.getString(hobby); } else { msg 未找到该用户。; } } } } } } catch (NumberFormatException e) { msg 参数格式错误 e.getMessage(); } catch (Exception e) { msg 操作失败 e.getMessage(); } } % !DOCTYPE html html head meta charsetUTF-8 / title修改用户/title style body { font-family: Microsoft YaHei, sans-serif; } form { width: 420px; margin: 40px auto; border: 1px solid #ddd; border-radius: 8px; padding: 20px; background: #fafafa; } .item { margin: 10px 0; } label { display: inline-block; width: 90px; } input { width: 260px; padding: 6px; } button { margin-left: 90px; padding: 6px 18px; } .center { text-align: center; } /style /head body h2 classcenter修改用户信息/h2 % if (msg ! null) { % p classcenterstrong% msg %/strong/p % } % % if (idText ! null !idText.trim().isEmpty() !POST.equalsIgnoreCase(method) msg null) { % form actionupdateUser.jsp methodpost input typehidden nameid value% idText % / div classitem label用户名/label input typetext nameusername value% username % required / /div div classitem label密码/label input typetext namepassword value% password % required / /div div classitem label性别/label input typetext namegender value% gender % required / /div div classitem label年龄/label input typenumber nameage value% ageText % required / /div div classitem label爱好/label input typetext namehobby value% hobby % / /div button typesubmit提交修改/button /form % } % p classcentera hrefselect.jsp返回用户列表/a/p /body /htmlzhuce.jsp% page contentTypetext/html;charsetUTF-8 languagejava % html head title用户注册/title style form { width: 380px; margin: 50px auto; padding: 20px; border: 1px solid #ddd; border-radius: 8px; background: #fafafa; } .item { margin: 10px 0; } label { display: inline-block; width: 80px; } input[typetext], input[typepassword], input[typenumber] { padding: 5px; width: 200px; } button { padding: 6px 20px; margin-left: 80px; } .options { display: inline-block; } .options label { width: auto; margin-right: 10px; } /style /head body h1 styletext-align: center用户注册表单/h1 %-- 表单提交到zhuceCkeck.jsp提交方式为post --% form actionzhuceCkeck.jsp methodpost div classitem label用户名/label input typetext nameusername required / %-- required表示必填 --% /div div classitem label密码/label input typepassword namepassword required / /div div classitem label性别/label span classoptions label input typeradio namegender value男 required / 男/label labelinput typeradio namegender value女 / 女/label /span /div div classitem label年龄/label input typenumber nameage min1 max120 required / /div div classitem label爱好/label span classoptions label input typecheckbox namehobby value篮球 / 篮球/label label input typecheckbox namehobby value音乐 / 音乐/label label input typecheckbox namehobby value阅读 / 阅读/label label input typecheckbox namehobby value旅行 / 旅行/label /span /div button typesubmit提交/button /form /body /htmlzhuceCkeck.jsp% page contentTypetext/html;charsetUTF-8 languagejava % % page importjava.util.Arrays % % page importjava.sql.* % html head title注册结果/title style body { text-align: center; margin-top: 50px; } .result { display: inline-block; text-align: left; } /style /head body % request.setCharacterEncoding(UTF-8); String username request.getParameter(username); String password request.getParameter(password); String gender request.getParameter(gender); String ageText request.getParameter(age); String[] hobbies request.getParameterValues(hobby); String hobbyText (hobbies ! null hobbies.length 0) ? Arrays.toString(hobbies).replace([, ).replace(], ) : 未选择; int age Integer.parseInt(ageText); boolean registerSuccess false; String msg; String checkSql SELECT id FROM t_user WHERE username ?; String insertSql INSERT INTO t_user(username, password, gender, age, hobby) VALUES(?, ?, ?, ?, ?); try { // 加载 JDBC 驱动并连接数据库 Class.forName(com.mysql.jdbc.Driver); String uri jdbc:mysql://127.0.0.1/2026shangke?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingUTF-8; String user root; String password1 123; // 先用预处理语句校验用户名是否已存在 try (Connection conn DriverManager.getConnection(uri, user, password1); PreparedStatement checkPs conn.prepareStatement(checkSql)) { checkPs.setString(1, username); try (ResultSet rs checkPs.executeQuery()) { if (rs.next()) { msg 注册失败用户名已存在; } else { // 不存在则继续使用预处理语句插入用户数据 try (PreparedStatement insertPs conn.prepareStatement(insertSql)) { insertPs.setString(1, username); insertPs.setString(2, password); insertPs.setString(3, gender); insertPs.setInt(4, age); insertPs.setString(5, hobbyText); registerSuccess insertPs.executeUpdate() 0; msg registerSuccess ? 注册信息提交成功 : 注册失败请重试; } } } } } catch (Exception e) { msg 注册失败数据库异常 - e.getMessage(); } % h1% msg %/h1 div classresult p用户名% username %/p p性别% gender %/p p年龄% ageText % 岁/p p爱好% hobbyText %/p %-- 跳转回表单页面 --% a hrefzhuce.jsp返回重新提交/a nbsp;nbsp; a hreflogin.jsp去登录/a /div /body /htmldeleteUser.jsp% page contentTypetext/html;charsetUTF-8 languagejava % % page importjava.sql.* % % request.setCharacterEncoding(UTF-8); String idText request.getParameter(id); String msg; if (idText null || idText.trim().isEmpty()) { msg 删除失败缺少用户 id。; } else { // 按 id 删除用户使用占位符避免 SQL 注入 String sql DELETE FROM t_user WHERE id ?; try { // 加载驱动并连接数据库 Class.forName(com.mysql.jdbc.Driver); String uri jdbc:mysql://127.0.0.1/2026shangke?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingUTF-8; String user root; String password1 123; // PreparedStatement 绑定 id 参数后执行删除 try (Connection conn DriverManager.getConnection(uri, user, password1); PreparedStatement ps conn.prepareStatement(sql)) { ps.setInt(1, Integer.parseInt(idText)); int rows ps.executeUpdate(); msg rows 0 ? 删除成功。 : 删除失败用户不存在。; } } catch (Exception e) { msg 删除失败 e.getMessage(); } } % !DOCTYPE html html head meta charsetUTF-8 / title删除用户/title style body { text-align: center; margin-top: 80px; font-family: Microsoft YaHei, sans-serif; } /style /head body h2% msg %/h2 pa hrefselect.jsp返回用户列表/a/p /body /htmlpom.xmldependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version5.1.49/version /dependency三、项目的部署1、可以按照vs code中常规的先打包在部署到tomcat中mvn clean package 打包成demo.war的文件run on server 会自动将war文件拷贝到tomcat的webapps目录下面。然后就可以war包的名字作为路径来访问。http://localhost:8080/demo/index.jsp2、只要改动了文件就要重新打包部署非常的麻烦。可以把所编辑的源文件直接拷贝到webapps相应的目录里面去。这样就不用再打包部署。每次修改了源代码拷贝替代即可。3、每次拷贝替代也非常的麻烦可以修改tomcat的配置文件server.xml让tomcat可以直接访问我们所编辑的文件夹。以下代码改成自己的路径和源代码的地址。Context path/zhucedenglu11 docBaseD:/2026workspace/zhucedenglu/demo/src/main/webapp reloadabletrue /设置好了以后tomcat重启这样就能访问了但是如果进这样操作发现一般的页面可以正常访问但是只要有数据库操作的页面都会报错。这是因为数据库的操作需要额外的java包。目前这个目录中没有。进入到之前vs code部署的项目文件中找到lib拷贝粘贴到源文件的目录中再次重启tomcat数据库的所有操作都能成功完成了。这个lib包中就是jsp操作数据库的jdbc的java包。四、如果是sql server数据库的话需要做的修改pom.xmldependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version5.1.49/version /dependencyselect-sqlserver.jsp% page contentTypetext/html;charsetUTF-8 languagejava % % page importjava.sql.* % !DOCTYPE html html head meta charsetUTF-8 / title用户列表 - SQL Server/title style body { margin: 30px; font-family: Microsoft YaHei, sans-serif; } table { border-collapse: collapse; width: 100%; } th, td { border: 1px solid #ddd; padding: 8px 10px; text-align: center; } th { background: #f5f5f5; } .actions a { margin: 0 6px; } .top-link { margin-bottom: 14px; } /style /head body h2所有注册用户信息/h2 p classtop-linka hrefindex.jsp返回首页/a/p table tr thID/th th用户名/th th密码/th th性别/th th年龄/th th爱好/th th操作/th /tr % // 查询所有用户结果用于列表展示 String sql SELECT id, username, password, gender, age, hobby FROM t_user ORDER BY id DESC; try { // 加载 SQL Server JDBC 驱动并建立数据库连接 Class.forName(com.microsoft.sqlserver.jdbc.SQLServerDriver); String uri jdbc:sqlserver://localhost:1433;databaseName2026shangke;encrypttrue;trustServerCertificatetrue; String user sa; String password1 123; // PreparedStatement 执行预编译 SQLResultSet 逐行读取结果 try (Connection conn DriverManager.getConnection(uri, user, password1); PreparedStatement ps conn.prepareStatement(sql); ResultSet rs ps.executeQuery()) { while (rs.next()) { % tr td% rs.getInt(id) %/td td% rs.getString(username) %/td td% rs.getString(password) %/td td% rs.getString(gender) %/td td% rs.getInt(age) %/td td% rs.getString(hobby) %/td td classactions a hrefupdateUser.jsp?id% rs.getInt(id) %修改/a a hrefdeleteUser.jsp?id% rs.getInt(id) % onclickreturn confirm(确认删除该用户吗); 删除/a /td /tr % } } } catch (Exception e) { % tr td colspan7 stylecolor: red查询失败% e.getMessage() %/td /tr % } % /table /body /html换不同的数据库代码部分需要改的只有加载驱动和建立连接这两句其他的地方没有任何变化。