Web上机:JSP+Servlet+JDBC的交互流程

news2024/10/5 15:33:08


目录

需求与设计

基础需求:

项目结构:

项目逻辑:

运行图示: 

代码实现

Login.jsp

InsertServlet

SelectServlet

Table.jsp

user

mysql表结构


Web开发技术迭代速度日新月异,对于技术的更新往往是基于底层一步步封装简化,因此掌握一些基础的传统的开发技术还是有必要的。传统的JavaWeb开发通常使用Java Servlet、JavaServer Pages(JSP)、JavaBeans等技术来开发Web应用程序。

需求与设计

基础需求:

要求用户从前台界面输入基本信息,并且做基础的校验,验证无误后将数据插入数据库,再从数据库中查询所有的数据,最后再呈现到前台页面。

项目结构:

项目逻辑:

  1. 用户登录注册页面Login.jsp,登陆时密码不一致则会提示
  2. 用户登录成功后会将数据提交至InsertServelt,并且插入到数据库中
  3. 插入完成后,跳转至SelectServelt,查询该数据库中全部字段信息,并且将结构封装返回给前台页面Table.jsp
  4. 前台页面拿到数据后进行遍历渲染

运行图示: 

在数据库查询数据后再返回给前端JSP,通过表格的方式呈现数据


代码实现

Login.jsp

包含了基础的注册功能和密码校验功能,通过简单的CSS样式美化了页面。

<%@ page import="java.util.Enumeration" %>
<%--
  登录注册页面,登陆时密码不一致则会提示
  用户登录成功后会将数据提交至InsertServelt,并且插入到数据库中
  插入完成后,跳转至SelectServelt,查询该数据库中全部字段信息,最终返回到Table.jsp中
--%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>注册</title>
  <style>
    body {
      font-family: Arial, sans-serif;
      margin: 0;
      padding: 0;
      background-color: #f7f7f7;
    }

    h2 {
      text-align: center;
      margin-top: 20px;
      color: #333;
    }

    .container {
      width: 50%;
      margin: 20px auto;
      background-color: #fff;
      padding: 20px;
      box-shadow: 0 0 20px rgba(0, 0, 0, 0.1);
    }

    form {
      margin-top: 20px;
    }

    table {
      width: 100%;
    }

    td {
      padding: 5px;
    }

    .txtBox {
      padding: 5px;
      width: 100%;
      font-size: 16px;
    }

    input[type="submit"], input[type="reset"] {
      padding: 5px 10px;
      background-color: #4CAF50;
      color: white;
      border: none;
      border-radius: 3px;
      cursor: pointer;
    }

    input[type="submit"]:hover, input[type="reset"]:hover {
      background-color: #45a049;
    }
  </style>
  <script>
    function validateForm() {
      var password = document.getElementById('password').value;
      var confirmPassword = document.getElementById('repassword').value;

      if (password !== confirmPassword) {
        document.getElementById('repasswordError').innerText = '密码不一致';
        return false;
      } else {
        document.getElementById('repasswordError').innerText = '';
        return true;
      }
    }
  </script>
</head>
<body>
<%
  // 检查 application 中是否已经存在计数器属性
  Integer count = (Integer) application.getAttribute("visitCount");
  if (count == null) {
    count = 0;
  }
  // 增加访问次数
  count++;
  application.setAttribute("visitCount", count);
%>
<h2>本网站访问次数: <%= count - 1%></h2>
<div class="container">
  <h3>请输入注册信息</h3>
  <form name="form1" method="post" action="InsertServlet" onsubmit="return validateForm()">
    <table>
      <tr>
        <td>用户姓名:</td>
        <td><input type="text" name="username" value="" class="txtBox"/></td>
      </tr>
      <tr>
        <td>用户密码:</td>
        <td><input type="password" id="password" name="password" value="" class="txtBox"/></td>
      </tr>
      <tr>
        <td>确认用户密码:</td>
        <td><input type="password" id="repassword" name="repassword" value="" class="txtBox"/></td>
        <td><span id="repasswordError" style="color: red;"></span></td>
      </tr>
      <tr>
        <td>备注信息:</td>
        <td><input type="text" name="information" value="Hello,This is user" class="txtBox"/></td>
      </tr>
      <tr>
        <td>兴趣爱好:</td>
        <td>
          <input type="checkbox" name="hobby" value="Java"/>Java
          <input type="checkbox" name="hobby" value="Cpp"/>Cpp
          <input type="checkbox" name="hobby" value="Python"/>Python
          <input type="checkbox" name="hobby" value="Golang"/>Golang
        </td>
      </tr>
      <!-- 以下是提交、取消按钮 -->
      <tr>
        <td><input type="submit" value="注册用户"/></td>
        <td><input type="reset" value="取消"/></td>
      </tr>
    </table>
  </form>
</div>
</body>
</html>

InsertServlet

主要通过JDBC实现用户信息的插入。

import com.mysql.cj.jdbc.Driver;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * @Author Luming
 * @Date 2024/5/15 13:56
 * @Description:
 */
@WebServlet("/InsertServlet")
public class InsertServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        
        String url = "jdbc:mysql://127.0.0.1:3306/WebTest";
        String user = "root";//数据库名
        String passwd = "123456";//登录数据库密码

        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String information = request.getParameter("information");
        String[] hobbies = request.getParameterValues("hobby");
        String hobby = String.join(",", hobbies); // 使用逗号作为分隔符
        
        try {
            // 加载JDBC驱动程序
            Class.forName("com.mysql.jdbc.Driver");
            //1、注册驱动
            Driver driver = new com.mysql.jdbc.Driver();
            DriverManager.registerDriver(driver);
            //2.获取连接
            Connection connection = DriverManager.getConnection(url, user, passwd);
            //3、获取数据库操作对象
            Statement statement = connection.createStatement();
            //4.sql语句
            String sql = "insert into user_info (username, password, information, hobby) " +
                    "VALUES ('" + username + "', '" + password + "', '" + information + "', '" + hobby + "')";
            //5.执行sql语句后的结果
            int count = statement.executeUpdate(sql);
            
        } catch (SQLException | ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
        
        request.getRequestDispatcher("SelectServlet").forward(request,response);
    }
}

SelectServlet

主要通过JDBC实现了数据的查询,再将结构遍历封装,转发给前台页面

import Pojo.User;
import com.mysql.cj.jdbc.Driver;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author Luming
 * @Date 2024/5/15 20:01
 * @Description:
 */
@WebServlet("/SelectServlet")
public class SelectServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        
        String url = "jdbc:mysql://127.0.0.1:3306/WebTest";
        String user = "root";//数据库名
        String passwd = "123456";//登录数据库密码
        
        try {
            // 加载JDBC驱动程序
            Class.forName("com.mysql.jdbc.Driver");
            //1、注册驱动
            Driver driver = new com.mysql.jdbc.Driver();
            DriverManager.registerDriver(driver);
            //2.获取连接
            Connection connection = DriverManager.getConnection(url, user, passwd);
            //3、获取数据库操作对象
            Statement statement = connection.createStatement();
            //4.sql语句
            String sql = "select * from user_info";
            //5.执行sql语句后的结果
            ResultSet resultSet = statement.executeQuery(sql);
            //6.封装
            List<User> userList = new ArrayList<>();
            while (resultSet.next()) {
                User userTemp = new User();
                userTemp.setId(resultSet.getInt("id"));
                userTemp.setUsername(resultSet.getString("username"));
                userTemp.setPassword(resultSet.getString("password"));
                userTemp.setInformation(resultSet.getString("information"));
                userTemp.setHobby(resultSet.getString("hobby"));
                userList.add(userTemp);
            }
            // 将 userList 存储到 request 中,方便在 JSP 中使用
            request.setAttribute("userList", userList);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
        request.getRequestDispatcher("Table.jsp").forward(request,response);
    }
}

Table.jsp

遍历展示数据库信息

<%@ page import="Pojo.User" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>表格</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f7f7f7;
            margin: 0;
            padding: 0;
        }

        h1 {
            text-align: center;
            margin-top: 20px;
            color: #333;
        }

        table {
            width: 80%;
            margin: 20px auto;
            border-collapse: collapse;
            background-color: #fff;
            box-shadow: 0 0 20px rgba(0, 0, 0, 0.1);
        }

        th, td {
            border: 1px solid #ddd;
            padding: 10px;
            text-align: left;
        }

        th {
            background-color: #f2f2f2;
            font-weight: bold;
        }

        tr:nth-child(even) {
            background-color: #f9f9f9;
        }

        tr:hover {
            background-color: #f1f1f1;
        }

        .button-container {
            text-align: center;
            margin-top: 20px;
        }

        .button {
            padding: 10px 20px;
            background-color: #4CAF50;
            color: white;
            border: none;
            border-radius: 5px;
            cursor: pointer;
            margin-right: 10px;
        }

        .button:hover {
            background-color: #45a049;
        }
    </style>
</head>
<body>
<h1>用户信息表</h1>
<table>
    <tr>
        <th>ID</th>
        <th>用户名</th>
        <th>密码</th>
        <th>备注信息</th>
        <th>兴趣爱好</th>
    </tr>
    <%
        List<User> userList = (List<User>) request.getAttribute("userList");
        for (User user : userList) {
            out.println("<tr>");
            out.println("<td>" + user.getId() + "</td>");
            out.println("<td>" + user.getUsername() + "</td>");
            out.println("<td>" + user.getPassword() + "</td>");
            out.println("<td>" + user.getInformation() + "</td>");
            out.println("<td>" + user.getHobby() + "</td>");
            out.println("</tr>");
        }
    %>
</table>
</body>
</html>

user

用户实体类,用来封装查询后的数据,这里使用了lombok注解,如果不使用lombok的注解的话,需要自己手动去设置每个字段的set和get方法,以及无参构造方法和全参构造方法。

package Pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @Author Luming
 * @Date 2024/5/15 20:17
 * @Description:
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private int id;
    private String username;
    private String password;
    private String information;
    private String hobby;
}

mysql表结构

CREATE TABLE `user_info` (
  `id` int NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  `information` varchar(255) DEFAULT NULL,
  `hobby` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;



 本次的分享就到此为止了,希望我的分享能给您带来帮助,创作不易也欢迎大家三连支持,你们的点赞就是博主更新最大的动力!如有不同意见,欢迎评论区积极讨论交流,让我们一起学习进步!有相关问题也可以私信博主,评论区和私信都会认真查看的,我们下次再见

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1700654.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Node.js笔记(万字总结)

目录 前言 1.node介绍与使用 1.1 Node介绍 1.2 node.js的优势 1.3 node的安装 1.4 检验是否成功安装 1.5 第一个应用 1.5.1 服务器代码 server.js 1.5.2 完整代码 1.5.3 运行 1.5.4 测试 2.获取参数 3.模块系统 1.模块介绍 2.xiaoyu.js 3.xiaoyu.js完整代码 4…

Midjourney 推出Style Tuner工具 ,统一风格,提升创作效率!

Midjourney 由前 Magic Leap 程序员大卫 - 霍尔茨&#xff08;David Holz&#xff09;构思&#xff0c;于 2022 年夏天推出&#xff0c;在独立消息应用 Discord 的服务器上吸引了超过 1600 万用户&#xff0c;并由一个小规模的程序员团队不断更新&#xff0c;推出了包括平移、扩…

重温!瑞幸崩盘时的狂欢,我的股票盈利170%,陆正耀资本局大起底

瑞幸咖啡 瑞幸2019年5月&#xff0c;仅用了18个月就完成了上市。 不到1年&#xff0c;2020年3月戏剧化反转&#xff0c;被爆造假 2019年净收入虚增21亿&#xff0c;2季度2.5亿&#xff0c;3季度7亿、4季度11.7亿。 2019年成本支出虚增13亿&#xff0c;2季度1.5亿元&#xf…

UE4/UE5像素流送云推流:多人访问不稳定、画面糊、端口占用多等

UE4/UE5想要实现网页访问&#xff0c;很多工程师会选择guan方的像素流送。但这个技术要求在模型开发初期就接入。对于一些已有UE模型是无法进行流化的。虽然也可以解决新UE模型的网页访问问题&#xff0c;但在实际的应用中&#xff0c;点量云流也收到很多反馈说&#xff0c;使用…

重生之 SpringBoot3 入门保姆级学习(02、打包部署)

重生之 SpringBoot3 入门保姆级学习&#xff08;02、打包部署&#xff09; 1.6 打包插件1.7 测试 jar 包1.8 application.properties 的相关配置 1.6 打包插件 官网链接 https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started.html#getting-starte…

短视频矩阵系统4年独立开发正规代发布接口源码搭建部署开发

1. 短视频矩阵源码技术开发要求及实现流程&#xff1a; 短视频矩阵源码开发要求具备视频录制、编辑、剪辑、分享等基本功能&#xff0c;支持实时滤镜、特效、音乐等个性化编辑&#xff0c;能够实现高效的视频渲染和处理。开发流程主要包括需求分析、技术选型、设计架构、编码实…

专家解读 | NIST网络安全框架(2):核心功能

NIST CSF是一个关键的网络安全指南&#xff0c;不仅适用于组织内部&#xff0c;还可帮助管理第三方网络安全风险。CSF核心包含了六个关键功能——治理、识别、保护、检测、响应和恢复&#xff0c;以及与这些功能相关的类别和子类别。本文将深入探讨CSF核心的主要内容&#xff0…

大气走航VOCS监测

1. 什么是走航监测&#xff1f; 走航监测主要指驾驶移动监测车&#xff0c;在一定区域范围之内边行驶、边检测、边反馈。通过车载的质谱监测系统&#xff0c;对环境空气中的VOCs进行快速检测&#xff1b;通过检测出的污染物总浓度&#xff0c;描绘污染地图。环保部门从污染地…

wincc如何实现远程监控1200PLC

用户监控中心和PLC不在同一个地方&#xff0c;需要通过互联网远程能监控PLC的运行状况。PLC型号是西门子1200&#xff0c;远程监控电脑用WINCC组态。wincc如何实现远程监控1200PLC呢。WINCC的通讯协议都是局域网&#xff0c;不能通过互联网找到远端PLC并通讯。随着工业物联网发…

PyTorch中的模型创建

最全最详细的PyTorch神经网络创建~ 话不多说直接开始~ 神经网络的创建步骤 定义模型类&#xff0c;需要继承nn.Module定义各种层&#xff0c;包括卷积层、池化层、全连接层、激活函数等等编写前向传播&#xff0c;规定信号是如何传输的 可以用 torchsummary 查看网络结构&…

拼多多的一场机试 解题报告 | 珂学家

前言 拼多多的一场机试 解题报告 有需要机试辅导&#xff0c;可以私信我 机试题 D. 任务队列是否会死锁&#xff1f; 一个任务队列&#xff0c;长度为n 可以添加一个任务&#xff0c;长度为a可以获取一个任务&#xff0c;长度为b 如果存在一个状态点&#xff0c;即不能添加…

python 两个表格字段列名称值,对比字段差异

支持xlsx,xls文件&#xff0c;相互对比字段列 输出两个表格文件相同字段&#xff0c;置底色为绿色 存在差异的不同字段&#xff0c;输出两个新的表格文件&#xff0c;差异字段&#xff0c;置底色为红色 import pandas as pd from openpyxl import load_workbook from openpy…

简单易懂的 API 集成测试方法

简介&#xff1a;API 集成测试的重要性 API 集成测试是一类测试活动&#xff0c;用于验证 API 是否满足功能性、可靠性、性能和安全性等方面的预期要求。在多 API 协作的应用程序中&#xff0c;这种测试尤为紧要。 在这一阶段&#xff0c;我们不仅审视单个组件&#xff0c;还…

比例溢流阀的放大器找BEUEC

液压比例放大器的使用范围广泛&#xff0c;包括工业生产线、船舶液压系统等多个领域。BEUEC比例放大器是一种重要的液压系统组件&#xff0c;其作用是将微弱的液压信号放大&#xff0c;以实现对液压系统的精确控制。这种设备在多个行业中都有广泛的应用&#xff0c;特别是在需要…

可视化大屏开发,知道了这些经验以及解决方案,效率至少提升2倍!(完结篇)

大家好&#xff0c;我是日拱一卒的攻城师不浪&#xff0c;专注可视化、数字孪生、前端、nodejs、AI学习、GIS等学习沉淀&#xff0c;这是2024年输出的第16/100篇文章&#xff1b; 前言 之前写了两篇可视化大屏开发的经验总结&#xff0c;小伙伴们反应还不错。 最近&#xff0…

响应式UI组件DevExtreme中文教程 - 工具栏的自适应模式

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序。从Angular和Reac&#xff0c…

浅谈JMeter环境变量设置

JMeter环境变量设置 确保已安装Java Development Kit (JDK) JMeter需要Java运行环境&#xff0c;因此请先安装JDK&#xff0c;并确认JAVA_HOME环境变量已经设置好。可以通过命令提示符输入java -version和javac -version来验证是否安装成功及其版本信息&#xff0c;若没有出现…

阿里云 EMR Serverless Spark 版开启免费公测

阿里云 EMR Serverless Spark 版是一款云原生&#xff0c;专为大规模数据处理和分析而设计的全托管 Serverless 产品。它为企业提供了一站式的数据平台服务&#xff0c;包括任务开发、调试、调度和运维等&#xff0c;极大地简化了数据处理的全生命周期工作流程。使用 EMR Serve…

气膜建筑:室内滑雪场的理想选择—轻空间

近年来&#xff0c;室内滑雪场成为越来越多投资者关注的热门项目。随着滑雪运动的普及&#xff0c;滑雪场的生意也愈加红火。对于投资者来说&#xff0c;选择一种省钱又实惠的搭建方案至关重要&#xff0c;而气膜建筑无疑是一个理想的选择。以下将详细介绍气膜建筑在室内滑雪场…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑分布式光伏高效消纳与负荷损失最小的区域配电网应急资源协同配置策略》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…