JavaWeb之Ajax与数据库连接池

xiaoxiao2021-02-28  13

一、数据库连接池

使用数据库连接池的原因:

      数据库连接是一种关键的有限的昂贵资源,对数据库连接的管理能显著影响到整个应用程序的性能。数据库的连接是非常困难的,非常多额消耗资源,如果我们的一个项目连接到数据库,然后另一个项目也连接数据库,当多个项目项目连接数据库的时候系统资源的消耗也会加剧,如果我们在连接数据之后使用的时间很短暂,然后就释放,重复这样,更是一种浪费。数据库连接池正是针对这个问题提出来的,

常见的数据库连接池:

C3P0、DBCP、Tomcat Jdbc Pool、Druid,其中C3P0用于成形的项目,DBCP用于教学、项目测试,Druid用于高性能高并发

数据库连接池的原理:

      连接池的基本思想是在系统初始化的时候,将数据库连接对象存储在数据库连接池中,当用户需要访问数据库的时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完之后,用户也并非关闭连接,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立。断开都由连接池来管理。

C3P0连接池的使用:

1、导入相关jar包

2、在项目src目录建新建一个名叫c3p0-config.xml的文件,并配置连接池的相关信息,文件的名称是固定的,补课改变

3、在代码中使用ComboPooledDataSource对象的getConnection()方法获取数据库连接对象

c3p0-config.xml文件的配置信息如下:

<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <default-config> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb?characterEncoding=utf8</property> <property name="user">root</property> <property name="password">123456</property> <property name="initialPoolSize">10</property> <property name="maxIdleTime">30</property> <property name="maxPoolSize">100</property> <property name="minPoolSize">10</property> <!-- c3p0全局的PreparedStatements缓存的SQL大小 --> <property name="maxStatements">200</property> </default-config> </c3p0-config>配置文件中的内容跟JDBC的配置类似,第一步是加载数据库驱动程序,第二步是建立连接,在配置文件中首先要注明驱动程序,然后是要连接的数据库,接着写入数据库账户、密码可以规定初始连接池的大小,如果不规定,服务器默认为0,有最大响应时间以及连接池的最大最小值、最后规定c3p0全局的PreparedStatement缓存的SQL大小,如果没有规定,默认是0

二、Ajax简介

全称:Asynchronous JavaScript and XML(异步JavaScript和XML)

通过Ajax技术可以通过与后台服务器进行少量的数据交换,从而实现网页的异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行局部刷新。

三、JavaScript实现Ajax

1、获取Ajax对象

var xhr=null; if(window.XMLHttpRequest){ xhr=new XMLHttpRequest(); }else{ xhr=new ActiveXObject("Microsoft.XMLHttp"); }

一般情况下的浏览器直接进入到if块中,但有些浏览器或者版本较低的浏览器不支持XMLHttpRequest则会进入到else块中

2、使用Ajax对象调用open("请求方式","请求路径","是否为异步")

3、绑定状态改变事件

xhr.onreadystatechange=function(){ if(xhr.readyState==4){//接收数据完毕 if(xhr.status==200){//成功处理请求 //交互成功时执行的代码 } } };

4、发送请求

xhr.send(参数);

注意:若为post提交,则必须设置请求头消息:

setRequestHeader("content-type","application/x-www-form-urlencoded");

采用application/x-www-form-urlencoded的POST数据和url中传参只是形式不同,本质都是传递参数。

四、jQuery实现Ajax

1、使用一个HTTP GET请求从服务器加载数据

$.get(url [,data] [,success])

2、使用一个HTTP POST请求从服务器加载数据

$.post(url [,data] [,success])

3、执行一个异步的HTTP(Ajax)的请求

$.ajax([settings])

实例:在本实例中用到了数据库连接池,在数据库连接池的基础之上用JS实现Ajax和用jQuery实现Ajax,实例中列举的例子是注册功能,但是并不是真正的注册,而是通过鼠标指针移动出输入框后的提示来了解Ajax

JavaScript实现Ajax:

get请求方式:register.jsp

<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>注册用户</title> <script type="text/javascript"> function getXHR(){ var xhr = null; if(window.XMLHttpRequest){ xhr = new XMLHttpRequest(); }else{ xhr = new ActiveXObject("Microsoft.XMLHttp"); } return xhr; } function checkUser(obj){ var regName = obj.value;//获取填写的注册用户名 var xhr = getXHR(); //获取Ajax对象 xhr.open("get","/AjaxProject/checkServlet?registerName="+regName,true); //绑定onreadystatechange事件 xhr.onreadystatechange=function(){ if(xhr.readyState == 4){ if(xhr.status == 200){ var txt = xhr.responseText;//获取后台传来的相应文本 document.getElementById("msg").innerHTML=txt; } } }; xhr.send(null);//发送请求 } </script> </head> <body> <form action="${pageContext.servletContext.contextPath}/registerServlet" method="post"> 注册用户名:<input type="text" name="regName" οnblur="checkUser(this)" /> <span id="msg" style="color:red"></span><br/><br/> 注册密码:<input type="password" name="ragPwd" /><br/><br/> <input type="submit" value="注册" /> </form> </body> </html>

psot请求方式:regpost.jsp

<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>注册用户</title> <script type="text/javascript"> function getXHR(){ var xhr = null; if(window.XMLHttpRequest){ xhr = new XMLHttpRequest(); }else{ xhr = new ActiveXObject("Microsoft.XMLHttp"); } return xhr; } function checkUser(obj){ var regName = obj.value;//获取填写的注册用户名 var xhr = getXHR();//获取Ajax对象 xhr.open("post","/AjaxProject/checkServlet",true); //post请求时必须设置请求头消息 xhr.setRequestHeader("content-type","application/x-www-form-urlencoded"); //绑定onreadystatechange事件 xhr.onreadystatechange=function(){ if(xhr.readyState == 4){ if(xhr.status == 200){ var txt = xhr.responseText;//获取后台传来的相应文本 document.getElementById("msg").innerHTML = txt; } } }; xhr.send("registerName=" + regName);//发送请求 } </script> </head> <body> <form action="${pageContext.servletContext.contextPath}/registerServlet" method="post"> 注册用户名:<input type="text" name="regName" οnblur="checkUser(this)" /> <span id="msg" style="color:red"></span><br/><br/> 注册密码:<input type="password" name="ragPwd" /><br/><br/> <input type="submit" value="注册" /> </form> </body> </html>

jQuery实现Ajax:

使用HTTP GET请求:register.jsp

<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>注册用户</title> <script type="text/javascript" src="../js/jquery-3.1.1.js"></script> <script type="text/javascript"> $(function(){ $("#registername").blur(function(){ $.get("/AjaxProject/checkServlet",{"registerName":$("#registername").val()}, function(data){ $("#msg").html(data); }); }); }); </script> </head> <body> <form action="${pageContext.servletContext.contextPath}/registerServlet" method="post"> 注册用户名:<input type="text" id="registername" name="regName" /> <span id="msg" style="color:red"></span><br/><br/> 注册密码:<input type="text" name="regPwd" /><br/><br/> <input type="submit" value="注册" /> </form> </body> </html>

执行异步HTTP(Ajax)请求:ajax.jsp

<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>注册用户</title> <script type="text/javascript" src="../js/jquery-3.1.1.js"></script> <script type="text/javascript"> $(function(){ $("#registername").blur(function(){ $.ajax({ method:"post", url:"/AjaxProject/checkServlet", data:{"registerName":$("#registername").val()}, beforeSend:function(){ alert("准备发送数据..."); }, success:function(data){ $("#msg").html(data); } }); }); }); </script> </head> <body> <form action="${pageContext.servletContext.contextPath}/registerServlet" method="post"> 注册用户名:<input type="text" id="registername" name="regname" /> <span id="msg" style="color:red"></span><br/><br/> 注册密码:<input type="password" name="regPwd" /><br/><br/> <input type="submit" value="注册" /> </form> </body> </html>

后台代码:

数据库工具类:

package util; import java.sql.*; import com.mchange.v2.c3p0.ComboPooledDataSource; public class DBUtil { private static ComboPooledDataSource ds; static { ds = new ComboPooledDataSource(); } //检查是否存在此注册名 public static boolean checkRegisterName(String regName) { boolean flag = false; Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { conn = ds.getConnection();//获取数据库连接 String sql = "select * from user where name=?"; ps = conn.prepareStatement(sql); ps.setString(1,regName); rs = ps.executeQuery(); if(rs.next()) { flag = true;//如果已经存在此用户名,则将falg设为true } } catch (SQLException e) { e.printStackTrace(); } finally { try { rs.close(); ps.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } } return flag; } }

检验名字的Servlet类:

package servlet; import java.io.IOException; import java.io.PrintWriter; 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 util.DBUtil; @WebServlet(name="CheckNameServlet",urlPatterns= {"/checkServlet"}) public class CheckNameServlet extends HttpServlet { @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 { resp.setHeader("content-type","application/x-www-form-urlencoded"); resp.setCharacterEncoding("utf-8"); PrintWriter pw = resp.getWriter(); String regName = req.getParameter("registerName"); System.out.println("后台接收到的注册名为:" + regName); boolean flag = DBUtil.checkRegisterName(regName); if(flag) { pw.println("sorry!该用户名已被注册,请选择其他用户名!"); }else { pw.println("恭喜!可以使用该用户名~~~"); } pw.flush(); pw.close(); } } 完整的项目已上传到GitHub上,可以点击链接 https://github.com/AnsrFor/web.git下载查看
转载请注明原文地址: https://www.6miu.com/read-1900085.html

最新回复(0)