当前位置: 首页 > news >正文

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

相关文章:

  • 分页插件结合collection标签后分页数量不准确的问题
  • 小知识点快速总结:Batch Normalization Layer(BN层)的作用
  • phpcms仿蚁乐购淘宝客网站模板
  • android的surface
  • Sui主网升级至V1.27.2版本
  • Z世代职场价值观的重塑:从“班味”心态到个人成长的追求
  • vue实现全屏screenfull-封装组件
  • 【尝鲜】SpringCloudAlibaba AI 配置使用教程
  • docker封禁对外端口映射
  • xcode报错合集,你都遇到过哪些跳不过的坑
  • 【C++ 11 新特性】lambda 表达式详解
  • 【后端】websocket学习笔记
  • LabVIEW电子类实验虚拟仿真系统
  • 《web应用技术》第十一次课后作业
  • git创建子模块
  • 【技术性】Search知识
  • 2019.2.20 c++ 知识梳理
  • CSS相对定位
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • HTTP请求重发
  • JWT究竟是什么呢?
  • node入门
  • Python十分钟制作属于你自己的个性logo
  • ReactNativeweexDeviceOne对比
  • Web设计流程优化:网页效果图设计新思路
  • Zepto.js源码学习之二
  • 两列自适应布局方案整理
  • 前嗅ForeSpider教程:创建模板
  • 微信小程序设置上一页数据
  • 为什么要用IPython/Jupyter?
  • raise 与 raise ... from 的区别
  • #162 (Div. 2)
  • (4)事件处理——(7)简单事件(Simple events)
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (阿里云万网)-域名注册购买实名流程
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (分布式缓存)Redis哨兵
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (学习日记)2024.01.19
  • (一)Neo4j下载安装以及初次使用
  • (一)面试需要掌握的技巧
  • (原創) 未来三学期想要修的课 (日記)
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • @kafkalistener消费不到消息_消息队列对战之RabbitMq 大战 kafka
  • [ C++ ] STL---仿函数与priority_queue
  • [2016.7.test1] T2 偷天换日 [codevs 1163 访问艺术馆(类似)]
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色
  • [Arduino学习] ESP8266读取DHT11数字温湿度传感器数据
  • [C#]OpenCvSharp 实现Bitmap和Mat的格式相互转换
  • [C#]使用C#部署yolov8的目标检测tensorrt模型
  • [CUDA手搓]从零开始用C++ CUDA搭建一个卷积神经网络(LeNet),了解神经网络各个层背后算法原理
  • [GN] Vue3.2 快速上手 ---- 核心语法2
  • [go] 策略模式
  • [Java] 图说 注解