2020.11.1

2023-11-09

1.登录业务的完善

1.1后端控制页面跳转

			if (rs.next()) {
				System.out.println("登陆成功");
				request.setAttribute("name", username);
				request.getRequestDispatcher("/WEB-INF/view/index.jsp").forward(request, response);
			} else {
				System.out.println("登录失败,密码或用户名错误");
				request.setAttribute("msg", "用户名密码错误");
				request.getRequestDispatcher("login.jsp").forward(request, response);
			}

1.2 前端给出提示信息

 <h5>${msg}</h5> <br>    //JSTL表达式的运用

2.注册业务的实现

2.1 后端

package controller;

import java.io.IOException;
import java.sql.*;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 用户注册
 * 
 * @author 路飞
 *
 */
@WebServlet("/register")
public class RegisterController extends HttpServlet {

	private static final String DRIVENAME = "com.mysql.jdbc.Driver";
	private static final String URL = "jdbc:mysql://localhost:3306/qianli?useUnicode=true&characterEncoding=UTF-8";
	private static final String USER = "root";
	private static final String PASSWORD = "123456";
	private static ResultSet rs = null;
	private static Connection conn = null;
	private static PreparedStatement ps = null;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		request.setCharacterEncoding("utf-8");
		String username = request.getParameter("username");
		String password = request.getParameter("password");

		try {
			Class.forName(DRIVENAME).newInstance();
			conn = DriverManager.getConnection(URL, USER, PASSWORD);

			String sql = "INSERT INTO users VALUES(DEFAULT,?,?)";
			ps = conn.prepareStatement(sql);
			ps.setString(1, username);
			ps.setString(2, password);
			int index = ps.executeUpdate();

			if (index > 0) {
				System.out.println("注册成功");
				request.setAttribute("msg", "注册成功");
				request.getRequestDispatcher("login.jsp").forward(request, response); //请求转发
			} else {
				System.out.println("登录失败");
				request.setAttribute("msg", "登录失败");
				request.getRequestDispatcher("register.jsp").forward(request, response);
			}
			conn.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

2.2 前端

注册页面

   <h1>用户注册</h1>

    <form action="${pageContext.request.contextPath}/register" method="post">
        用户名:<input type="text" name="username">
        密码:<input type="password" name="password">
        <input type="submit" value="登录">
    </form>${msg}

主页

<h1> ${name}登陆成功</h1>

2.3 讲解WEB-INF文件夹和WebContent文件夹

3.连接池

3.1 作用

正常访问数据库的过程中,每次访问都需要创建新的连接,这会消耗大量的资源;连接池的就是为数据库连接建立一个“缓冲区”,预先在缓冲池中放入一定数量的连接对象,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去;且连接池允许多个客户端使用缓存起来的连接对象,这些对象可以连接数据库,它们是共享的、可被重复使用的;使用连接池可以节省大量资源,提高程序运行速度。

3.2原理

先初始化一定的数据库连接对象,并且把这些连接保存在连接池中。这些数据库连接的数量是由最小数据库连接数来设定的。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。当程序需要访问数据库的时候,如果连接池中有空闲的连接,可直接得到一个连接;如果连接池对象中没有空闲的连接,且连接数没有达到最大,会创建一个新的连接从连接池中取出一个连接,数据库操作结束后,再把这个用完的连接重新放回连接池。

3.3常用连接池

JDBC,C3P0,Druid,Tomcat,Hikari(号称最强,springboot默认连接池)

常用连接池对比

3.4 连接池的使用

配置properties文件

# 数据库驱动|不填写druid会自动识别
driverClassName=com.mysql.jdbc.Driver
# 访问数据库连接
url=jdbc:mysql://localhost:3306/qianli?useUnicode=true&characterEncoding=UTF-8
# 数据库用户名
username=root
# 数据库密码
password=123456
#初始化连接数
initialSize=5
#最大连接池数量
maxActive=10
#获取连接时最大等待时间,单位毫秒
maxWait=3000

创建DruidUtils数据库连接工具类

package com.itql.util;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import com.alibaba.druid.pool.DruidDataSourceFactory;

/**
 * Druid数据库连接池工具类的设计
 * @author 路飞
 *
 */
public class DruidUtils {
	private static ResultSet rs = null;
	private static  PreparedStatement ps = null;
	private static Connection connection;
    private static DataSource dataSource = null;
 
    static {
        try {
            Properties p = new Properties();
            p.load(DruidUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
            DruidDataSourceFactory druidDataSourceFactory = new DruidDataSourceFactory();
            dataSource = druidDataSourceFactory.createDataSource(p);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
 
    public static void close(Connection connection, PreparedStatement ps, ResultSet resultSet) {
        // 代码的严谨性
        try {
            if (resultSet != null) {
                resultSet.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        try {
            if (ps != null) {
            	ps.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        try {
            if (connection != null) {
                connection.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
 
    }
}

加入log4j配置文件

log4j.rootCategory=DEBUG, CONSOLE ,LOGFILE 

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%C %p %m %n

log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=F:/qianli.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%C %m %L %n

使用方法

DruidUtils.getConnection()   //创建连接
DruidUtils.close(conn, ps, rs); //关闭连接
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2020.11.1 的相关文章

随机推荐

  • Hyper-V虚拟机网络设置

    Hyper V是基于64位系统 在Windows10自带的虚拟化工具 1 Hyper V的启动和管理 控制面板 gt 程序 gt 打开或关闭Windows功能中启用Hyper V 第一次设置后需要重启电脑 2 打开Hyper V管理器 3
  • C语言数据结构循环双链表

    include
  • SpringCloud OpenFeign 请求重试

    前言 真实的微服务业务场景中 可能出现跨服务调用失败的情况 最常见的就是被调用的服务正在发布 由于微服务之间通常有依赖关系 发布有一定的先后顺序 对于一个微服务应用常见的发布策略有两种 先停掉集群中一半的实例 然后重新启动这些应用 完成之后
  • IMX6学习记录(19)-移植Cjson

    上面是我的微信和QQ群 欢迎新朋友的加入 1 地址 地址 https github com DaveGamble cJSON 2 简单应用 解压到Ubuntu下 直接在Ubuntu下使用 gcc test c cJSON c o test
  • fisco-bcos区块链webase浏览器无法加载验证码,报错无法登陆

    fisco bcos区块链webase浏览器无法加载验证码 报错无法登陆 浏览器里验证码加载不出来 图中显示的是webase nodemanager模块出错 检查log文件 发现nodemanager模块下确实报错 但再细查后发现实际上问题
  • OPENCV MAT mat.inl中release(),clone(),copyto()等函数一直莫名异常

    问题 OPENCV MAT mat inl中release clone copyto 等函数一直莫名异常 今天三维点云转二维图的时候 一直出现莫名奇妙的问题 最后发现是越界的问题 需要注意 1 cv mat cv Mat zeros Siz
  • 读书笔记:Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression

    摘要 在目标识别过程中 IOU是最流行的一个评价基准 在进行边框优化的过程中 IOU一般是取最大值 对一个标准进行优化的目标函数是其标准本身 在2D回归的过程中 IOU展示了他直接能作为一个损失函数 然而 IOU展现了他的缺点 在没有重叠的
  • 【CH32】

    系列文章目录 CH32 00 开发环境搭建 CH32 01 新建工程 下载 运行 调试 CH32 02 常用外设 GPIO 失败了也挺可爱 成功了就超帅 文章目录 前言 1 GPIO简介 2 IO口的内部结构框图 保护二极管 上下拉电阻 施
  • 【技术开发经验分享】计算机毕业设计PySpark+Hadoop知识图谱电影推荐系统 Django电影推荐系统 用户画像电影推荐系统 电影数据分析 电影可视化 电影爬虫 电影大数据 大数据毕业设计 大数

    简介 本系统为我的本科毕业设计项目 毕设题目为 基于用户画像的电影推荐系统的设计与实现 本系统是以Django作为基础框架 采用MTV模式 数据库使用MongoDB MySQL和Redis 以从豆瓣平台爬取的电影数据作为基础数据源 主要基于
  • 简单漏洞:CVE-2022-0543 Redis Lua 沙盒绕过

    一 描述 影响范围 Debian系得linux发行版本 Ubuntu Debian系得linux发行版本 其并非Redis本身漏洞 形成原因在于系统补丁加载了一些redis源码注释了的代码 揭露时间 2022 3 8 二 原理 redis在
  • DevOps基础服务2——Jenkins

    文章目录 一 基本了解 1 1 CI CD介绍 1 2 基于Docker的CI CD 二 安装jenkins 三 页面管理 3 1 当前系统用户配置 3 2 系统配置 3 3 全局工具配置 3 4 插件管理 3 4 1 安装插件 3 4 2
  • Ruoyi框架学习--XSS

    什么是XSS XSS通常指的是通过利用网页开发时留下的漏洞 通过巧妙的方法注入恶意指令代码到网页 使用户加载并执行攻击者恶意制造的网页程序 这些恶意网页程序通常是JavaScript 但实际上也可以包括Java VBScript Activ
  • 经典SHELL面试题

    1 如何向脚本传递参数 script argument 例子 显示文件名称脚本 show sh file1 txt cat show sh bin bash cat 1 2 如何在脚本中使用参数 第一个参数 1 第二个参数 2 例子 脚本会
  • 微信小程序云函数创建,安装npm环境依赖

    微信小程序云函数创建 安装npm环境依赖 cmd终端执行 1 npm install request promise production 2 npm install save wx server sdk latest
  • Python爬取王者荣耀全英雄全皮肤图片

    Python爬取王者荣耀全英雄全皮肤图片 前言 思路 分析 编码 案例源码 附图 总结 前言 以前写过类似的博客 利用Java爬取王者荣耀全英雄全皮肤图片 当时是利用 jsoup包来对目标网页进行解析 可笑的是当时找图片的链接找了好久 处理
  • 人工智能与机器学习---线性规划和非线性规划求解

    一 线性规划 1 线性规划的概念 线性规划 Linear Programming 简记 LP 是了运筹学中数学规划的一个重要分支 自从 1947 年 G B Dantzig 提出 求解线性规划的单纯形法以来 线性规划在理论上趋向成熟 在实用
  • 谷歌邮箱账号不会注册?注册失败?这份完美注册教程请收好

    谷歌邮箱相信大家都不陌生吧 无论是用于发送和接收邮件 还是用于在国外网站注册 很多人都离不开谷歌邮箱 甚至 一些网站直接提供谷歌邮箱登录选项 这就是为什么很多跨境人想要注册谷歌邮箱的原因 但是 大部分网友都无法自己完整注册 今天来做一篇完整
  • 【AI赋能】人工智能在自动驾驶时代的应用

    自我介绍 我是秋说 研究 人工智能 大数据 等前沿技术 传递 Java Python 等语言知识 主页链接 秋说的博客 学习专栏推荐 人工智能 创新无限 MySQL进阶之路 C 刷题集 网络安全攻防姿势总结 从0开始 深度掌握 C程序设计
  • MATLAB将数据存在TXT文件中

    记录结果 将数据保存到txt文件中 fid fopen 结果记录 txt a 结果记录 txt是存储数据的文件 a是数据向后增加的意思 fprintf fid f t hz f t是将数据往同一行的后面存 fprintf fid f n z
  • 2020.11.1

    1 登录业务的完善 1 1后端控制页面跳转 if rs next System out println 登陆成功 request setAttribute name username request getRequestDispatcher