javaweb 期末复习

1. JDBC数据库连接的实现逻辑与步骤以及JDBC连接配置(单列模式)


public class JDBCUtil {// 这些换成自己的数据库 private static final String DB_URL = "jdbc:mysql://localhost:3306/你的数据库名称";private static final String USER = "username";private static final String PASS = "password";
​// 创建单例示例 :connectionprivate static Connection connection = null;
​// 私有构造函数防止类被实例化 就是new 一个JDBCUtil 的对象private JDBCUtil() {}
​// 提供一个静态方法 可以通过这个方法获取一个connectionpublic static Connection getConnection() throws SQLException {if (connection == null) {synchronized (JDBCUtil.class) {  //这里的synchronized同步块 就是保证同一时间只有一个线程进去获得一个连接if (connection == null) {try {
​Class.forName("com.mysql.cj.jdbc.Driver");
​
​connection = DriverManager.getConnection(DB_URL, USER, PASS);} catch (ClassNotFoundException e) {e.printStackTrace();throw new SQLException("错啦 加载不了驱动");  //抛出一个错 提示一哈 包严谨的  }}}}return connection;}
​// 关闭connection 的方法public static void closeConnection() {if (connection != null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();} finally {connection = null;Serializable}}}
}

2.JavaBean规范以及创建

2.1 ------ JavaBean 规范

  • 公共无参构造方法:JavaBean 必须有一个公共的无参数构造方法。

  • 私有属性:所有属性(字段)应该是私有的,以保持封装性。

  • 公有的 getter 和 setter 方法:每个属性都有对应的公共访问器(getter)和设置器(setter)方法,以便外界访问和修改。

  • 可序列化:通常,JavaBean 实现了 java.io.Serializable 接口,允许它们被序列化(这不是强制要求,但在许多情况下是推荐的)。

2.2 ----- 直接上代码

  • Serializable 这个序列化可以不加 期末不用

public class Person   {// 私有属性private String name;private int age;// 公共的无参构造方法public Person() {}// 公共的有参构造方法(非必须,但常见)public Person(String name, int age) {this.name = name;this.age = age;}// Getter 方法public String getName() {return name;}// Setter 方法public void setName(String name) {this.name = name;}// Getter 方法public int getAge() {return age;}// Setter 方法public void setAge(int age) {this.age = age;}// 可以选择性地覆盖 toString 方法@Overridepublic String toString() {return "Person{name='" + name + "', age=" + age + "}";}
}

3.根据Model层原理,完成对User表的增删改查方法实现-UserService(userDao)

1718531129654

  • 下面就是 UserDao 的代码

public class UserDao {//根据用户名和密码查询数据public boolean queryByUsernameAndPassword(String username,String password){//1、获取数据库连接Connection conn = null;//2、查询数据库String sql = "select * from bookdb.usertb where username=? and password=?";PreparedStatement ps = null;ResultSet rs = null;try {conn = JDBCConnector.getInstance().getOneCon();ps = conn.prepareStatement(sql);ps.setString(1,username);ps.setString(2,password);rs = ps.executeQuery();if (rs.next()){return true;}} catch (SQLException e) {e.printStackTrace();}finally {DBHandle.closeDB(conn,ps,rs);}return false;}/*** 根据 username 进行更新操作* @param newUserName 新用户名* @param newPassword 新密码* @param oldUserName 待修改的用户* @return*/public boolean queryById(String newUserName,String newPassword ,String oldUserName){//1、获取数据库连接Connection conn = null;PreparedStatement  ps = null;ResultSet rs = null;try {//2、获取单例conn = JDBCConnector.getInstance().getOneCon();//3、sql语句String sql = "update bookdb.usertb set username=? ,password=? where username=?";  //写之前最好去数据库试一试不容易错ps = conn.prepareStatement(sql);ps.setString(1,newUserName);ps.setString(2,newPassword);ps.setString(3,oldUserName);int res = ps.executeUpdate();if (res > 0){return true;  //有记录则表明被更新了}} catch (SQLException e) {e.printStackTrace();}finally {//4、老样子 关闭练级DBHandle.closeDB(conn,ps,rs);}return false;}/*** 新增 user* @param user 待插的对象* @return  true 新增成功 否则反之*/public boolean insertUser(User user){//1、获取数据库连接Connection conn = null;PreparedStatement  ps = null;ResultSet rs = null;try {//2、获取单例conn = JDBCConnector.getInstance().getOneCon();//3、sql语句String sql = "insert into bookdb.usertb (username, password) values (?,?)";  //写之前最好去数据库试一试不容易错ps = conn.prepareStatement(sql);ps.setString(1,user.getUsername());  //这里获取传过来的用户名和密码ps.setString(2,user.getPassword());int res = ps.executeUpdate();if (res > 0){return true;}//是不是修改几乎一模一样} catch (SQLException e) {e.printStackTrace();}finally {//4、老样子 关闭练级DBHandle.closeDB(conn,ps,rs);}return false;  //最后别忘了返回错误的情况哦}/*** 删除操作* @param username 待删除的用户名* @return*/public boolean deleteUser(String username){//1、获取数据库连接Connection conn = null;PreparedStatement  ps = null;ResultSet rs = null;try {//2、获取单例conn = JDBCConnector.getInstance().getOneCon();//3、sql语句String sql = "delete from usertb where username=?;";  //写之前最好去数据库试一试不容易错ps = conn.prepareStatement(sql);ps.setString(1,username);  //这里获取传过来的用户名和密码int res = ps.executeUpdate();if (res > 0){return true;}//是不是和上面几乎一模一样} catch (SQLException e) {e.printStackTrace();}finally {//4、老样子 关闭练级DBHandle.closeDB(conn,ps,rs);}return false;  //最后别忘了返回错误的情况哦}}
  • 差不多就是上面的增删改查 可以根据需要自行修改

4.Json数据格式

{"username":"wdc","password":"123"
}

5 . JSP知识应用以及文件上传功能实现

1718539323154

  • 然后在contorller 层创建一个UploadController

package com.controller;import com.util.UploadUtil;import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;@WebServlet("/uploadServlet")
@MultipartConfig(maxFileSize = 10 * 1024 * 1024)
public class UploadController extends HttpServlet {private static final long serialVersionUID = 1L;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//设置响应的内容类型resp.setContentType("text/html;charset=utf-8");//取得输出对象PrintWriter out = resp.getWriter();req.setCharacterEncoding("utf-8");//获得part 对象Part part = req.getPart("resPath");//指定上传的文件保存到服务器的 uploadFiles 目录中File uploadFileDir = new File(getServletContext().getRealPath("/uploadFiles"));if (!uploadFileDir.exists()) {uploadFileDir.mkdirs();}//获取原始文件名String oldName = UploadUtil.getFileName(part);out.println("上传的原始文件名:" + oldName + "<br>");out.println("上传文件的大小 :" + part.getSize() + "<br>");if (oldName != null) {//上传到服务器的 uploadFiles 目录中part.write(uploadFileDir + File.separator + oldName);}out.println("上传文件到:"+uploadFileDir + File.separator + oldName + "<br>");}
}
  • 然后运行项目 注意jsp 的访问路径

- 选择你要上传的文件 点击提交后 就上传到了

image-20240616200454726

这里

- 欧克 完美 下一个

- 多文件上传也要掌握,书上208  一样的实现。**干**就完了

# 6.前后端分离技术,根据前端代码StuClient的接口请求,补充完成服务器接口:查看前端网络请求接口,配置正确的映射地址;实现用户注册接口编写,实现真正的数据入库操作-servlet编写。

- 这部分只需要根据前端的在controller 层写接口   

- 就直接给代码了  

- BookByPageController 接口

package com.controller;import com.dao.BookDao;
import com.entity.Book;
import org.json.JSONStringer;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.util.List;@WebServlet("/books/showBooksByPage")
public class BookByPageController extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {BookDao bookDao = new BookDao();int currentPage = Integer.parseInt(req.getParameter("currentPage"));int pageSize = Integer.parseInt(req.getParameter("pageSize"));List<Book> books = bookDao.queryBookByPage(currentPage, pageSize);resp.getWriter().println(JSONStringer.valueToString(books));}
}
  • UserLoginController 接口

package com.controller;import com.dao.BookDao;
import com.dao.UserDao;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;@WebServlet("/user/login")
public class UserLoginController extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = req.getParameter("username");String password = req.getParameter("password");UserDao dao = new UserDao();if (dao.queryByUsernameAndPassword(username, password)) {resp.getWriter().println(true);} else resp.getWriter().println(false);}
}

  • ok 了家人们,可莫 干就完了

    img

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

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

相关文章

linux中批量给文件改名

rename 需要批量将文件名前的UC-10_取消掉&#xff0c;以数字来命名文件 rename s/UC-10_// *.jpg 修改成功 要是修改为其他名字需要在单引号的第二个/后加字符即可 例如要改为li

基于 SSM 框架的二手书交易系统

基于 SSM 框架的二手书交易系统 一、项目介绍二、项目技术栈三、项目运行四、项目演示总结 大家好&#xff0c;这里是程序猿代码之路。在当今环保意识日益增强和资源节约型社会建设的背景下&#xff0c;二手交易作为一种节省资源和降低成本的消费方式越来越受到人们的欢迎。特别…

基于Java和SSM框架的多人命题系统

你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果你对多人命题系统感兴趣或者有相关开发需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Java SSM框架 工具&#xff1a;Eclipse、MySQL Workbench、…

C++全栈聊天项目(22) 气泡聊天对话框

气泡聊天框设计 我们期待实现如下绿色的气泡对话框 对于我们自己发出的信息&#xff0c;我们可以实现这样一个网格布局管理 NameLabel用来显示用户的名字&#xff0c;Bubble用来显示聊天信息&#xff0c;Spacer是个弹簧&#xff0c;保证将NameLabel,IconLabel&#xff0c;Bubb…

Java小结

# Java的特点 Java是一门面向对象的编程语言。面向对象和面向过程的区别参考下一个问题。 Java具有平台独立性和移植性。 Java有一句口号&#xff1a;Write once, run anywhere&#xff0c;一次编写、到处运行。这也是Java的魅力所在。而实现这种特性的正是Java虚拟机JVM。已…

Hvv--知攻善防应急响应靶机--Linux1

HW–应急响应靶机–Linux1 所有靶机均来自 知攻善防实验室 靶机整理&#xff1a; 夸克网盘&#xff1a;https://pan.quark.cn/s/4b6dffd0c51a#/list/share百度云盘&#xff1a;https://pan.baidu.com/s/1NnrS5asrS1Pw6LUbexewuA?pwdtxmy 官方WP&#xff1a;https://mp.weixin.…

Linux,shell ,gun基本概念和关系

Linux 系统简单架构图 1、命令行界面&#xff08;CLI&#xff09;和图形用户界面 (GUI) 1、图形界面就是我们常用的windows系统这种&#xff0c;打开文件&#xff0c;双击一下。想选择哪个文件&#xff0c;就鼠标移动到哪里选择就行。 2、命令行界面就是下面这种只有黑乎乎的…

代码随想录二刷DAY1~3

Day1 704 二分查找&#xff0c;简单 我也有自己写题解的能力了&#xff0c;而且思维很清晰&#xff1a; 找什么就在if里写什么。 class Solution {public: int search(vector<int>& nums, int target) { int l0,rnums.size()-1; while(l<r){ …

算法体系-21 第二十一 暴力递归到动态规划(三)

一 最长回文子串 1.1 描述 给定一个字符串str&#xff0c;返回这个字符串的最长回文子序列长度 比如 &#xff1a; str “a12b3c43def2ghi1kpm” 最长回文子序列是“1234321”或者“123c321”&#xff0c;返回长度7 1.2 分析 1.2.1 先将原传逆序&#xff0c;求原串和反转后的…

[C++] vector list 等容器的迭代器失效问题

标题&#xff1a;[C] 容器的迭代器失效问题 水墨不写bug 正文开始&#xff1a; 什么是迭代器&#xff1f; 迭代器是STL提供的六大组件之一&#xff0c;它允许我们访问容器&#xff08;如vector、list、set等&#xff09;中的元素&#xff0c;同时提供一个遍历容器的方法。然而…

2024上半年软考---江苏考区最先公布成绩

经历了考试之后&#xff0c;最期待的就是考试成绩的公布了&#xff0c;最好的成绩是45、45、45.只要过了分数线就满足了。下面我们来看看各大考区的分数的公布时间。 提前说下江苏考区的时间比较早&#xff0c;我就是江苏考区的&#xff0c;希望本次可以顺利通过考试。 2024年…

零基础到高手蜕变:一步到位Jupyter Notebook安装全攻略

前言 对于数据分析、机器学习、科学研究等领域的工作者来说&#xff0c;Jupyter Notebook 已经成为了一种不可或缺的工具。它的交互式编程界面&#xff0c;使得数据分析过程更加直观和高效。但并非所有人都熟悉如何安装和配置Jupyter Notebook&#xff0c;特别是在不同的操作系…

在typora中利用正则表达式,批量处理图片

一&#xff0c;png格式 在 Typora 中批量将 HTML 图片标签转换为简化的 Markdown 图片链接&#xff0c;且忽略 alt 和 style 属性&#xff0c;可以按照以下步骤操作&#xff1a; 打开 Typora 并加载你的文档。按下 Ctrl H&#xff08;在 Windows/Linux 上&#xff09;或 Cmd…

Unity C#调用Android,IOS震动功能

最近在Unity上需要很原生移动端进行交互&#xff0c; 原理&#xff1a;新建一个android项目&#xff0c;把生成的app module给干掉&#xff0c;然后留下一个vibrationPlugin module&#xff0c;在这个module下写android震动代码&#xff0c;将这个android工程构建出来的 aar移…

2024数据库期末综合解析(部分题)

目录 第4关&#xff1a;数据记录修改 任务描述 补充 答案&#xff1a; 第6关&#xff1a;数据查询二 任务描述 补充 答案&#xff1a; 第4关&#xff1a;数据记录修改 任务描述 湖南人口hnpeople数据表如下所示 各字段含义如下 cs&#xff08;城市)、qx(区县)、rk(人口)、man(男…

115.网络游戏逆向分析与漏洞攻防-邮件系统数据分析-调试优化结构体类型数据的创建

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 现在的代码都是依据数据包来写的&#xff0c;如果看不懂代码&#xff0c;就说明没看懂数据包…

理解DDD设计

DDD的理解 领域驱动设计&#xff08;Domain-Driven Design&#xff0c;DDD&#xff09;是一种软件开发方法论&#xff0c;强调将业务领域作为软件设计的核心&#xff0c;以便更好地满足业务需求。DDD认为&#xff0c;软件开发的核心是理解业务&#xff0c;而不是实现技术。在D…

​晶体管高频等效电路

目录 混合Π等效电路 Y参数等效电路 混合Π与Y参数等效电路的转换 混合Π等效电路 共射三极管的等效电路。 Y参数等效电路 混合Π与Y参数等效电路的转换

异或运算的原理以及应用

异或&#xff08;XOR&#xff09;是计算机科学和数字电路中常用的运算之一。异或运算符通常用符号“⊕”或“^”表示&#xff0c;它有着简单而独特的性质&#xff0c;使其在数据加密、错误检测与纠正等多个领域得到了广泛的应用。在网络上我们传输的每一比特数据都经过了异或运…

unity 简易异步socket

1.unity 同步socket 改异步 using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Net.Sockets; using UnityEngine.UI; using System.Threading; using System;public class Echo : MonoBehaviour {//定义套接字Socket socket;//UG…