**
转发与重定向
**
1.转发:浏览器URL的地址栏不变。重定向:浏览器URL的地址栏改变;
2.转发是服务器行为,重定向是客户端行为
3.从数据共享来说:forward:转发页面和转发到的页面可以共享request里面的数据。redirect:不能共享数据
4.转发的性能要优于重定向
5.转发只能访问内部资源,重定向可以访问外部网站
6.转发是浏览器只做了一次访问请求。重定向是浏览器做了至少两次的访问请求
**
HashSet与TreeSet区别
**
HashSet是使用散列表进行存储,元素无序,元素允许为null。
TreeSet是使用树结构来进行存储,元素按字符串顺序排序存储,元素不允许为null。
**
sleep()和wait()区别
**
1.它们最大本质的区别是:sleep()不释放同步锁,wait()释放同步锁.
2.还有用法的上的不同是:sleep(milliseconds)可以用时间指定来使他自动醒过来,如果时间不到你只能调用interreput()来强行打断;wait()可以用notify()直接唤起.
3.sleep()是线程线程类(Thread)的方法,调用会暂停此线程指定的时间,但监控依然保持,不会释放对象锁,到时间自动恢复;wait()是Object的方法,调用会放弃对象锁,进入等待队列,待调用notify()/notifyAll()唤醒指定的线程或者所有线程,才会进入锁池,不再次获得对象锁才会进入运行状态;
4.sleep()方法可以在任何地方使用;wait()方法则只能在同步方法或同步块中使用
5.sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
注:每个对象都有一个锁来控制同步访问,Synchronized关键字可以和对象的锁交互,来实现同步方法或同步块。sleep()方法正在执行的线程主动让出CPU(然后CPU就可以去执行其他任务),在sleep指定时间后CPU再回到该线程继续往下执行(注意:sleep方法只让出了CPU,而并不会释放同步资源锁!!!);wait()方法则是指当前线程让自己暂时退让出同步资源锁,以便其他正在等待该资源的线程得到该资源进而运行,只有调用了notify()方法,之前调用wait()的线程才会解除wait状态,可以去参与竞争同步资源锁,进而得到执行。(注意:notify的作用相当于叫醒睡着的人,而并不会给他分配任务,就是说notify只是让之前调用wait的线程有权利重新参与线程的调度);
**
Statement、PreparedStatement和CallableStatement
**
1.Statement、PreparedStatement和CallableStatement都是接口(interface)。
2.Statement继承自Wrapper、PreparedStatement继承自Statement、CallableStatement继承自PreparedStatement。
3.
Statement接口提供了执行语句和获取结果的基本方法;
PreparedStatement接口添加了处理 IN 参数的方法;
CallableStatement接口添加了处理 OUT 参数的方法。
4.
a.Statement:
普通的不带参的查询SQL;支持批量更新,批量删除;
b.PreparedStatement:
可变参数的SQL,编译一次,执行多次,效率高;
安全性好,有效防止Sql注入等问题;
支持批量更新,批量删除;
c.CallableStatement:
继承自PreparedStatement,支持带参数的SQL操作;
支持调用存储过程,提供了对输出和输入/输出参数(INOUT)的支持;
Statement每次执行sql语句,数据库都要执行sql语句的编译 ,
最好用于仅执行一次查询并返回结果的情形,效率高于PreparedStatement。
PreparedStatement是预编译的,使用PreparedStatement有几个好处
- 在执行可变参数的一条SQL时,PreparedStatement比Statement的效率高,因为DBMS预编译一条SQL当然会比多次编译一条SQL的效率要高。
- 安全性好,有效防止Sql注入等问题。
- 对于多次重复执行的语句,使用PreparedStament效率会更高一点,并且在这种情况下也比较适合使用batch;
- 代码的可读性和可维护性。
**
过滤器得用法和作用
**
当客户端向服务器端发送一个请求时,如果有对应的过滤器进行拦截,过滤器可以改变请求的内容、或者重新设置请求协议的相关信息等,然后再将请求发送给服务器端的Servlet进行处理。当Servlet对客户端做出响应时,过滤器同样可以进行拦截,将响应内容进行修改或者重新设置后,再响应给客户端浏览器。在上述过程中,客户端与服务器端并不需要知道过滤器的存在。
数据库中 insert,delete,update注意事项
1.insert对应的方法返回值为插入数据库的条数(如果每次插入一条数据,每次就都是返回1)
2.update对应的方法返回值为匹配数据库的条数(不论最终是否对数据进行了修改,只要某条记录符合匹配条件,返回值就加1)
举例:sql语句为 update table_name set name=“li” where cid = 3.
假如数据库中有2条数据如下:
-
name:li cid=3
-
name:li cid=2
这两条数据都符合update匹配条件,但是第1条数据不需要修改,只是更改了第2条数据的name值,最终返回值依旧为2,因为根据
cid = 3找到了两条数据。
3.delete对应方法返回值为删除的数据条数,即删除i条数据,返回i。
小结:insert,delete,update都是默认返回int型