一、相比于之前的是连接数据库而检查
head里面:
1 | <script type="text/javascript" src="js/jquery-1.11.3.min.js"></script> |
body里面:
1 | <table border="1" width="400px"> |
输入admin数据库里面有:
输入不存在的数据:
二、JQ和ajax方式对比
只有jsp页面不同:
head里面:
1 | <script type="text/javascript" src="js/jquery-1.11.3.min.js"></script> |
body里面:
1 | <table border="1" width="400px"> |
输入admin数据库里面有:
输入不存在的数据:
只有jsp页面不同:
1 | 1. 因为是js库:所以要通过srcipt导入包 |
1 | <head> |
Servlet代码:
1 | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { |
1 | 1. 因为是js库:所以要通过srcipt导入包 |
1 | <head> |
打开页面之后点击按钮-弹出Servlet传过来data:
然后关闭弹窗之后通过赋值会把内容给蓝框里面:
1 | 1. 因为是js库:所以要通过srcipt导入包 |
1 | <script type="text/javascript"> |
load
$("#元素id").load(url地址);
$("#div1").load(serlvet); ---> 使用的get请求,回来赋值的时候, 使用text();去赋值
get
语法格式 : $.get(URL,callback);
使用案例: $.get("/day16/DemoServlet02" , function(data ,status) {
$("#div01").text(data);
});
post
语法格式:$.post(URL,data,callback);
function post() {
$.post("/day16/DemoServlet02", {name:"zhangsan",age:18},function(data,status) {
//想要放数据到div里面去。 --- 找到div
$("#div01").html(data);
});
}
新建jsp页面(主要代码)
1 | <table border="1" width="400px"> |
jsp页面:
需要导入DBUtils和C3P0数据池的jar文件以及数据池配置文件xml(修改数据库为user)
C3P0数据池配置文件内容:
1 | <?xml version="1.0" encoding="UTF-8"?> |
数据库建立如下(以前的校验都是if判断):
使用MVC模式解决问题:
对于实现的分析图:
最终实现代码框架:
UserDao类:
1 | public interface UserDao { |
UserDaoImpl类:
1 | public class UserDaoImpl implements UserDao { |
checkUserNameServlet类代码:
1 | public class checkUserNameServlet extends HttpServlet { |
主页demo03.jsp代码:
1 | <%@ page language="java" contentType="text/html; charset=UTF-8" |
最终输入一个用户名会提示判断,并且在java控制台输出结果:
Asynchronous Javascript And XML:异步JavaScript和XML
并不是新的技术,只是把原有的技术,整合到一起而已。
1.使用CSS和XHTML来表示。
2. 使用DOM模型来交互和动态显示。
3.使用XMLHttpRequest来和服务器进行异步通信。
4.使用javascript来绑定和调用。
刷新局部内容
创建一个demo01.jsp页面:主要去写浏览器点击按钮后通过ajax方式获得数据请求,servlet得到反馈。
数据请求中的Get思路:
1 | 1.在body里面写一个点击按钮 onclick="get()" |
jsp页面的主要代码:
1 | <head> |
DemoSerlvet01主要去写输出:
1 | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { |
最终点击jsp页面的一行弹出alert提示:java控制台输出获取的信息
跟get的差距:
1 |
|
与get方法的前三步骤一样(不带参数):
1 | function post(){ |
主要代码如下:
1 | <head> |
DemoSerlvet01主要去写输出:
1 | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { |
1 | function ajaxFunction(){ <!--拷贝写好的创建对象的方法 --> |
1 | request.open("GET","/day16/DemoSerlvet01?name=aa&age=18",true); |
1 | //固定的格式: |
readystate状态集:
status的状态集:
1 | //如果是post方式就必须要添加头 --说明提交的数据类型是一个经过url编码的form表单数据 |
数据库SQL语句:
1 | CREATE DATABASE stus; |
Navicat配合mysql直接可视化:
1. 先写index.jsp页面
2. 写一个StudentListServlet类去进行查询学生信息—弹出到list.jsp页面
3. 写一个Student类(封装):里面写所有数据库的属性以及set和get方法
4. 写dao层里面的StudentDao类:里面去写要完成什么方法
5. 写dao.impl里面的StudentDaoImpl类:具体去写连接数据库等操作
1.需要连接开源数据池和连接数据库:
所以要引入c3p0和DBUtils的jar以及连接数据库的jar包,还有就是要有c3p0开源数据池的配置文件。
2. 建立Util包,里面放写好的JDBCUtil02(简化的JDBC连接类)
3. StudentDaoImpl类里面去完成写当时的连接数据库查询的三步
1. 新建service接口和实现类–和dao以及daoimpl代码一样(为了service去找dao)
2. 在Serlvet代码内增加StudentService service=new StudentServiceImpl()
(为了servlet找service)
1. 完善Servlet类
1 | //1.查询出所有学生 |
2. 写跳转的list.jsp页面
1 | 1.在body里面建立2*8的表格: |
1. 通过主页面list.jsp的添加href要去找添加的界面,因此写一个add.jsp页面
2. 接下来完成servlet(1.获取客户端提交的信息 2.添加到数据库 3.跳转到list.jsp的主页面)
3. 需要去找dao层的studentDao写insert()方法
4. 然后去impl里面去实现insert()方法
和之前的查询一样都是两步:第一步通过JDBCUtil02导入连接;第二步通过update的方法导入信息
5.更改service层代码–添加和dao一层的代码,但是在impl里面建立dao的对象
6. 更改Add.servlet层代码–添加到数据库
注意事项:
1. 设置点击超链接弹出一个询问框,如果点击确定–删除成功
1 | <a href="#" onclick="doDelete(${stu.sid})">删除</a> |
2. 让超链接执行js方法–触发servlet
1 | <script type="text/javascript"> |
来数据库查询的时候,只查一页的数据就返回了。
优点 内存中的数据量不会太大
缺点:对数据库的访问频繁了一点。
SELECT * FROM stu LIMIT 5 OFFSET 2 (一次性五条 相对与之前的而言)
一口气把所有的数据全部查询出来,然后放置在内存中。
优点: 访问速度快。
缺点: 数据库量过大,内存溢出。
描述数据的数据 String sql , 描述这份sql字符串的数据叫做元数据
数据库元数据 DatabaseMetaData
参数元数据 ParameterMetaData
结果集元数据 ResultSetMetaData
JSP+JAVABean
jsp里面要直接写java代码(<%%>),维护起来比较麻烦,并且jsp的页面代码也比较臃肿。
JSP+JAVABean+Servlet(MVC模式)
M:model 模型层---封装根据JAVA Bean java类 EJB
V:view 视图层---jsp用于显示
C:controller 控制层---Servlet接收页面,找模型层处理,然后响应数据出去
1 | package util; |
增删查改的方法:
1 | //针对增加、删除、修改 |
步骤分析
1 | //1.使用两种数据池中其中一种的C3P0开源数据池---通过对象去获取数据池 |
完整代码如下:
1 | package dbutils; |
1. ResultSetHandler
1 | //3.查询单条 查询到的数据还是由那个result里面,然后调用下面的handle方法(手动封装) |
2. BeanHandler
1 |
|
** BeanListHandler
1 | List<Account> list=qu.query("select * from account",new <AcBeanListHandlercount>(Account.class)); //Account.class可以自己封装---类的字节码获取类的实例 |
具体实现代码框架(红色√):
第一部分:要用C3P0数据池必须要配置xml文件:
1 | <?xml version="1.0" encoding="UTF-8"?> |
第二部分:具体实现的TestDBUtils类:
1 | package dbutils; |
第三部分:要生成和存取的Account类:
1 | package demain; |
结果展示:
1.数据库的连接对象创建工作,比较消耗性能。
2.一开始现在内存中开辟一块空间(集合) , 一开先往池子里面放置 多个连接对象。 后面需要连接的话,直接从池子里面去。不要去自己创建连接了。 使用完毕,要记得归还连接。确保连接对象能循环利用。
使用单元Junit测试
首先导入之前写好的JDBCUtil类和外部文件jdbc.properties还有jar文件。
新建一个MyDataSource类:
需要继承DataSource类–实现所有方法(我们只需要完成getConnection()方法)–只需要管连接池对外公布的获取连接的方法getConnection()。
2.1 建立MyDataSource方法:先往池子里面放10个连接(建立list集合存放),使用JDBCUtil.getConn()去获取连接,通过循环和add方法连续添加10个连接。
2.2 在连接池对外公布的获取连接的方法中去通过remove移除(取连接)
2.3 最后写一个方法addBack():用完之后归还。
如果现在链接不够的话,就要在取之前判断是否为0,如果不够就要for循环继续add()。
在项目处右键–构建路径–右边选Add Library–添加Junit4选项
新建测试的TestPool类:
5.1 需要建立MyDataSource对象然后调用getConnection()连接
5.2 写sql语句 –MyDataSource对象调用prepareStatement去检测SQL语句
5.3 检测sql语句之后调用对应的executeUpdate()语句
5.4 finally里面要写关于sql操作之后关闭对象–还需要通过对象调用addBack()方法
JDBCUtil类代码:
1 | package util; |
jdbc.properties代码(只需要更改数据库的名字)
1 | driverClass=com.mysql.jdbc.Driver |
MyDataSource(实现DataSource类)代码
1 | package util; |
测试JUnit的TestPool代码
1 | package util; |
单元测试只是显示绿色/红色不通过—具体结果去看看数据库:
因为sun公司针对数据库连接池的定义没有用完返回的解决方案—->需要额外记住写addBack()方法
单例
不能面向接口编程
1 | //面向对象编程 |
修改接口中的那个close方法
原来的Connection对象的close方法,是真的关闭连接。
打算修改这个close方法,以后在调用close,并不是真的关闭,而是归还连接对象。
原有的方法逻辑,不是我们想要的。 想修改自己的逻辑
直接改源码—-无法实现。
继承—-必须得知道这个接口具体实现是谁。
使用装饰者模式(扩展一个类去更改方法)
先是一个接口Waiter里面有service()方法,最后有一个Waitress类实现刚才的接口输出方法内容,但是现在可以通过建立WaitressWrap()方法去用构造方法获取接口对象,this获取对象,然后通过实现接口方法更改以前的操作。
我们新建ConnectionWrap类实现Connection接口的方法,但是只需要去更改close()和prepareStatement()方法。
1.只展示实现类ConnectionWrap类部分代码:
1 | public class ConnectionWrap implements Connection{ //继承Connnection方法 修改它的close更改为 返回连接 |
2.在MyDataSource类里面在取连接之前对connection对象进行调用COnnectionWrap类包装,
1 | //抛出前,对对象进行包装 |
3.在测试类之中以后就不用写归还的方法,而是直接写JDBCUtil的方法:
1 | //归还连接 |
###1. 导入对应的dbcp和pool的jar文件:
###2.1 不使用配置文件( BasicDataSource类):
思路:
1 | 1.通过BasicDataSource类构件数据源对象 |
完整代码如下:
1 | package kaiyuan; |
###2.2 使用配置文件( BasicDataSourceFactory类):
思路:
1 | 1.通过BasicDataSourceFactory类构件数据源对象 |
完整代码如下:
1 | package kaiyuan; |
dbcpconfig.properties配置文件(放在src下面设置好连接池的连接初始化/最大数等等):
1 | #连接设置 |
###1. 导入对应的c3p0-0.9.1.2.jar文件:
###2.1 不使用配置文件方式(ComboPooledDataSource类)
思路:
1 | 和DBCP数据池的不实用配置文件方式一样,只不过一个是BasicDataSource类、另外一个是ComboPooledDataSource类 |
完整代码如下:
1 | Connection conn = null; |
###2.2 使用配置文件方式(ComboPooledDataSource)
思路:
1 | 1.需要导入c3p0-config.xml解析文件(名字不能更改!!!!) |
c3p0-config.xml文件:
1 | <?xml version="1.0" encoding="UTF-8"?> |
完整代码如下:
1 | package kaiyuaner; |