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)

  • 下面就是 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知识应用以及文件上传功能实现

  • 然后在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 的访问路径

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

这里

  • 欧克 完美 下一个

  • 多文件上传也要掌握,书上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 了家人们,可莫 干就完了

相关推荐
王会举6 分钟前
Java实现日志全链路追踪.精确到一次请求的全部流程
java·log4j
马剑威(威哥爱编程)19 分钟前
使用 Mybatis 时,调用 DAO接口时是怎么调用到 SQL 的?
java·sql·mybatis
三村阿明1 小时前
Java多线程
java·开发语言·多线程·reentrantlock
Ephemeroptera1 小时前
IT专业入门,高考假期预习指南
java·c语言·网络·python·高考
菜鸟蹦迪1 小时前
java技术:knife4j实现后端swagger文档
java·开发语言
小怪瘦791 小时前
Vue3使用PDFJS将后端查到的二进制数据转为图片
java·前端·javascript
2401_828014951 小时前
无线领夹麦克风哪个牌子好?揭秘领夹麦克风哪个品牌音质最好
java·c++·python·php
不见长安见晨雾1 小时前
Java中反射的使用
java·开发语言
徐浩刚2 小时前
Linux环境下快速部署Spring Boot应用:高效命令组合实践
java·linux
程序员黄同学2 小时前
什么是 JVM( Java 虚拟机),它在 Java 程序执行中扮演什么角色?
java·开发语言·jvm