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";
​
    // 创建单例示例 :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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

辛弃疾,笔墨剑影的一生

辛弃疾&#xff0c;字幼安&#xff0c;号稼轩&#xff0c;生于南宋高宗赵构绍兴十年&#xff08;公元1140年&#xff09;&#xff0c;卒于南宋宁宗赵扩嘉泰元年&#xff08;公元1207年&#xff09;&#xff0c;享年67岁。他是中国南宋时期著名的爱国词人&#xff0c;与苏轼并称…

Unity贪吃蛇改编【详细版】

Big and small greedy snakes 游戏概述 游戏亮点 通过对称的美感&#xff0c;设置两条贪吃蛇吧&#xff0c;其中一条加倍成长以及加倍减少&#xff0c;另一条正常成长以及减少&#xff0c;最终实现两条蛇对整个界面的霸占效果。 过程中不断记录两条蛇的得分情况&#xff0c…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 部门项目任务分配(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 部门项目任务分配(100分) 🌍 评测功能需要订阅专栏后私信联…

【eMTC】eMTC PBCH与LTE PBCH有什么不同

1 概述 eMTC是基于LTE演进的物联网技术&#xff0c;在R12中叫Low-Cost MTC&#xff0c;在R13中被称为LTE enhanced MTC &#xff0c;即eMTC&#xff0c;旨在基于现有的LTE载波满足物联网设备需求。eMTC基于蜂窝网络进行部署&#xff0c;支持上下行最大1Mbps的峰值速率&#xff…

lxml库在爬虫领域的贡献及应用

重头戏lxml库里面的xpath 一段代码给各位开开胃 这段代码首先导入了lxml库中的etree模块&#xff0c;然后定义了一个包含HTML内容的字符串html。接着&#xff0c;我们使用etree.HTML()函数解析这个HTML字符串&#xff0c;得到一个表示整个HTML文档的树形结构。最后&#xff0c;…

《大数据分析》期末考试整理

一、单项选择题&#xff08;1*9&#xff09; 1.大数据发展历程&#xff1a;出现阶段、热门阶段和应用阶段 P2 2.大数据影响 P3 1&#xff09;大数据对科学活动的影响 2&#xff09;大数据对思维方式的影响 3&#xff09;大数据对社会发展的影响 4&#xff09;大数…

C语言---------深入理解指针

目录 一、字符指针 二、指针数组&#xff1a; 三、数组指针&#xff1a; 1、定义&#xff1a; 2、&数组名和数组名区别&#xff1a; 3、数组指针的使用&#xff1a; 四、数组参数&#xff0c;指针参数&#xff1a; 1、一维数组传参&#xff1a; 2、二维数组传参&am…

单列集合顶层接口Collection及五类遍历方式(迭代器)

collection add方法细节&#xff1a; remove方法细节&#xff1a; contains方法细节&#xff1a; 如果集合中存储的是自定义对象, student之类的, 也想通过contains进行判断, 就必须在javaBean中重写equals方法 contains在arrayList中源代码&#xff1a;在底层调用了equals方…

对候选人得票的统计程序

一个结构体变量中可以存放一组数据&#xff08;如一个学生的学号、姓名、成绩等数据&#xff09;。如果有10个学生的数据需要参加运算&#xff0c;显然应该用数组&#xff0c;这就是结构体数组。结构体数组与以前介绍过的数值型数组不同之处在于&#xff1a;每个数组元素都是一…

认识Redis 主从同步、事务和Memcached的区别

08- 什么是 Redis 主从同步&#xff1f; Redis 的主从同步(replication)机制&#xff0c;允许 Slave 从 Master 那里&#xff0c;通过网络传输拷贝到完整的数据备份&#xff0c;从而达到主从机制。 主数据库可以进行读写操作&#xff0c;当发生写操作的时候自动将数据同步到从…

React+TS前台项目实战(十)-- 全局常用组件CopyText封装

文章目录 前言CopyText组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲项目常用复制文本组件封装&#xff0c;这个组件是一个用于拷贝文本的 React 组件&#xff0c;它提供了拷贝&#xff0c;国际化和消息提示的功能 CopyText组件 1. 功能分…

HTML表格的跨行与跨列:《红楼梦》人物与小学课表示例

在HTML中&#xff0c;表格不仅可以按常规行和列排列数据&#xff0c;还可以通过跨行&#xff08;rowspan&#xff09;和跨列&#xff08;colspan&#xff09;属性来合并单元格&#xff0c;以适应更复杂的数据展示需求。以下是跨行与跨列属性的介绍&#xff0c;以及两个示例&…

全网爆火《pvz植物大战僵尸杂交版》最新安装包,Android、Windows、ios安装包+教程!

今天阿星想和大家分享一个最近在B站上引起轰动的老游戏——《植物大战僵尸》&#xff01; 是的&#xff0c;你没听错&#xff0c;就是那个曾经让我们熬夜到天亮&#xff0c;一关接一关挑战的游戏。 让我们来聊聊&#xff0c;这款游戏怎么就突然又火了起来呢&#xff1f; 原来…

4款好用的文本扩展器!!提高工作效率!【送源码】

今天的文章中为大家带来几款好用的文本扩展器&#xff0c;帮助大家提供工作效率&#xff0c;减少重复劳动&#xff5e; Beeftext Beeftext 是一个文本扩展工具&#xff0c;可以帮助用户快速输入短语、段落或者常用的文本片段。它允许你创建自定义的缩写和对应的文本替换&…

HTTP-代理

HTTP-代理 web代理服务器是网络的中间实体&#xff0c;代理位于客户端和服务器之间&#xff0c;扮演者中间人的角色&#xff0c;在各端点之间来回传递http报文 web的中间实体 web上的代理服务器是代表客户端完成事务处理的中间人&#xff0c;如果没有web代理&#xff0c;htt…

【猫狗分类】Pytorch VGG16 实现猫狗分类4-开始训练

背景 现在&#xff0c;我们已经完成了&#xff0c;数据集的清洗&#xff0c;标签的制作&#xff0c;也把VGG16的模型建立好了。那接下来&#xff0c;我们应该把数据&#xff0c;放到我们搭建的vgg16的模型里面&#xff0c;让模型针对这些猫和狗的图片&#xff0c;去进行训练&a…

MyBatis操作数据库(一)

什么是MyBatis? MyBatis是一个优秀的持久层框架&#xff0c;⽤于简化JDBC的开发。 MyBatis本是Apache的⼀个开源项⽬iBatis&#xff0c;2010年这个项目由apache迁移到了googlecode&#xff0c;并且改名为MyBatis。 简单来说MyBatis是更加简单完成数据和数据库交互的框架 什么…

内存泄漏 内存溢出

概念 内存泄漏&#xff1a;是程序没有正确的释放已分配的内存&#xff0c;造成系统内存的浪费。内存泄漏很难发现&#xff0c;因为他不会直接导致程序崩溃&#xff0c;而是会慢慢降低程序的性能。 内存溢出&#xff1a;系统中存在无法回收的内存或使用的内存过多&#xff0c;…

【C#】使用JavaScriptSerializer序列化对象

在C#开发语言编程中&#xff0c;通常使用系统内置的JavaScriptSerializer类来序列化对象&#xff0c;以便将其转换为JSON格式的文本存储与后台服务通信, 在这里将为大家详细介绍一下这个过程。 文章目录 反序列化序列化忽略属性 假设处理的数据中有一个对象类, 如下 public cl…

逆天改命 17岁中专女生横扫全球数学竞赛

“逆天改命!17岁中专女生横扫全球数学竞赛,清华北大高手纷纷落马!” 最近全网被这则消息震惊了。 来!随便挑几个题目,让大家体验一下阿里巴巴全球数学竞赛的难度? 数学是人工智能算法的基石。它为算法提供了逻辑框架和分析工具,使得人工智能能够处理复杂的数据和问…