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 了家人们,可莫 干就完了

相关推荐
艾迪的技术之路13 分钟前
redisson使用lock导致死锁问题
java·后端·面试
今天背单词了吗98031 分钟前
算法学习笔记:8.Bellman-Ford 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
java·开发语言·后端·算法·最短路径问题
天天摸鱼的java工程师34 分钟前
使用 Spring Boot 整合高德地图实现路线规划功能
java·后端
东阳马生架构1 小时前
订单初版—2.生单链路中的技术问题说明文档
java
咖啡啡不加糖1 小时前
暴力破解漏洞与命令执行漏洞
java·后端·web安全
风象南1 小时前
SpringBoot敏感配置项加密与解密实战
java·spring boot·后端
DKPT1 小时前
Java享元模式实现方式与应用场景分析
java·笔记·学习·设计模式·享元模式
Percep_gan1 小时前
idea的使用小技巧,个人向
java·ide·intellij-idea
缘来是庄1 小时前
设计模式之迭代器模式
java·设计模式·迭代器模式