javaweb 期末复习

news2024/12/24 2:31:53

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";
​
    // 创建单例示例 :connection
    private static Connection connection = null;
​
    // 私有构造函数防止类被实例化 就是new 一个JDBCUtil 的对象
    private JDBCUtil() {}
​
    // 提供一个静态方法 可以通过这个方法获取一个connection
    public 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 方法
    @Override
    public 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;
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

    @Override
    protected 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 {
    @Override
    protected 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 {
    @Override
    protected 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.coloradmin.cn/o/1829141.html

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

相关文章

gbase8s数据库的逻辑日志、物理日志和两种特殊情形的学习

(一) 日志的介绍 1. 日志的类别 数据库日志主要是分为记录日志、逻辑日志和物理日志。 记录日志&#xff1a;记录日志包括了数据库的报错日志、连接日志、sql执行等信息&#xff0c;这些日志不存储在dbspace上&#xff0c;而是保存在操作系统的文件内逻辑日志和物理日志&…

什么是git?

前言 Git 是一款免费、开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目。是的&#xff0c;我对git的介绍就一条&#xff0c;想看简介的可以去百度一下&#x1f618;&#x1f618;&#x1f618; 为什么要用git&#xff1f; OK&#xff0c;想象一下…

2-6 基于matlab2018B的语音信号降噪和盲源分离GUI界面

基于matlab2018B的语音信号降噪和盲源分离GUI界面&#xff0c;包括维纳滤波&#xff0c;小波降噪、高通、低通、带通滤波&#xff0c;及提出的滤波方法。每个功能均展示降噪前后声音效果并外放出来。程序已调通&#xff0c;可直接运行。 2-6 语音信号降噪 盲源分离 GUI界面 - 小…

nginx全解

一、Nginx配置文件 1.1 主配置文件 主配置文件位置&#xff1a;nginx.conf tip&#xff1a;安装方式不同&#xff0c;路径不同 #主配置文件格式 ​ main block&#xff1a;主配置段&#xff0c;即全局配置段&#xff0c;对http,mail都有效 ​ #配置Nginx服务器的事件模块相…

Android开发系列:高性能视图组件Surfaceview

一、Surfaceview概述 在Android应用开发领域&#xff0c;面对视频播放、游戏构建及相机实时预览等高性能需求场景&#xff0c;直接操控图像数据并即时展示于屏幕成为必要条件。传统View组件在此类情境下显现局限性&#xff1a; 性能瓶颈&#xff1a;传统View的绘制任务由UI主…

Java17 --- SpringSecurity之OAuth2

一、OAuth2 1.1、使用github以授权码方式 1.1.1、注册应用程序 1.1.2、测试代码 pom依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-oauth2-client</artifactId></dependency> spring…

MySQL基础——SQL语句

目录 1.SQL通用语法 2.SQL分类 3 DDL 3.1数据库操作 3.1.1查询 3.1.2创建 3.1.3删除 3.1.4使用 3.2表操作 3.2.1查询 3.2.2创建 3.2.3数据类型 3.2.4表修改&#xff08;alter打头&#xff09; 3.2.5表删除&#xff08;drop/truncate打头&#xff09; 3.3 DDL总结…

EasyRecovery2024最新免费手机微信聊天记录数据恢复神器!

今天我要给大家种草一款神奇的软件——EasyRecovery&#xff01;&#x1f389;&#x1f389; 你是不是曾经遇到过文件丢失、电脑崩溃、硬盘损坏等让人抓狂的问题&#xff1f;&#x1f62d;&#x1f62d;别担心&#xff0c;EasyRecovery就是你的救星&#xff01; &#x1f31f;&…

UniApp或微信小程序中scroll-view组件使用show-scrollbar在真机Android或IOS中隐藏不了滚动条的解决办法

show-scrollbar 属性 不论是使用 变量 还是直接使用 布尔值或者直接使用 css 都是在 ios、Android 上是都没有效果。。 真机中还是出现滚动条 解决办法 添加下面CSS ::-webkit-scrollbar {display: none;width: 0 !important;height: 0 !important;-webkit-appearance: no…

uniapp实现路由拦截——遇到问题(三)

uniapp路由拦截开发过程中遇到问题 文章目录 uniapp路由拦截开发过程中遇到问题App 无法退出应用监听返回数据结构解决方式模拟原生物理返回键提示不提示&#xff0c;直接退出应用 微信小程序 登录成功返回页面报错效果图不同平台来源页面数据结构解决方式 App 无法退出应用 安…

从0开始理解DevOps

目录 一、DevOps背景 二、DevOps介绍 DevOps 组成 三、Jenkins Jenkins 工作流程 四、云原生与DevOps 相信你一定听过 DevOps 这个词&#xff0c;那它到底是什么呢&#xff1f;为什么越来越多的互联网企业都在追随使用它&#xff1f;它与云原生有什么关系&#xff1f;本文将…

14.带basic认证的registry仓库

带basic认证的registry 安装httpd-tools工具&#xff0c;将账号密码重定向到指定路径下的文件 yum install httpd-tools -y mkdir /opt/registry-var/auth/ -p htpasswd -Bbn quyunlong 123456 >> /opt/registry-var/auth/htpasswd每次追加密码文件htpasswd&#xff…

ROS机器人小车建模仿真与SLAM

文章目录 一、URDF二、创建小车模型1.创建功能包2.导入依赖3.创建urdf,launch文件&#xff1a;4.可视化 三、添加雷达1.xacro文件2.集成和修改launch3.添加摄像头和雷达 三.GAZEBO仿真四、orbslam2kitti1.下载2.安装编译ORB_SLAM23.运行Kitee数据集 一、URDF ​ URDF&#xff…

Science:如何快速完成一篇研究性论文?

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 完成一篇研究性论文&#xff0c;是将长时间积累的研究成果凝聚在几页纸中&#xff0c;对资深科学家而言也是一大挑战。作者们需要在充分论述科学问题和详细展示结果之间找到平…

实现贪吃蛇小游戏【简单版】

1. 贪吃蛇游戏设计与分析 1.1 地图 我们最终的贪吃蛇大纲要是这个样子&#xff0c;那我们的地图如何布置呢&#xff1f; 这里不得不讲⼀下控制台窗口的⼀些知识&#xff0c;如果想在控制台的窗口中指定位置输出信息&#xff0c;我们得知道该位置的坐标&#xff0c;所以首先介…

【YOLOv10轻量级涨点改进:block优化 | 华为诺亚2023极简的神经网络模型 VanillaNet】

本文属于原创独家改进:一种极简的神经网络模型VanillaNet,以极简主义的设计为理念,网络中仅仅包含最简单的卷积计算,去掉了残差和注意力模块 计算量参数量比较,8.4 GFLOPs降低至6.1 GFLOPs YOLOv10n summary: 385 layers, 2709380 parameters, 2709364 gradients, 8.4 GF…

基于C#开发web网页管理系统模板流程-参数传递

点击返回目录-> 基于C#开发web网页管理系统模板流程-总集篇-CSDN博客 前言 当用户长时间未在管理系统界面进行操作&#xff0c;或者用户密码进行了更改&#xff0c;显然用户必须重新登录以验证身份&#xff0c;如何实现这个功能呢&#xff1f; HTTP Cookie&#xff08;也叫 …

【尚庭公寓SpringBoot + Vue 项目实战】房间管理(十二)

【尚庭公寓SpringBoot Vue 项目实战】房间管理&#xff08;十二&#xff09; 文章目录 【尚庭公寓SpringBoot Vue 项目实战】房间管理&#xff08;十二&#xff09;1、业务介绍2、逻辑模型介绍3、接口开发3.1、保存或更新房间信息3.2、根据条件分页查询详细信息3.3、根据id获…

缠论再研究1-顶底分型

由于现在不是全职写程序了&#xff0c;看起来不是那么辛苦&#xff0c;终于有点精力重新研究缠论了。 之前做过几个月期货&#xff0c;发现真是太难了&#xff0c;布鲁克斯的书写的好是好&#xff0c;终归还是太过复杂&#xff0c;一时半会吸收不了&#xff0c;加之我们程序员…

【招联消费金融股份】有限公司2024年5月19日【算法开发岗暑期实习】二面试经验分享

招联消费金融股份有限公司2024年5月18日面试经验分享 面试流程&#xff1a;30分钟 面试流程&#xff1a;30分钟 先自我介绍3分钟然后介绍论文和实习&#xff0c;细细问。问对招联了解多少&#xff1f;对实习地点怎么样&#xff1f;反问&#xff0c;正常聊天。 创作不易&#x…