用户管理的小demo --登录:

目录

1、建库、建表

1.1 连接数据库后,在idea中 通过快捷方式 自动导入实体类

1.2 实体类代码

2、idea中的准备工作

2.1 在父工程下 新建子工程

2.2 在子工程下 添加webapp、pom.xml设置为 war的打包方式

2.3 在父工程下的pom.xml中 添加依赖

2.3.1 mysql的依赖

2.3.2 jsp 的依赖

2.3.3 jstl 的依赖

3、 idea中 主要的代码工作

3.1 封装jdbc

3.1.1 jdbc 的配置文件

3.1.2 建一个 util 包,里面new 类

3.2 项目从“登录”开始

3.2.1 在 webapp 下,新建“login.jsp”

3.2.2 在 web.xml 中, 对 login.jsp 进行配置

3.3 new 一个主页面的jsp ,即:main.jsp

3.4 开始构建三层架构(servlet层、service层、dao层)

3.4.1 servlet层

3.4.2 service 层

3.4.2.1 在自动写好的 UserServiceImpl.java 的基础上,进行代码编写

3.4.2.2 处理报红代码

3.4.3 dao 层

注意:一直抛异常 直到抛异常到servlet, 需要在servlet层 捕获异常 即:进行try catch处理

3.5 选择所要运行的 子工程

4、运行

4.1 在idea中 运行代码之后,会自动 弹出浏览器 ,显示页面

4.2 输入内容 点击登录后 显示:


1、建库、建表

1.1 连接数据库后,在idea中 通过快捷方式 自动导入实体类

pojo、entity均能代表 “实体类”

1.2 实体类代码

package com.by.pojo;
public class User {
  private Integer id;
  private String username;
  private String password;
  private String sex;
  private Integer age;
  private String address;

  public User() {
  }
  public User(Integer id, String username, String password, String sex, Integer age, String address) {
    this.id = id;
    this.username = username;
    this.password = password;
    this.sex = sex;
    this.age = age;
    this.address = address;
  }
  public Integer getId() {
    return id;
  }
  public void setId(Integer id) {
    this.id = id;
  }
  public String getUsername() {
    return username;
  }
  public void setUsername(String username) {
    this.username = username;
  }
  public String getPassword() {
    return password;
  }
  public void setPassword(String password) {
    this.password = password;
  }
  public String getSex() {
    return sex;
  }
  public void setSex(String sex) {
    this.sex = sex;
  }
  public Integer getAge() {
    return age;
  }
  public void setAge(Integer age) {
    this.age = age;
  }

  public String getAddress() {
    return address;
  }
  public void setAddress(String address) {
    this.address = address;
  }
}

2、idea中的准备工作

2.1 在父工程下 新建子工程

2.2 在子工程下 添加webapp、pom.xml设置为 war的打包方式

2.3 在父工程下的pom.xml中 添加依赖

2.3.1 mysql的依赖

利用命令行 查看mysql的版本号

       <!--添加mysql的依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>

2.3.2 jsp 的依赖

<dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.0</version>
        </dependency>

2.3.3 jstl 的依赖

<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

3、 idea中 主要的代码工作

3.1 封装jdbc

3.1.1 jdbc 的配置文件

#mysql8\u9A71\u52A8
driverClass = com.mysql.jdbc.Driver
#\u7528\u6237\u540D
username = root
#\u6570\u636E\u5E93\u5BC6\u7801
password = root
#\u6570\u636E\u5E93url
url = jdbc:mysql://localhost:3306/servlet?characterEncoding=UTF-8

3.1.2 建一个 util 包,里面new 类

package com.by.util;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class Config {
    private static String username;
    private static String password;
    private static String url;
    private static String driverClass;

    static{
        //特殊的 Hashtable
        Properties prop = new Properties();
        try {
            //读取类路径下的配置文件
            //返回的是“流”,给到变量“is”
            InputStream is = Config.class.getClassLoader().getResourceAsStream("jdbc.properties");
            //加载配置文件内容
            prop.load(is);
            //从里面拿数据
            username = prop.getProperty("username");
            password = prop.getProperty("password");
            url = prop.getProperty("url");
            driverClass = prop.getProperty("driverClass");

            if (driverClass != null && url != null && username != null && password != null) {
                //加载驱动
                Class.forName(driverClass);
            }
        }catch(FileNotFoundException e){
            throw new RuntimeException(e);
        }catch(IOException e){
            throw new RuntimeException(e);
        }catch (ClassNotFoundException e){
            throw new RuntimeException(e);
        }
    }

    /**
     * 获取连接
     * @return java.sql.Connection
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException {
        Connection con = null;
        try{
            con = DriverManager.getConnection(url,username,password);
        }catch(Exception e){
            e.printStackTrace();
        }
        return con;
    }

    /**
     * 释放资源
     * @param con
     * @param stat
     * @param res
     * @throws SQLException
     */
    public static void close(Connection con, Statement stat, ResultSet res) throws SQLException{
        if(con != null){
            con.close();
        }
        if(stat != null){
            stat.close();
        }
        if(res != null){
            res.close();
        }
    }
}

package com.by.util;

import java.sql.*;

/**
 * 封装工具类
 */
public class JdbcUtils {
    private static Connection con = null;
    private static Statement st = null;
    private static ResultSet rs = null;
    private static PreparedStatement ps = null;

    /**
     * 通用更新封装
     *
     * @param sql    sql语句
     * @param params 传入多参,也可以以数组形式传入
     * @return
     * @throws SQLException
     */
    public static int update(String sql, Object... params) throws SQLException {
        int flag = 0;
        try {
            con = Config.getConnection();
            ps = con.prepareStatement(sql);
            for(int i=0; i<params.length; i++){
                ps.setObject(i+1, params[i]);
            }
            System.out.println(ps.toString());
            flag = ps.executeUpdate();
        }catch (SQLException e){
            e.printStackTrace();
        }finally {
            Config.close(con,ps,null);
        }
        return flag;
    }

    /**
     * 通用查询
     * @param sql
     * @param params
     * @return
     * @throws SQLException
     */
    public static ResultSet query(String sql, Object ...params) throws SQLException{
        try{
            con = Config.getConnection();
            ps = con.prepareStatement(sql);
            for(int i = 0; i<params.length; i++){
                //把?替换成实际的参数
                ps.setObject(i+1, params[i]);
            }
            System.out.println(ps.toString());
            rs = ps.executeQuery();
        }catch (Exception e){
            e.printStackTrace();
        }
        return rs;
    }
}

3.2 项目从“登录”开始

3.2.1 在 webapp 下,新建“login.jsp”

<%--
  Created by IntelliJ IDEA.
  User: 86150
  Date: 2024/6/1
  Time: 10:05
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
   <h3>用户管理系统</h3>
   <form method="post" action="login">
       账号:<input type="text" name="username"><br>
       密码:<input type="text" name="password"><br>
       <input type="submit" value="登录">
   </form>

</body>
</html>

3.2.2 在 web.xml 中, 对 login.jsp 进行配置

3.3 new 一个主页面的jsp ,即:main.jsp

3.4 开始构建三层架构(servlet层、service层、dao层)

3.4.1 servlet层

package com.by.servlet;

import com.by.pojo.User;
import com.by.service.UserService;
import com.by.service.impl.UserServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 注意:
 *  一次只写一层
 *
 *  web层:接受请求,控制跳转
 */
public class LoginServlet extends HttpServlet {
    private UserService userService = new UserServiceImpl();

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        try{
            req.setCharacterEncoding("UTF-8");
            String username = req.getParameter("username");
            String password = req.getParameter("password");
            User user = userService.login(username,password);
            //控制跳转
            if(user!=null){
                //利用重定向
                resp.sendRedirect("main.jsp"); //登录成功 去主页面
            }else{
                resp.sendRedirect("login.jsp"); //登录失败 去登录页面
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

3.4.2 service 层

3.4.2.1 在自动写好的 UserServiceImpl.java 的基础上,进行代码编写

3.4.2.2 处理报红代码

3.4.3 dao 层

dao抛异常了,service也要抛异常

注意:一直抛异常 直到抛异常到servlet, 需要在servlet层 捕获异常 即:进行try catch处理

3.5 选择所要运行的 子工程

4、运行

4.1 在idea中 运行代码之后,会自动 弹出浏览器 ,显示页面

4.2 输入内容 点击登录后 显示:

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

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

相关文章

基于STC12C5A60S2系列1T 8051单片机实现一主单片机与一从单片机相互发送数据的RS485通信功能

基于STC12C5A60S2系列1T 8051单片机实现一主单片机与一从单片机相互发送数据的RS485通信功能的RS485通信功能 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机串口通信介绍STC12C5A60S2系列1T 8051单片机串口通信的结构基于STC12C5A60S2系列1T 8051单片机串…

力扣hot100学习记录(十一)

24. 两两交换链表中的节点 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 题意 两两交换链表中的相邻节点 思路 先创建一个…

机器学习知识点总结

简介&#xff1a;随着人工智能&#xff08;AI&#xff09;蓬勃发展&#xff0c;也有越来越多的人涌入到这一行业。下面简单介绍一下机器学习的各大领域&#xff0c;机器学习包含深度学习以及强化学习&#xff0c;在本节的机器学习中主要阐述一下机器学习的线性回归逻辑回归&…

嘉之音:十年磨一剑 敢为天下先

一个产品创新 一个行业成长 一段人生价值 不断积累、沉淀、创新&#xff0c;终将实现其价值。 前十年&#xff0c;嘉之音经历了传统建材行业的变迁&#xff1b;声学聚酯自2010年初诞生&#xff0c;现在正在从第一个十年萌芽期进入高速成长黄金期。近年来&#xff0c;市场的不…

A6370超速保护监控器

A6370监控器是AMS 6300 SIS超速保护系统的一部分&#xff0c;并且 与A6371一起安装在19英寸机架中(84HP宽&#xff0c;3RU高) 系统底板。一个AMS 6300 SIS由三个保护监视器(A6370)组成 和一个背板(A6371)。 该系统设计用于涡流传感器、霍尔元件传感器和 磁性(VR)传感器。 传感器…

鸿蒙Ability Kit(程序框架服务)【UIExtensionAbility】

UIExtensionAbility 概述 [UIExtensionAbility]是UI类型的ExtensionAbility组件&#xff0c;需要与[UIExtensionComponent]一起配合使用&#xff0c;开发者可以在UIAbility的页面中通过UIExtensionComponent嵌入提供方应用的UIExtensionAbility提供的UI。UIExtensionAbility会…

strcpy、strncpy、strcat、strncat、strcmp、strstr字符串函数的使用和模拟

strcpy的使用和模拟&#xff08;作用&#xff09; 将一个字符串的内容复制到另外一个字符串中代替掉。 strcpy的使用效果 #include <stdio.h> #include <string.h>int main () {char str1[]"Sample string";char str2[40];char str3[40];strcpy (str2…

【学习笔记】Windows GDI绘图(十一)Graphics详解(下)

文章目录 Graphics的方法Graphics.FromImageSetClip设置裁切区域IntersectClip更新为相交裁切区域TranslateClip平移裁切区域IsVisible判断点或矩形是否在裁切区域内MeasureCharacterRanges测量字符区域MeasureString测量文本大小MultiplyTransform矩阵变换 Graphics的方法 Gr…

大模型时代的具身智能系列专题(九)

NYU Lerrel Pinto团队 Lerrel Pinto是NYU Courant的计算机科学助理教授&#xff0c;也是用机器人和人工智能实验室(CILVR小组)的一员。在加州大学伯克利分校读博士后&#xff0c;在CMU机器人研究所读博士&#xff0c;在印度理工学院古瓦哈蒂读本科。研究目标是让机器人在我们生…

JDBC学习笔记(二)进阶篇

一、JDBC 扩展 1.1 实体类和ROM 实体类代码&#xff1a; package com.atguigu.advanced.pojo;//类名就是数据库表的 t_ 后面的单词全写 public class Employee {private Integer empId;//emp_idprivate String empName;//emp_nameprivate Double empSalary;//emp_salarypriva…

二叉树遍历 和 线索二叉树

文章目录 1.1 二叉树遍历1.1 前提问题1&#xff1a; 什么叫二叉树的遍历&#xff1f;二叉树的三种遍历&#xff1a;三个概念&#xff1a;遍历 和 访问 和 经过重要概念&#xff1a;遍历过程中的经过节点&#xff0c;不代表访问节点 问题2&#xff1a;遍历和访问的联系&#xff…

利用conda进行R的安装

1.miniconda3的安装 官网&#xff1a;Miniconda — Conda documentation 找到对应系统、Python版本下载 wget https://mirrors.ustc.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh #wget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x…

Python项目代码太多if-else? 这样优化才优雅!

前言 代码中不可避免地会出现复杂的if-else条件逻辑,而简化这些条件表达式是一种提高代码可读性极为实用的技巧。 在 Python 中,有多种方法可以避免复杂的 if-else 条件逻辑,使代码更加清晰和易于维护。 筑基期 提前 return,去掉多余的 else 在 Python 中,使用"提…

C++基础编程100题-003 OpenJudge-1.1-05 输出保留12位小数的浮点数

更多资源请关注纽扣编程微信公众号 http://noi.openjudge.cn/ch0101/05/ 描述 读入一个双精度浮点数&#xff0c;保留12位小数&#xff0c;输出这个浮点数。 输入 只有一行&#xff0c;一个双精度浮点数。 输出 也只有一行&#xff0c;保留12位小数的浮点数。 样例输入…

Day 42 LVS四层负载均衡

一&#xff1a;负载均衡简介 1.集群是什么 ​ 集群&#xff08;cluster&#xff09;技术是一种较新的技术&#xff0c;通过集群技术&#xff0c;可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益&#xff0c;其任务调度则是集群系统中的核心技术 …

LangChain学习之 Question And Answer的操作

1. 学习背景 在LangChain for LLM应用程序开发中课程中&#xff0c;学习了LangChain框架扩展应用程序开发中语言模型的用例和功能的基本技能&#xff0c;遂做整理为后面的应用做准备。视频地址&#xff1a;基于LangChain的大语言模型应用开发构建和评估。 2. Q&A的作用 …

web刷题记录(2)

[鹤城杯 2021]EasyP 就是php的代码审计 从中可以看出来&#xff0c;就是对四个if语句的绕过&#xff0c;然后过滤了一些语句 代码分析&#xff1a; 通过include utils.php;导入了一个叫做"utils.php"的文件&#xff0c;这意味着在该文件中可能定义了一些与本代码相…

通信协议:常见的芯片间通信协议

相关阅读 通信协议https://blog.csdn.net/weixin_45791458/category_12452508.html?spm1001.2014.3001.5482 本文将简单介绍一些常见的芯片间通信协议&#xff0c;但不会涉及到协议的具体细节。首先说明&#xff0c;芯片间通信方式根据通信时钟的区别可以分为&#xff1a;异步…

计算机网络ppt和课后题总结(上)

试在下列条件下比较电路交换和分组交换。要传送的报文共 x(bit)。从源点到终点共经过 k 段链路&#xff0c;每段链路的传播时延为 d(s)&#xff0c;数据率为 b(b/s)。在电路交换时电路的建立时间为 s(s)。在分组交换时分组长度为 p(bit)&#xff0c;且各结点的排队等待时间可忽…

基于YOLOv7的口罩检测

目录 1. 作者介绍2. YOLOv7网络模型2.1 算法简介2.2 数据集介绍2.3 YOLO格式数据集制作 3. 代码实现3.1 分割数据集3.2 修改数据配置文件3.3 修改训练代码&#xff0c;进行训练3.4 修改测试代码&#xff0c;进行测试3.5 检测结果 1. 作者介绍 曹宇欢&#xff0c;女&#xff0c…