javaweb--实验十 --期末复盘

实验十 JDBC连接MySQL

本次实验没有代码补全,以下都是完整过程,详细关注连接过程的问题

一、实验目的:

1、掌握JDBC连接数据库的一般操作。
2、理解JavaBean的基本作用。
3、理解分层设计的思想。

二、 实验内容:

实现学生信息的增删改查操作。
在这里插入图片描述
注:通过以下提供的实验步骤,最终得到的项目结构如下所示:

【实验步骤】

(1)将jar包“mysql-connector-java-5.0.8-bin.jar”拷贝到tomcat的lib文件夹中。

个人使用的是mysql8.0版本,若有相同,文末自提驱动

(2)在MySQL中,创建名为“my_db”的数据库,并在数据库中创建student表。

create database my_db;use my_db;create table student
(sno char(5) primary key,
sname varchar(50),
sage int);insert into student 
values('99001','张三',20),('99002','李四',21);

(3)新建一个名为”web10”的项目(Web应用程序)。在项目中新建“Java包”,命名为“model”。
(4)在model包中新建“Java类”,命名为“Student”。Student.java为封装student表的JavaBean。

/*** 与学生表对应的实体类(封装数据的JavaBean),目的是方便数据传输以及代码维护。* JavaBean的要求: * 1、是一个Java 类* 2、必须存在无参数构造方法 * 3、所有成员变量都是private * 4、私有化的属性必须通过public类型的方法暴露给其它程序, 并且方法的命名也必须遵守一定的命名规范。* 即如果想private成员变量被外界访问,提供public的get和set方法。*/
package model;public class Student {private String sno;private String sname;private int sage;public Student(String sno, String sname, int sage) {this.sno = sno;this.sname = sname;this.sage = sage;}public Student() {}public String getSno() {return sno;}public void setSno(String sno) {this.sno = sno;}public String getSname() {return sname;}public void setSname(String sname) {this.sname = sname;}public int getSage() {return sage;}public void setSage(int sage) {this.sage = sage;}}

(5)在项目中新建“Java包”,命名为“dal”(Data Access Layer)。该包中存储的文件主要用于数据库访问。
(6)在dal包中创建“Java类”,命名为“Dbutils”。该文件中定义了访问数据库的通用读写方法。

package dal;
import java.sql.*;
public class Dbutils {protected Connection conn = null;protected PreparedStatement pstmt = null;protected ResultSet rs = null;/*** 获取连接对象* @return 连接对象*/public Connection getConnection() {try {//1、加载驱动类Class.forName("com.mysql.jdbc.Driver");//2、创建连接对象String url = "jdbc:mysql://localhost:3306/my_db?useUnicode=true&characterEncoding=utf-8";String user = "root";String password = "";conn = DriverManager.getConnection(url,user,password);} catch (Exception e) {e.printStackTrace();}return conn;}/*** 关闭资源** @param conn* @param pstmt* @param rs*/public void closeAll(Connection conn, PreparedStatement pstmt, ResultSet rs) {try {if (rs != null) {rs.close();}if (pstmt != null) {pstmt.close();}if (conn != null) {conn.close();}} catch (SQLException e) {e.printStackTrace();}}/*** 增删改操作** @param sql* @param params* @return */public int executeUpdate(String sql, Object[] params) {this.getConnection();int result = 0;try {//3、创建prepareStatement对象pstmt = conn.prepareStatement(sql);//4、为占位符赋值if (null != params) {for (int i = 0; i < params.length; i++) {pstmt.setObject(i + 1, params[i]);}}//5、调用方法:执行sql语句result = pstmt.executeUpdate();} catch (SQLException e) {e.printStackTrace();} finally {this.closeAll(conn, pstmt, null);}return result;}/*** 查询方法** @param sql* @param params* @return*/public ResultSet executeQuery (String sql, Object[] params) {this.getConnection();try {//3、创建prepareStatement对象pstmt = conn.prepareStatement(sql);//4、为占位符赋值if (null != params) {for (int i = 0; i < params.length; i++) {pstmt.setObject(i + 1, params[i]);}}//5、调用方法:执行sql语句rs = pstmt.executeQuery();} catch (SQLException e) {e.printStackTrace();}//后面具体的查询方法还需要用到rs ,所以此处最后不能关闭数据流return rs;}
}

(7)在dal包中创建“Java类”,命名为“StudentDAO”。该文件中定义了对Student表进行增删改查操作的方法。该类中,需使用model包中的Student类。

package dal;import model.Student;
import java.util.List;
import java.util.ArrayList;
import java.sql.*;/*** 对Student表进行增删改查的方法*/
public class StudentDAO {Dbutils dbutils = new Dbutils();//返回所有的学生信息public List<Student> findAllStudents() {String sql = "select sno,sname,sage from student";Object[] params = null;List<Student> list = new ArrayList<>();ResultSet rs = dbutils.executeQuery (sql, params);try {if (null != rs) {while (rs.next()) {Student student = new Student();student.setSno(rs.getString("sno"));student.setSname(rs.getString("sname"));student.setSage(rs.getInt("sage"));list.add(student);}}} catch (SQLException ex) {ex.printStackTrace();} finally {dbutils.closeAll(dbutils.conn, dbutils.pstmt, dbutils.rs);}return list;}//根据学号查找学生信息public Student findBySno(String sno) {Student student = new Student();String sql = "select sno,sname,sage from student where sno=?";Object[] params = {sno};ResultSet rs = dbutils.executeQuery (sql, params);try {if (null != rs) {if (rs.next()) {student.setSno(rs.getString("sno"));student.setSname(rs.getString("sname"));student.setSage(rs.getInt("sage"));}}} catch (SQLException ex) {ex.printStackTrace();} finally {dbutils.closeAll(dbutils.conn, dbutils.pstmt, dbutils.rs);}return student;}//判断学号在student表中是否存在public boolean isSnoExist(String sno) {boolean flag = false;String sql = "select sno,sname,sage from student where sno=?";Object[] params = {sno};ResultSet rs = dbutils.executeQuery (sql, params);try {if (rs != null && rs.next()) {flag = true;}} catch (SQLException ex) {ex.printStackTrace();}return flag;}//插入一条学生记录public boolean insert(Student student) {boolean flag = false;String sql = "insert into student(sno,sname,sage) values(?,?,?)";Object[] params = {student.getSno(), student.getSname(), student.getSage()};return (dbutils.executeUpdate(sql, params) == 1);}//根据学号,更新该生的其他属性public boolean update(Student student) {String sql = "update student set sname=?,sage=? WHERE sno=?";Object[] params = {student.getSname(), student.getSage(), student.getSno()};return dbutils.executeUpdate(sql, params) == 1;}//根据学号删除学生信息public boolean deleteBySno(String sno) {String sql = "delete from student where sno=?";Object[] params = {sno};return dbutils.executeUpdate(sql, params) == 1;}
}

(8)在项目中新建“JSP文件”,命名为“student”。该文件为“学生信息管理”的首页。
在该文件中,使用了model包中的Student类,以及dal包中的StudentDAO类。其中,通过dal.StudentDAO类的findAllStudents()方法,返回了student表中的全部记录。

<%@page import="dal.StudentDAO"%>
<%@page import="java.util.List"%>
<%@page import="model.Student"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>学生信息管理</title></head><body><div align="center"><h1>学生信息管理</h1><%StudentDAO studentDAO = new StudentDAO();//获取所有学生信息List<Student> students = studentDAO.findAllStudents();%><table border='1' width="80%" ><tr><th width="20%">编号</th><th width="20%">学生学号</th><th width="20%">姓名</th><th width="20%">年龄</th><th width="20%">操作</th></tr><%int rowNum = 0;//行编号for (int i = 0; i < students.size(); i++) {rowNum++;String sno = students.get(i).getSno();String sname = students.get(i).getSname();int sage = students.get(i).getSage();String deleteLink = "delete?sno=" + sno;String editLink = "editPage.jsp?sno=" + sno;%><tr><td><%= rowNum%></td><td><%= sno%></td><td><%= sname%></td><td><%= sage%></td><!--点击“删除”链接,使用javascript脚本弹出确认对话框,单击“确定”后,才执行删除操作--><td><a href="<%=deleteLink%>" onClick="return confirm('您确定要删除吗?');">删除</a><a href='<%=editLink%>'>修改</a></td>               </tr><%}%></table><br/><form action="add" method = "get">学号 <input name="sno">姓名 <input name="sname">年龄 <input name="sage"><input type="submit" value="增加"></br></form></div></body>
</html>

(9)在项目中新建“JSP文件”,命名为“editPage”。该文件为编辑文件的页面。
该文件中,同样使用了model包的Student类以及dal包的StudentDAO类。其中,通过调用dal.studentDAO类的findBySno(Sring sno)方法,返回被选中的学生的基本信息。

<%@page import="model.Student"%>
<%@page import="dal.StudentDAO"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>JSP Page</title></head><body><h1>编辑学生信息</h1><%            StudentDAO studentDAO = new StudentDAO();String sno = request.getParameter("sno");Student student = studentDAO.findBySno(sno);String sname = student.getSname();int sage = student.getSage();          %><form action="edit" method = "get"><!--通过readonly="true",设置学号文本框不能修改-->学号 <input name="sno" readonly="true" value=<%=sno%>><br/>姓名 <input name="sname" value=<%=sname%>><br/>年龄 <input name="sage" value=<%=sage%>><br/><br/><input type="submit" value="提交"></br></form></body>
</html>

(10)在项目中新建“Java包”,命名为“servlet”。该包中存储项目的servlet文件。
(11)在“servlet”包中新建“Java类”,命名为“AddServlet”,实现学生记录的添加。
如果用户输入的学号在学生表存在,则提示“学号重复,添加失败”;否则将学生记录插入到学生表中,并提示“添加成功”。最后,跳转到首页“student.jsp”中。
该文件中调用了dal.StudentDAO类的insert(Student student)方法,实现学生记录的添加。

package servlet;import dal.StudentDAO;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import model.Student;@WebServlet("/add")
public class AddServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//设置请求对象的编码方案为utf-8req.setCharacterEncoding("utf-8");//设置响应对象以及浏览器的字符方案为utf-8resp.setContentType("text/html;charset=utf-8");StudentDAO studentDAO = new StudentDAO();//获取用户输入的学号,判断学号在学生表中是否存在String sno = req.getParameter("sno");if (studentDAO.isSnoExist(sno)) {resp.getWriter().println("<script>alert('学号重复,添加失败');window.location.href='student.jsp'</script>");} else {//获取用户输入的姓名、年龄String sname = req.getParameter("sname");String sageStr = req.getParameter("sage");Integer sage = Integer.parseInt(sageStr);Student student = new Student(sno, sname, sage);studentDAO.insert(student);//使用javascript脚本输出提示对话框,并跳转到student.jsp页面中resp.getWriter().println("<script>alert('添加成功');window.location.href='student.jsp'</script>");}//不能使用resp.sendRedirect("student.jsp");否则,javascript对话框无法显示。}
}

(12)在“serlvet”包中新建“Java类”,命名为“DeleteServlet”。
该文件通过调用dal.StudentDAO类的deleteBySno(String sno),实现根据学号删除学生记录的操作。

package servlet;import dal.StudentDAO;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;@WebServlet("/delete")
public class DeleteServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {StudentDAO studentDAO = new StudentDAO();String sno = req.getParameter("sno");//根据用户输入的学号,删除学生记录studentDAO.deleteBySno(sno);//重定向到首页student.jspresp.sendRedirect("student.jsp");}
}

(13)在“serlvet”包中新建“Java类”,命名为“EditServlet”。
该文件通过调用dal.StudentDAO类的update(Student student),实现了根据学号修改学生记录的操作。

package servlet;import dal.StudentDAO;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import model.Student;@WebServlet("/edit")
public class EditServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");StudentDAO studentDAO = new StudentDAO();String sno = req.getParameter("sno");String sname = req.getParameter("sname");String sageStr = req.getParameter("sage");int sage = Integer.parseInt(sageStr);Student student = new Student(sno, sname, sage);if (studentDAO.update(student)) {resp.getWriter().println("<script>alert('修改成功');window.location.href='student.jsp'</script>");} else {resp.getWriter().println("<script>alert('程序发生了未知的错误,修改失败');window.location.href='student.jsp'</script>");}}
}

三、先看实验效果

请添加图片描述

四、具体连接时的错误(只提供mysql8.0的问题–>个人使用的是MySQL8.0)

1、先提供mysql-connector-java-8.0.11 jar包

链接:https://pan.baidu.com/s/1I_iES9J2EmjRfYjr3ujlOA?pwd=2vyg
提取码:2vyg

2、将下载好的jar包放在tomcat的lib文件夹中

3、遇到的问题:

1、数据库连接问题

主要原因是 :在Dbutils类中的mysql密码配置中没有正确填写你自己的所对应的数据库连接密码。

解决方法:正确填写密码

在这里插入图片描述
在这里插入图片描述

修改后的代码
package dal;import java.sql.*;/*** @Auther zg* @Date 2023/12/26* @Version 1.0*/
public class Dbutils {protected Connection conn = null;protected PreparedStatement pstmt = null;protected ResultSet rs = null;/*** 获取连接对象* @return 连接对象*/public Connection getConnection() {try {//1、加载驱动类Class.forName("com.mysql.jdbc.Driver");//2、创建连接对象String url = "jdbc:mysql://localhost:3306/my_db_web10?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai";String user = "root";String password = "root";  // 修改处conn = DriverManager.getConnection(url,user,password);} catch (Exception e) {e.printStackTrace();}return conn;}/*** 关闭资源** @param conn* @param pstmt* @param rs*/public void closeAll(Connection conn, PreparedStatement pstmt, ResultSet rs) {try {if (rs != null) {rs.close();}if (pstmt != null) {pstmt.close();}if (conn != null) {conn.close();}} catch (SQLException e) {e.printStackTrace();}}/*** 增删改操作** @param sql* @param params* @return*/public int executeUpdate(String sql, Object[] params) {this.getConnection();int result = 0;try {//3、创建prepareStatement对象pstmt = conn.prepareStatement(sql);//4、为占位符赋值if (null != params) {for (int i = 0; i < params.length; i++) {pstmt.setObject(i + 1, params[i]);}}//5、调用方法:执行sql语句result = pstmt.executeUpdate();} catch (SQLException e) {e.printStackTrace();} finally {this.closeAll(conn, pstmt, null);}return result;}/*** 查询方法** @param sql* @param params* @return*/public ResultSet executeQuery (String sql, Object[] params) {this.getConnection();try {//3、创建prepareStatement对象pstmt = conn.prepareStatement(sql);//4、为占位符赋值if (null != params) {for (int i = 0; i < params.length; i++) {pstmt.setObject(i + 1, params[i]);}}//5、调用方法:执行sql语句rs = pstmt.executeQuery();} catch (SQLException e) {e.printStackTrace();}//后面具体的查询方法还需要用到rs ,所以此处最后不能关闭数据流return rs;}
}
2、mysql8.0在创建连接对象的时候,需要配置时区

错误原因: 主要是没有在url中配置时区

解决方法:添加时区配置

在这里插入图片描述
在这里插入图片描述

修改好的代码
package dal;import java.sql.*;/*** @Auther zg* @Date 2023/12/26* @Version 1.0*/
public class Dbutils {protected Connection conn = null;protected PreparedStatement pstmt = null;protected ResultSet rs = null;/*** 获取连接对象* @return 连接对象*/public Connection getConnection() {try {//1、加载驱动类Class.forName("com.mysql.jdbc.Driver");//2、创建连接对象String url = "jdbc:mysql://localhost:3306/my_db_web10?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai"; // 修改处String user = "root";String password = "root";conn = DriverManager.getConnection(url,user,password);} catch (Exception e) {e.printStackTrace();}return conn;}/*** 关闭资源** @param conn* @param pstmt* @param rs*/public void closeAll(Connection conn, PreparedStatement pstmt, ResultSet rs) {try {if (rs != null) {rs.close();}if (pstmt != null) {pstmt.close();}if (conn != null) {conn.close();}} catch (SQLException e) {e.printStackTrace();}}/*** 增删改操作** @param sql* @param params* @return*/public int executeUpdate(String sql, Object[] params) {this.getConnection();int result = 0;try {//3、创建prepareStatement对象pstmt = conn.prepareStatement(sql);//4、为占位符赋值if (null != params) {for (int i = 0; i < params.length; i++) {pstmt.setObject(i + 1, params[i]);}}//5、调用方法:执行sql语句result = pstmt.executeUpdate();} catch (SQLException e) {e.printStackTrace();} finally {this.closeAll(conn, pstmt, null);}return result;}/*** 查询方法** @param sql* @param params* @return*/public ResultSet executeQuery (String sql, Object[] params) {this.getConnection();try {//3、创建prepareStatement对象pstmt = conn.prepareStatement(sql);//4、为占位符赋值if (null != params) {for (int i = 0; i < params.length; i++) {pstmt.setObject(i + 1, params[i]);}}//5、调用方法:执行sql语句rs = pstmt.executeQuery();} catch (SQLException e) {e.printStackTrace();}//后面具体的查询方法还需要用到rs ,所以此处最后不能关闭数据流return rs;}
}

4、总结

以上就是这个实验的我所遇到的连接错误,两个错误都出现在Dbutils,最终的修改的代码就是👆的,若还有其他问题请留言。

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

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

相关文章

PostgreSQL | FunctionProcedure | 函数与存储过程的区别

文章目录 PostgreSQL | Function&Procedure | 函数与存储过程的区别1. 简述书面说法大白话讲 2. 函数&#xff08;Function&#xff09;2.1 定义2.2 用途2.3 执行2.4 事务处理2.5 说点例子1. 当参数都是IN类时2. 参数中出现OUT、INOUT参数时 3. 存储过程&#xff08;Proced…

一图梳理多模态领域发展简史

本文采用关系图的方式整理了&#xff1a;CLiP、ViLT、FLiP、ALBEF、CoCa、BLiP、VLMo、BEiT 和BEiT v3等近几年来经典的多模态大模型&#xff0c;以及这些工作的相互依托关系。灵感来自&#xff1a;跟李沐读论文系列——多模态串讲 1 模型关系图&#xff1a; ’ 2 各模型的架…

OpenAPI,已支持表单数据格式校验

OpenAPI 路径 开放平台 功能简介 「OpenAPI」- 支持表单数据格式校验。 通过「OpenAPI-新增表单数据」接口&#xff0c;新增数据时&#xff0c;若数据格式不匹配&#xff0c;会导致无法新增。 例如&#xff0c;数字不能新增到日期格式的表单字段。 请参考数据格式传参&a…

跨境电商测评攻略及其工具海外云手机的介绍

近些年随着跨境电商的火热&#xff0c;各商家纷纷想尽办法在激烈的竞争中取得一席之地&#xff0c;产品测评就是其中一个重要手段。本文将详细阐述跨境电商的测评攻略以及介绍一个测评的好工具海外云手机。 不管是速卖通&#xff0c;还是亚马逊、ebay&#xff0c;做测评都是非常…

软件测试的人是专门为难开发人员的吗?不不不我是来和开发抬杠的

我觉得就对对对&#xff0c;就不应该有测试这个岗位。 开发完&#xff0c;直接上线。 你看&#xff1a; 1.省了测试人员的薪酬&#xff0c;岗位。 2.省了测试时间&#xff0c;快速交付。快速上线&#xff0c;抢占市场。 3.让用户当免费的测试劳动力。有问题让客户提BUG就好…

Python (十六) pandas(四)

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

<script setup> 的作用

一、使用<script setup> 之后&#xff0c;就不需要手动写以下代码&#xff0c;只要写逻辑代码 未加setup&#xff0c;vite 工程要加上下面代码 *export default{ * setup(){ * //只要写逻辑代码 * return{***} * } * } 加了setup &#xff0c;export default 、…

Java小案例-Feign的超时时间如何设置

前言 Feign的超时时间如何设置&#xff1f; Feign的超时时间设置方式并不固定&#xff0c;它取决于Feign在项目中是如何使用的&#xff0c;不同的使用方式&#xff0c;超时时间设置方式也不大相同&#xff0c;甚至还可能有坑。 由于文章会涉及到Feign的底层知识&#xff0c;…

【easy-ES使用】1.基础操作:增删改查、批量操作、分词查询、聚合处理。

easy-es、elasticsearch、分词器 与springboot 结合的代码我这里就不放了&#xff0c;我这里直接是使用代码。 基础准备&#xff1a; 创建实体类&#xff1a; Data // 索引名 IndexName("test_jc") public class TestJcES {// id注解IndexId(type IdType.CUSTOMI…

SpringBoot整合JWT+Spring Security+Redis实现登录拦截(一)登录认证

一、JWT简介 JWT 全称 JSON Web Token&#xff0c;JWT 主要用于用户登录鉴权&#xff0c;当用户登录之后&#xff0c;返回给前端一个Token&#xff0c;之后用户利用Token进行信息交互。 除了JWT认证之外&#xff0c;比较传统的还有Session认证&#xff0c;如何选择可以查看之前…

Spring中常见的BeanFactory后处理器

常见的BeanFacatory后处理器 先给出没有添加任何BeanFactory后处理器的测试代码 public class TestBeanFactoryPostProcessor {public static void main(String[] args) {GenericApplicationContext context new GenericApplicationContext();context.registerBean("co…

JAVA复习三——CH5 Java Collection 、CH6 MultiThread

CH5 Java Collection(集合) 5.1 Java集合框架&#xff08;位于java.util包中&#xff09; 图一 集合框架图 从上面的集合框架图可以看到&#xff0c;Java 集合框架主要包括两种类型的容器&#xff0c;一种是集合&#xff08;Collection&#xff09;&#xff0c;存储一个元素集…

信息犯罪与计算机取证

1.信息安全 信息安全的三种定义p2 ISO的 为数据处理系统建立和采取的技术和管理的安全保护&#xff0c;保护计算机硬件&#xff0c;软件数据不因偶尔或恶意的原因而受到破坏&#xff0c;更改和泄露 欧盟的 在既定的密级条件下&#xff0c;网络与信息系统抵御意外或恶意行为的能…

【C++】const 关键字

想要正确理解const关键字&#xff0c;只需记住一句话&#xff1a; cosnt关键字优先修饰左边&#xff0c;如果左边每东西&#xff0c;就作用于右边。 const int a; 修饰int a 不能改变 const int *a ; int const *a; 修饰int 指针a指向的地址可以改变&#xff0c;但是地址中…

flask文件夹列表改进版--Bug追踪

把当前文件夹下的所有文件夹和文件列出来&#xff0c;允许点击返回上层目录&#xff0c;允许点击文件夹进入下级目录并显示此文件夹内容 允许点击文件进行下载 from flask import Flask, render_template, send_file, request, redirect, url_for import osapp Flask(__name_…

抖店只能做和营业执照对照的产品吗?开店基础教程,新手可收藏!

我是王路飞。 抖店的营业执照有多重要呢&#xff1f;关系到你店铺的类型、类目和产品。 尤其是适合新手做的个体店&#xff0c;不涉及对公账户&#xff0c;货款可以直接提现到你的私人银行卡里&#xff0c;保证金也只有企业店铺的一半。 &#xff08;只需要身份证就能开通的…

深入Apache Commons Config:管理和使用配置文件

第1章&#xff1a;引言 咱们都知道&#xff0c;在软件开发中&#xff0c;管理配置文件是一件既重要又让人头疼的事。想象一下&#xff0c;咱们的应用程序有一堆设置需要调整&#xff0c;比如数据库的连接信息、应用的端口号&#xff0c;或者是一些功能的开关。如果这些信息硬编…

uni-app 命令行创建

1. 首先创建项目&#xff0c;命令如下: npx degit dcloudio/uni-preset-vue#vite-ts uni-app-demo如果出现报错&#xff0c;如下图. 大概率就是没有目录C:\Users\Administrator\AppData\Roaming\npm 解决办法&#xff1a; 创建目录 C:\Users\Administrator\AppData\Roaming\n…

基于nodemailer实现邮件发送、附件发送、多人发送

文章目录 1、QQ邮箱如何设置授权码2、具体代码 1、QQ邮箱如何设置授权码 QQ邮箱SMTP/IMAP服务 1、点击账号与安全 2、安全设置 3、设备管理&#xff0c;可以查看有多少个授权码 2、具体代码 from 这个参数&#xff0c;有两种写法 qq号qq.com"姓名"<qq号qq.co…

UDP Ping程序实现--第5关:客户端向服务器发送消息并接收消息

✨创作不易&#xff0c;还希望各位大佬支持一下 &#x1f44d; 点赞&#xff0c;你的认可是我创作的动力&#xff01; ⭐️ 收藏&#xff0c;你的青睐是我努力的方向&#xff01; ✏️ 评论&#xff0c;你的意见是我进步的财富&#xff01; 任务描述 本关任务&#xff1a;P…