Web期末复习指南(2w字总结)

打印 上一主题 下一主题

主题 919|帖子 919|积分 2757

前言:本文旨在梳理Web技能常包罗的内容,阅读完备篇文章后会对整体有个系统的认知,从前端的HTML到后端的MySql,对于大概试题中可能会涉及的地方都有所分析,通篇提供了很多代码案例,供读者更好的明白。对于一些很细节的东西如DOM对象、MySql的案例等等,笔者很想继续分享下去,但是受限于篇幅的原因只能点到为止,背面会考虑继续增补,夺取覆盖到全部的知识点。
  目录
一.HTML&CSS
▐ TABLE标签
▐ FORM表单
▐ CSS的引入方式
▐ CSS的三种选择器
二.JavaScript
▐ 常见BOM&DOM操作
三.JSP
▐ JSP的内置对象
GET和POST的区别
forward和redirect的区别
▐ EL表达式
四.Servlet
五.JavaBean&JDBC
▐ JDBC
六.MySql——CRUD
▐ Create(创建)
▐ Read(读取)
▐ Update(更新)
▐ Delete(删除)


一.HTML&CSS

这部分内容主要包罗了静态页面的计划,首先关于基础的概念需要了解。HTML部分需要了解常用的标签,基础的HTML文档的格式。
基础的标签有
a定义超链接img定义图像h1~h6标题标签br换行div定义文档中的节(片段)p定义段落style定义文档的样式信息table定义表格title定义文档的标题video定义嵌入的视频内容img定义嵌入的图片from定义供用户输入的表单   更多的标签可以检察官方文档:HTML 标签参考手册 (w3school.com.cn)
  ▐ TABLE标签

以下面的李白的表格结构为例子,需要对整个结构有大抵的规划。
首先,整个HTML由 head 和 body 俩部分组成,内容都在 body 里实现,table 标签用来指定表格,在表格内部 tr 标签表示行,在每一行中定义表格的单元类型,单元类型有俩种,分别是尺度单元格 td 和表头单元格 th ,th 元素中的文本通常呈现为粗体而且居中,td 元素中的文本通常是平凡的左对齐文本。但 th 可以让内容字体变粗。在 td 列标签中有 rowspan 属性设置单元格可纵跨的行数,colspan 属性定义单元格应该横跨的列数。
别的在 img 标签中可以通过 src 属性定义图片的地点,可以是相对地点也可以是绝对地点,也包罗互联网地点
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Document</title>
  7. </head>
  8. <body>
  9.     <table border="1px" cellspacing="1" width="800" height="400">
  10.         <tr>
  11.             <th>编号</th>
  12.             <td>101</td>
  13.             <th>性别</th>
  14.             <td>男</td>
  15.             <td rowspan="3" width="300px"><img src="https://ts1.cn.mm.bing.net/th/id/R-C.cdd6a89f24527c242061088967ade23c?rik=0S8wjp6vo3D3ew&riu=http%3a%2f%2fwww.askququ.com%2fuploads%2fallimg%2f200126%2f1_200126212832_1.jpg&ehk=s9kqLYNEYZ6sUXi%2bXugFkxCy%2b%2bYuJJgs6heq2blHRjE%3d&risl=&pid=ImgRaw&r=0" width="300px"></td>
  16.         </tr>
  17.         <tr>
  18.             <th>姓名</th>
  19.             <td colspan="3">李白</td>
  20.         </tr>
  21.         <tr>
  22.             <th>特长</th>
  23.             <td colspan="3">浪漫主义诗人</td>
  24.         </tr>
  25.     </table>
  26. </body>
  27. </html>
复制代码
现实效果:

▐ FORM表单

还有就是表单项的相干内容
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>个人信息</title>
  7.     <style>
  8.         div {
  9.             width: 33%;
  10.             margin: 0 auto;
  11.         }
  12.     </style>
  13. </head>
  14. <body>
  15.     <div>
  16.         <h1>个人信息录入</h1>
  17.         <form action="" method="post">
  18.             姓名:<input type="text" name="name"><br><br>
  19.             密码:<input type="password" name="password"><br><br>
  20.             确认密码:<input type="password" name="password"><br><br>
  21.             性别:<label><input type="radio" name="sex">男</label>
  22.                 <label><input type="radio" name="sex">女</label><br><br>
  23.             年龄:<input type="number" name="age"><br><br>
  24.             语言:<label><input type="checkbox" name="language" value="Java">Java</label>
  25.                 <label><input type="checkbox" name="language" value="C">C</label>
  26.                 <label><input type="checkbox" name="language" value="lua">lua</label>
  27.                 <label><input type="checkbox" name="language" value="Python">Python</label><br><br>
  28.             照片:<input type="file" name="photo"><br><br>
  29.             生日:<input type="date" name="brithday"><br><br>
  30.             时间:<input type="time" name="time"><br><br>
  31.             日期以及时间:<input type="datetime-local" name="datetime-local"><br><br>
  32.             邮箱:<input type="email" name="email"><br><br>
  33.             学历:<select name="degree">
  34.                 <option value="">请选择您的学历...</option>
  35.                 <option value="1">初中</option>
  36.                 <option value="2">高中</option>
  37.                 <option value="3">本科</option>
  38.                 <option value="4">硕士</option>
  39.                 <option value="5">博士</option>
  40.             </select><br><br>
  41.             个人简介:<textarea name="information"cols="30" rows="10"></textarea><br><br>
  42.             <input type="hidden" name="id">
  43.             <!-- 按钮 -->
  44.             <input type="button" value="确认按钮"><br><br> <!-- 无意义 -->
  45.             <input type="reset" value="重置">
  46.             <input type="submit" value="提交">
  47.         </form>
  48.     </div>
  49. </body>
  50. <script>
  51.     var passwd = getElementsByName('password');
  52.     alert(passwd[0]);
  53.     alert(passwd[1]);
  54. </script>
  55. </html>
复制代码
现实效果:

在HTML标签中可以直接使用相对应的CSS样式的属性,这部分需要了解的基础的CSS样式,CSS的引入方式,还有三种选择器。
基础的CSS样式比如:字体大小变化、文字加下划线、设置对齐方式
字体大小变化(设置对应的占的像素)
  1. h1 {
  2.         font-size:40px;
  3. }
  4. h2 {
  5.         font-size:30px;
  6. }
  7. p {
  8.         font-size:14px;
  9. }
复制代码
设置字体的粗细:
  1. p.normal {
  2.         font-weight:normal;
  3. }
  4. p.thick {
  5.         font-weight:bold;
  6. }
  7. p.thicker {
  8.         font-weight:900;
  9. }
复制代码
设置文本的对齐方式:
  1. div{
  2.     text-align: left; - 文本左对齐。
  3.     text-align: right; - 文本右对齐。
  4.     text-align: center; - 文本居中对齐。
  5.     text-align: justify; - 文本两端对齐,常用于打印文档。
  6. }
复制代码
设置文本下划线:
  1. <style>
  2.     .underline {
  3.         text-decoration: underline;
  4.     }
  5. </style>
复制代码
▐ CSS的引入方式

首先是CSS的引入方式,分为三种:

  • 外部样式:即CSS代码生存在外部,HTML文件通过 link 标签引用这个外部样式表
  • 内部样式:整体放在 head 标签,在 style 标签内写CSS代码
  • 行内样式:直接在HTML元素内通过对应标签的属性值使用 style
外部样式:
  1. <link rel="stylesheet" href="../css/news.css">
复制代码
内部样式:
  1. <style>
  2.     h1 {
  3.        color: #4d4f53;
  4.     }
  5. </style>
复制代码
行内样式:
  1. <h1 style="color: #4d4f53;">this is luming</h1>
复制代码
▐ CSS的三种选择器

对于CSS样式,我们可以对其归类,方便我们统一管理调用,即选择器。选择器分为以下三种
元素选择器:
  1. <span>2024年01月18日 09:01</span>
  2. <span>央视</span>
复制代码
注:span 标签无任何含义,仅仅只是用作布局,效果同 div
id选择器:
  1. <span id="timer1">2024年01月18日 09:01</span>
  2. <span>央视</span>
复制代码
  1. #timer1 {
  2.     color: #8888AA;
  3. }
复制代码
在标签内部我们可以设置它的id属性,然后在 style 中使用 “#” 来访问这个id所对应的标签,从而设置它的样式
类选择器:
  1. <span class="time">2024年01月18日 09:01</span>
  2. <span>央视</span>
复制代码
  1. .time {
  2.     color: red;
  3. }
复制代码
在标签内部我们可以设置它的所属的类,然后在 style 中使用 “.” 来访问这个类所包罗的标签,从而设置它的样式
   优先级:id选择器 > 类选择器 > 元素选择器
  
二.JavaScript

JavaScript的引入方式分为以下三种:
内联方式:直接在HTML页面中嵌入JavaScript代码,使用 script 标签将JavaScript代码放置在HTML文件的 head 或 body 标签内。比方:
  1. <head>
  2.   <script>
  3.     // JavaScript代码
  4.   </script>
  5. </head>
复制代码
这种方式适用于较小的脚本或临时性的代码
外部文件方式:将JavaScript代码生存在一个独立的外部文件中,然后使用 script 标签的src属性将文件引入到HTML页面中。比方:
  1. <head>
  2.   <script src="script.js"></script>
  3. </head>
复制代码
在外部文件中编写JavaScript代码,可以提高代码的可维护性和重用性。
内部方式:将JavaScript代码直接嵌入HTML文件的 script 标签内,但不使用src属性引入外部文件。比方:
  1. <head>
  2.   <script>
  3.     // JavaScript代码
  4.   </script>
  5. </head>
复制代码
▐ 常见BOM&DOM操作

BOM(Browser Object Model)是指欣赏器对象模子,是JavaScript中与欣赏器交互的一组对象的集合。BOM提供了一系列的对象,用于操作欣赏器窗口和欣赏器本身。最常用的BOM对象就是window对象,alert() confim() 方法都是window的内置对象
DOM(文档对象模子)是欣赏器用来表示网页文档的对象模子,通过DOM,JavaScript可以访问和操作网页中的元素和属性。最常见的就是与document相干的方法,他们都属于DOM操作,比如

  • getElementsByClassName():根据元素的class属性获取DOM节点。
  • getElementsByTagName():根据元素的标签名获取DOM节点。
还常用的DOM操作就是变乱监听,我们可以设置对应的函数当我们监听的变乱执行后自动执行,比如鼠标点击等,比如密码校验经常都是基于此。
常见的变乱:

  • onclick:鼠标单击变乱
  • onblur:元素失去焦点
  • onfocus:元素获得焦点
  • onsubmit:当表单提交时触发该变乱
用密码校验的例子可以很好的锻炼这方面的把握度
这个页面包罗了以下功能:


  • 在确认密码输入框失去焦点时(onblur变乱),会自动验证密码是否一致,并在输入框后显示红色错误提示。
  • 在四级结果输入框失去焦点时,会自动验证结果是否在0到710之间,并在输入框后显示红色错误提示。
  • 在手机号输入框失去焦点时,会自动验证手机号格式是否正确,并在输入框后显示红色错误提示。
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>表单验证示例</title>
  7.     <style>
  8.         body {
  9.             font-family: Arial, sans-serif;
  10.             margin: 0;
  11.             padding: 20px;
  12.             background-color: #f4f4f4;
  13.         }
  14.         .container {
  15.             max-width: 500px;
  16.             margin: auto;
  17.             background: white;
  18.             padding: 20px;
  19.             border-radius: 8px;
  20.             box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
  21.         }
  22.         h2 {
  23.             text-align: center;
  24.             margin-bottom: 20px;
  25.         }
  26.         .form-group {
  27.             margin-bottom: 15px;
  28.         }
  29.         .form-group label {
  30.             display: block;
  31.             margin-bottom: 5px;
  32.         }
  33.         .form-group input {
  34.             width: 100%;
  35.             padding: 8px;
  36.             box-sizing: border-box;
  37.         }
  38.         .form-group input[type="submit"] {
  39.             background-color: #007bff;
  40.             color: white;
  41.             border: none;
  42.             cursor: pointer;
  43.         }
  44.         .form-group input[type="submit"]:hover {
  45.             background-color: #0056b3;
  46.         }
  47.         .error {
  48.             color: red;
  49.             margin-top: 5px;
  50.         }
  51.     </style>
  52. </head>
  53. <body>
  54.     <div class="container">
  55.         <h2>用户注册</h2>
  56.         <form id="registrationForm" onsubmit="return validateForm()">
  57.             <div class="form-group">
  58.                 <label for="name">姓名:</label>
  59.                 <input type="text" id="name" name="name" required>
  60.             </div>
  61.             <div class="form-group">
  62.                 <label for="password">密码:</label>
  63.                 <input type="password" id="password" name="password" required>
  64.             </div>
  65.             <div class="form-group">
  66.                 <label for="confirmPassword">确认密码:</label>
  67.                 <input type="password" id="confirmPassword" name="confirmPassword" required onblur="validatePassword()">
  68.                 <div class="error" id="passwordError">密码不匹配</div>
  69.             </div>
  70.             <div class="form-group">
  71.                 <label for="score">四级成绩:</label>
  72.                 <input type="text" id="score" name="score" required onblur="validateScore()">
  73.                 <div class="error" id="scoreError">成绩必须在0到710之间</div>
  74.             </div>
  75.             <div class="form-group">
  76.                 <label for="phone">手机号:</label>
  77.                 <input type="text" id="phone" name="phone" required onblur="validatePhone()">
  78.                 <div class="error" id="phoneError">无效的手机号</div>
  79.             </div>
  80.             <div class="form-group">
  81.                 <input type="submit" value="提交">
  82.             </div>
  83.         </form>
  84.     </div>
  85.     <script>
  86.         function validatePassword() {
  87.             const password = document.getElementById('password').value;
  88.             const confirmPassword = document.getElementById('confirmPassword').value;
  89.             const passwordError = document.getElementById('passwordError');
  90.             if (password !== confirmPassword) {
  91.                 passwordError.style.display = 'block';
  92.             } else {
  93.                 passwordError.style.display = 'none';
  94.             }
  95.         }
  96.         function validateScore() {
  97.             const score = document.getElementById('score').value;
  98.             const scoreError = document.getElementById('scoreError');
  99.             if (isNaN(score) || score < 0 || score > 710) {
  100.                 scoreError.style.display = 'block';
  101.             } else {
  102.                 scoreError.style.display = 'none';
  103.             }
  104.         }
  105.         function validatePhone() {
  106.             const phone = document.getElementById('phone').value;
  107.             const phoneError = document.getElementById('phoneError');
  108.             const phonePattern = /^1[3-9]\d{9}$/;
  109.             if (!phonePattern.test(phone)) {
  110.                 phoneError.style.display = 'block';
  111.             } else {
  112.                 phoneError.style.display = 'none';
  113.             }
  114.         }
  115.         function validateForm() {
  116.             validatePassword();
  117.             validateScore();
  118.             validatePhone();
  119.             const passwordError = document.getElementById('passwordError').style.display === 'none';
  120.             const scoreError = document.getElementById('scoreError').style.display === 'none';
  121.             const phoneError = document.getElementById('phoneError').style.display === 'none';
  122.             return passwordError && scoreError && phoneError;
  123.         }
  124.     </script>
  125. </body>
  126. </html>
复制代码
其中:
  1. display: block; - 元素会被渲染成块级元素,它会在页面上占据一整行,宽度默认填满父元素的宽度,除非指定了宽度。块级元素可以设置宽度和高度。
  2. display: none; - 元素不会被渲染到页面上,也不会占据任何空间。这相当于将元素隐藏。
复制代码
终极效果:


三.JSP

JSP(JavaServer Pages)是一种基于Java的服务器端技能,用于创建动态网页。JSP允许在HTML中嵌入Java代码,并由服务器在哀求时生成动态内容。对于JSP内容首先要了解的就是JSP的基础语法。
基本用法:使用 <% ... %> 标签进行包裹Java代码,在服务端执行。
  1. <%
  2.     int count = 5;
  3.     out.println("Count is " + count);
  4. %>
复制代码
表达式:使用 <%= ... %> 包裹的Java代码,在服务端执行并输出结果。
  1. <%= new java.util.Date() %>
复制代码
解释:JSP解释使用 <%-- ... --%>,不会在客户端显示。
  1. <%-- This is a JSP comment --%>
复制代码
▐ JSP的内置对象

常用的内置对象有以下几个,需要把握他们怎样进行数据的交互的

  • request:表示客户端哀求,包罗哀求参数、哀求头信息等。
  • response:表示服务器相应,允许设置相应状态、相应头和输出内容。
  • out:用于输出内容到客户端。
  • session:表示用户会话,允许在会话中存储用户数据。
  • application:表示Servlet上下文,允许在应用范围内存储数据。
以requset举例:
可以使用 request.getParameter(name) 获取单个哀求参数,request.getParameterValues(name) 获取多个参数值,request.getParameterNames() 获取所有参数名称。
  1. <%
  2. // 获取单个参数
  3. String username = request.getParameter("username");
  4. out.println("用户名: " + username);
  5. // 获取多个参数值(例如复选框)
  6. String[] hobbies = request.getParameterValues("hobbies");
  7. if (hobbies != null) {
  8.     for (String hobby : hobbies) {
  9.         out.println("爱好: " + hobby);
  10.     }
  11. }
  12. // 获取所有参数名称
  13. java.util.Enumeration paramNames = request.getParameterNames();
  14. while (paramNames.hasMoreElements()) {
  15.     String paramName = (String) paramNames.nextElement();
  16.     String paramValue = request.getParameter(paramName);
  17.     out.println(paramName + ": " + paramValue);
  18. }
  19. %>
复制代码
可以使用 request.setAttribute(name, value) 设置哀求属性,request.getAttribute(name) 获取哀求属性。
  1. <%
  2. // 设置请求属性
  3. request.setAttribute("message", "Hello, JSP!");
  4. // 获取请求属性
  5. String message = (String) request.getAttribute("message");
  6. out.println("消息: " + message);
  7. %>
复制代码
这些内置对象在使用方法上大同小异,拿session来说,他相干的方法也同上
可以使用 session.setAttribute(name, value) 设置会话属性,session.getAttribute(name) 获取会话属性,session.removeAttribute(name) 移除会话属性。
  1. <%
  2. // 设置会话属性
  3. session.setAttribute("username", "JohnDoe");
  4. // 获取会话属性
  5. String username = (String) session.getAttribute("username");
  6. out.println("用户名: " + username);
  7. // 移除会话属性
  8. session.removeAttribute("username");
  9. %>
复制代码
GET和POST的区别

GET和POST是两种常用的HTTP哀求方法,用于向服务器发送数据。它们在表单提交时有几个重要的区别:
GET: 数据附加在URL后,以查询字符串的情势传输。查询字符串位于URL的末尾,以?开头,参数之间用&分隔。比方:
  1. http://example.com/form?name=JohnDoe&age=25
复制代码
POST: 数据在哀求体中传输,不会显示在URL中。这种方式更安全,由于数据不轻易被第三方看到。
   GET方式的劣势在于:传输的数据只能是字符串,对数据类型具有一定限制,传输数据的值会在欣赏器地点栏里面被看到,秘密性要求很严格的数据(如密码),不应该用 URL 方法来传值。
  GET方式的优势在于:简单性和平台支持的多样性(没有欣赏器不支持 URL)
  forward和redirect的区别

forward 方法属于服务器端去哀求资源,服务器直接访问目标地点,并对该目标地点的相应内容进行读取,再把读取的内容发给欣赏器,因此客户端欣赏器的地点不变
redirect 是告诉客户端,使欣赏器知道去哀求哪一个地点,相当于客户端重新哀求一 遍。所以地点显示栏会变

  • 从数据权限来说,forward 转发的页,以及转发到的目标页面可以或许共享 request 里面的数据。redirect 转发的页以及转发到的目标页面不能共享 request 里面的数据,需要通过在URL后进行拼接才能传数据。
  • 从哀求的范围来说,forward 方法只能在同一个 Web 应用程序内的资源之间转发哀求,可以明白为服务器内部的一种操作。redirect 可以或许重定向到当前应用程序的其他源,而且还可以或许重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对 URL 重定向到其他站点的资源。
  • 从服从来说:forward 服从较高,由于跳转仅发生在服务器端。redirect 相对较低,由于类似于再进行了一次哀求。
▐ EL表达式

EL(Expression Language,表达式语言)是一种在 JSP(JavaServer Pages) 和 JSF(JavaServer Faces)等 Java Web 应用框架中使用的语言。它提供了一种简单的方式来访问和操作 JavaBean 属性、集合、数组、映射等数据结构,以及通过简便的语法执行简单的操作和函数调用。
假设有一个 User JavaBean:
  1. public class User {
  2.     private String name;
  3.     private int age;
  4.     // Getter and Setter methods
  5.     public String getName() { return name; }
  6.     public void setName(String name) { this.name = name; }
  7.     public int getAge() { return age; }
  8.     public void setAge(int age) { this.age = age; }
  9. }
复制代码
在 JSP 中,可以使用 EL 表达式来访问 User 对象的属性:
  1. <jsp:useBean id="user" class="com.example.User" scope="session" />
  2. <%
  3.     user.setName("John Doe");
  4.     user.setAge(30);
  5. %>
  6. <p>姓名: ${user.name}</p>
  7. <p>年龄: ${user.age}</p>
复制代码
假设有一个 List 对象:
  1. List<String> names = new ArrayList<>();
  2. names.add("Alice");
  3. names.add("Bob");
  4. request.setAttribute("names", names);
复制代码
在 JSP 中,可以使用 EL 表达式来访问集合内容:
  1. <p>第一个名字: ${names[0]}</p>
  2. <p>第二个名字: ${names[1]}</p>
复制代码
还可以使用forEach遍历整个集合
  1. <c:forEach var="item" items="${resultList}">
  2.     <tr>
  3.         <td>${item.id}</td>
  4.         <td>${item.username}</td>
  5.         <td>${item.password}</td>
  6.         <td>${item.information}</td>
  7.         <td>${item.hobby}</td>
  8.     </tr>
  9. </c:forEach>
复制代码

四.Servlet

Servlet 是 Java EE(Java Enterprise Edition)平台的一部分,用于创建动态 Web 应用程序。Servlet 是在服务器端运行的 Java 程序,它通过处理 HTTP 哀求并生成相应来扩展服务器的功能。
Servlet 是实现 javax.servlet.Servlet 接口的类。通常,开发者不直接实现该接口,而是扩展 javax.servlet.http.HttpServlet 类。
在Servlet中常用到其中的 doGet() 和 doPost() 用来处理前台表单的提交,经常是以下的情势:
  1. import com.mysql.cj.jdbc.Driver;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. import java.sql.Connection;
  9. import java.sql.DriverManager;
  10. import java.sql.SQLException;
  11. import java.sql.Statement;
  12. /**
  13. * @Author Luming
  14. * @Date 2024/5/15 13:56
  15. * @Description:
  16. */
  17. @WebServlet("/InsertServlet")
  18. public class InsertServlet extends HttpServlet {
  19.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
  20.         
  21.         String url = "jdbc:mysql://127.0.0.1:3306/WebTest";
  22.         String user = "user1";
  23.         String passwd = "123456";//登录数据库密码
  24.         String username = request.getParameter("username");
  25.         String password = request.getParameter("password");
  26.         String information = request.getParameter("information");
  27.         String[] hobbies = request.getParameterValues("hobby");
  28.         String hobby = String.join(",", hobbies); // 使用逗号作为分隔符
  29.         
  30.         try {
  31.             // 加载JDBC驱动程序
  32.             Class.forName("com.mysql.jdbc.Driver");
  33.             //1、注册驱动
  34.             Driver driver = new com.mysql.jdbc.Driver();
  35.             DriverManager.registerDriver(driver);
  36.             //2.获取连接
  37.             Connection connection = DriverManager.getConnection(url, user, passwd);
  38.             //3、获取数据库操作对象
  39.             Statement statement = connection.createStatement();
  40.             //4.sql语句
  41.             String sql = "insert into user_info (username, password, information, hobby) " +
  42.                     "VALUES ('" + username + "', '" + password + "', '" + information + "', '" + hobby + "')";
  43.             //5.执行sql语句后的结果
  44.             int count = statement.executeUpdate(sql);
  45.             
  46.         } catch (SQLException | ClassNotFoundException e) {
  47.             throw new RuntimeException(e);
  48.         }
  49.         
  50.         request.getRequestDispatcher("SelectServlet").forward(request,response);
  51.     }
  52. }
复制代码
  1. import Pojo.User;
  2. import com.mysql.cj.jdbc.Driver;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.annotation.WebServlet;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import java.io.IOException;
  9. import java.sql.*;
  10. import java.util.ArrayList;
  11. import java.util.List;
  12. /**
  13. * @Author Luming
  14. * @Date 2024/5/15 20:01
  15. * @Description:
  16. */
  17. @WebServlet("/SelectServlet")
  18. public class SelectServlet extends HttpServlet {
  19.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
  20.         
  21.         String url = "jdbc:mysql://127.0.0.1:3306/WebTest";
  22.         String user = "user1";
  23.         String passwd = "123456";//登录数据库密码
  24.         
  25.         try {
  26.             // 加载JDBC驱动程序
  27.             Class.forName("com.mysql.jdbc.Driver");
  28.             //1、注册驱动
  29.             Driver driver = new com.mysql.jdbc.Driver();
  30.             DriverManager.registerDriver(driver);
  31.             //2.获取连接
  32.             Connection connection = DriverManager.getConnection(url, user, passwd);
  33.             //3、获取数据库操作对象
  34.             Statement statement = connection.createStatement();
  35.             //4.sql语句
  36.             String sql = "select * from user_info";
  37.             //5.执行sql语句后的结果
  38.             ResultSet resultSet = statement.executeQuery(sql);
  39.             //6.封装
  40.             List<User> userList = new ArrayList<>();
  41.             while (resultSet.next()) {
  42.                 User userTemp = new User();
  43.                 userTemp.setId(resultSet.getInt("id"));
  44.                 userTemp.setUsername(resultSet.getString("username"));
  45.                 userTemp.setPassword(resultSet.getString("password"));
  46.                 userTemp.setInformation(resultSet.getString("information"));
  47.                 userTemp.setHobby(resultSet.getString("hobby"));
  48.                 userList.add(userTemp);
  49.             }
  50.             // 将 userList 存储到 request 中,方便在 JSP 中使用
  51.             request.setAttribute("userList", userList);
  52.         } catch (SQLException e) {
  53.             throw new RuntimeException(e);
  54.         } catch (ClassNotFoundException e) {
  55.             throw new RuntimeException(e);
  56.         }
  57.         request.getRequestDispatcher("Table.jsp").forward(request,response);
  58.     }
  59. }
复制代码
▐ Servlet的生命周期

主要并包罗以下主要阶段:加载和实例化、初始化、哀求处理、烧毁。
1.加载和实例化


  • Servlet 容器在启动时或第一次接收到哀求时加载 Servlet 类,并创建 Servlet 实例。
  • 这个过程只发生一次,除非 Servlet 被重新加载。
2.初始化


  • 容器调用 Servlet 的 init 方法来进行初始化。
  • init 方法接收一个 ServletConfig 对象作为参数,包罗 Servlet 的配置信息。
  • 初始化过程用于执行任何一次性设置,如资源分配或配置参数读取。
    1. public class MyServlet extends HttpServlet {
    2.     public void init(ServletConfig config) throws ServletException {
    3.         super.init(config);
    4.         // 执行初始化任务
    5.     }
    6. }
    复制代码
3.处理哀求


  • 每次客户端哀求到达时,容器会为该哀求调用 Servlet 的 service 方法。
  • 对于 HttpServlet,service 方法根据哀求类型(如 GET、POST 等)调用对应的 doGet、doPost 等方法。
    1. public class MyServlet extends HttpServlet {
    2.     protected void doGet(HttpServletRequest request, HttpServletResponse response)
    3.             throws ServletException, IOException {
    4.         // 处理 GET 请求
    5.     }
    6.     protected void doPost(HttpServletRequest request, HttpServletResponse response)
    7.             throws ServletException, IOException {
    8.         // 处理 POST 请求
    9.     }
    10. }
    复制代码
4.烧毁


  • 当 Servlet 容器决定卸载 Servlet(通常是在容器关闭或应用程序制止时),它会调用 Servlet 的 destroy 方法。
  • destroy 方法用于清算资源,比方关闭数据库连接、释放内存等。
  • 这个过程也只发生一次。
    1. public class MyServlet extends HttpServlet {
    2.     public void destroy() {
    3.         // 清理资源
    4.     }
    5. }
    复制代码

五.JavaBean&JDBC

JavaBean 是一种符合特定约定的 Java 类,主要用于封装数据。
JavaBean 的特性

  • 无参数构造方法:JavaBean 必须有一个无参数的构造方法。这个构造方法可以是显式声明的,也可以是隐式提供的(如果没有声明任何构造方法)。
  • 私有属性:JavaBean 的属性应该是私有的,制止外部直接访问。如许可以通过 getter 和 setter 方法来控制属性的访问和修改。
  • 公共的 getter 和 setter 方法:每个属性都应该有对应的公共的 getter 和 setter 方法。getter 方法用于获取属性值,setter 方法用于设置属性值。
  1. public class PersonBean {
  2.     private String name;
  3.     private int age;
  4.     // 无参数构造方法
  5.     public PersonBean() {
  6.     }
  7.     // Getter 方法
  8.     public String getName() {
  9.         return name;
  10.     }
  11.     // Setter 方法
  12.     public void setName(String name) {
  13.         this.name = name;
  14.     }
  15.     // Getter 方法
  16.     public int getAge() {
  17.         return age;
  18.     }
  19.     // Setter 方法
  20.     public void setAge(int age) {
  21.         this.age = age;
  22.     }
  23. }
复制代码
比方我们可以设置如许的的一个JavaBean来配合上面的Servlet来使用(这里使用了lombok注解是为了节流篇幅,一个一个的手动去写get和set方法也是可以的)
  1. package Pojo;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. /**
  6. * @Author Luming
  7. * @Date 2024/5/15 20:17
  8. * @Description:
  9. */
  10. @Data
  11. @AllArgsConstructor
  12. @NoArgsConstructor
  13. public class User {
  14.     private int id;
  15.     private String username;
  16.     private String password;
  17.     private String information;
  18.     private String hobby;
  19. }
复制代码
JavaBean中的每一项数据都对应着数据库中的每一个字段,如下图数据库中的字段都与上述User中的字段一一对应,方便了我们封装数据。

▐ JDBC

JDBC(Java Database Connectivity)是 Java 提供的一种尺度 API,用于访问关系数据库。JDBC 提供了一组接口和类,使 Java 应用程序可以或许与各种数据库进行交互。通过 JDBC,开发者可以在不依赖特定命据库产物的环境下编写数据库访问代码。
其着实上文的Servlet中就已经包罗了JDBC的全部操作,主要包罗了注册驱动,链接数据库,执行sql语句,拿到返回结果。
JDBC Driver(驱动程序)


  • JDBC 驱动程序是用于连接到数据库的实现。不同的数据库厂商提供不同的 JDBC 驱动程序。
  • 驱动程序通常分为四种类型:Type 1(桥接驱动)、Type 2(当地 API 驱动)、Type 3(网络协议驱动)、Type 4(纯 Java 驱动)。
Connection(连接)


  • Connection 对象表示与数据库的连接。通过 DriverManager 类获取连接。
  • 用于创建 Statement 对象、提交事件、设置自动提交模式等。
Statement(声明)


  • Statement 对象用于执行 SQL 查询和更新操作。常见的子接口有 Statement、PreparedStatement 和 CallableStatement。
  • Statement 用于执行简单的 SQL 语句。
  • PreparedStatement 用于执行参数化的 SQL 语句,预编译的语句,性能更好。
  • CallableStatement 用于执行存储过程。
ResultSet(结果集)


  • ResultSet 对象用于表示从数据库查询中获取的结果集。通过 Statement 或 PreparedStatement 执行查询操作获取。
  • ResultSet 提供方法用于遍历和读取结果集中的数据。
别的使用PreparedStatement可以防备SQL注入
  1. String insertSQL = "INSERT INTO users (username, password, email) VALUES (?, ?, ?)";
  2. Connection conn = DatabaseConnection.getConnection();
  3. PreparedStatement pstmt = conn.prepareStatement(insertSQL);
  4. // 设置参数值
  5. pstmt.setString(1, "user1");
  6. pstmt.setString(2, "password123");
  7. pstmt.setString(3, "user1@example.com");
  8. // 执行插入操作
  9. int ret= pstmt.executeUpdate();
复制代码
  使用 PreparedStatement 的好处
  

  • 预编译和缓存: SQL语句只编译一次,并存储在PreparedStatement对象中。多次执行同一查询时服从更高。
  • 防止SQL注入: 使用PreparedStatement可以防止SQL注入攻击,由于参数化查询会自动转义特殊字符。
   其中常见的PreparedStatement方法:


  • setInt(int parameterIndex, int x)
  • setString(int parameterIndex, String x)
  • setDouble(int parameterIndex, double x)
  • executeUpdate()
  • executeQuery()
  • close()
一样平常JDBC部分的内容,都是写在Servle中,诸如下面如许
  1.         String url = "jdbc:mysql://127.0.0.1:3306/WebTest";
  2.         String user = "user1";
  3.         String passwd = "123456";//登录数据库密码
  4.         String username = request.getParameter("username");
  5.         String password = request.getParameter("password");
  6.         String information = request.getParameter("information");
  7.         String[] hobbies = request.getParameterValues("hobby");
  8.         String hobby = String.join(",", hobbies); // 使用逗号作为分隔符
  9.         
  10.         try {
  11.             // 加载JDBC驱动程序
  12.             Class.forName("com.mysql.jdbc.Driver");
  13.             //1、注册驱动
  14.             Driver driver = new com.mysql.jdbc.Driver();
  15.             DriverManager.registerDriver(driver);
  16.             //2.获取连接
  17.             Connection connection = DriverManager.getConnection(url, user, passwd);
  18.             //3、获取数据库操作对象
  19.             Statement statement = connection.createStatement();
  20.             //4.sql语句
  21.             String sql = "insert into user_info (username, password, information, hobby) " +
  22.                     "VALUES ('" + username + "', '" + password + "', '" + information + "', '" + hobby + "')";
  23.             //5.执行sql语句后的结果
  24.             int count = statement.executeUpdate(sql);
  25.             
  26.         } catch (SQLException | ClassNotFoundException e) {
  27.             throw new RuntimeException(e);
  28.         }
复制代码

六.MySql——CRUD

在 MySQL 中,CRUD 代表了四种基本的数据库操作:

  • Create(创建)
  • Read(读取)
  • Update(更新)
  • Delete(删除)
▐ Create(创建)


  • 创建操作用于向数据库中的表插入新记载。
  • 使用 SQL 中的 INSERT 语句。
示例:假设我们有一个名为 users 的表,包罗 id、name 和 email 字段。
  1. CREATE TABLE users (
  2.     id INT AUTO_INCREMENT PRIMARY KEY,
  3.     name VARCHAR(50),
  4.     email VARCHAR(50)
  5. );
复制代码
  1. INSERT INTO users (name, email) VALUES ('John Doe', 'john.doe@example.com');
  2. INSERT INTO users (name, email) VALUES ('Jane Smith', 'jane.smith@example.com');
复制代码
▐ Read(读取)

读取操作用于从数据库中检索数据。使用 SQL 中的 SELECT 语句。
示例:从 users 表中检索所有记载:
  1. SELECT * FROM users;
复制代码
根据条件检索特定记载:
  1. SELECT * FROM users WHERE name = 'John Doe';
复制代码
▐ Update(更新)

更新操作用于修改数据库中现有的记载。使用 SQL 中的 UPDATE 语句。
示例:将 users 表中 John Doe 的电子邮件地点更新:
  1. UPDATE users SET email = 'john.new@example.com' WHERE name = 'John Doe';
复制代码
▐ Delete(删除)

删除操作用于从数据库中移除记载。使用 SQL 中的 DELETE 语句。
示例:从 users 表中删除 John Doe 的记载:
  1. DELETE FROM users WHERE name = 'John Doe';
复制代码



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





免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

尚未崩坏

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表