- servlet的生命周期
1.加载和实例化:当Servlet容器启动或客户端发送一个请求时,Servlet容器会查找内存中是否存在该Servlet实例,若存在,则直接读取该实例响应请求;如果不存在,就创建一个Servlet实例。
2.init() 初始化servlet 只会执行一次load-on-startup 默认-1 意思是第一次被访问时创建
3.service() 服务 每当客户端请求一个HttpServlet对象时,该对象的service()就会调用一次
4.destory() 销毁 在servlet被销毁前执行只会执行一次
2、servlet的三大域对象
request 每次请求都会创建一个request,作用域仅在当前请求中有效
session 每次会话都会创建一个session对象,作用域是当前会话中默认存在时间是30min.
Application (ServletContext)服务器创建时存在 作用域是整个服务器
3.request和respond的所有方法
request.getParameter(arg0) 取得参数
request.setAttribute(arg0, arg1) 在request域中设置值
request.removeAttribute(arg0) 从request域中移除值
request.getMethod() 取得请求方式 值为GET/POST
request.getContextPath() 动态取得当前项目的 /项目名 重定向要用到
request.getRequestURI() 当前servlet的访问的使用路径
request.getRemoteAddr() 取得ip地址
request.getServletPath() 取得访问servlet的路径
request.getCookies() 取得浏览器访问时携带的所有cookie对象
request.setCharacterEncoding(arg0) 设置参数的字符编码
request.getSession() 创建/取得 一个session对象
request.getParameterValues(arg0)
response.addCookie(arg0);为浏览器响应回一个cookie对象
response.addHeader(arg0, arg1); 添加响应头信息
response.setHeader(arg0, arg1); 设置响应头信息
response.getWriter() 返回响应流对象PrintWriter out
response.sendRedirect(arg0);重定向
response.setContentType(arg0); 设置响应流的字符编码
4.实现Servlet接口的三种方法
1、Servlet接口SUN公司定义了两个默认实现类,分别为:GenericServlet、HttpServlet。
2、HttpServlet指能够处理HTTP请求的servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。
3、HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。因此,开发人员在编写Servlet时,通常只需要覆写doGet或doPost方法,而不要去覆写service方法。
5. 八大监听器
(1)ServletContextListener:Servlet的上下文监听,它主要实现监听ServletContext的创建和删除。该接口提供了两种方法
1.contextInitialized(ServletContextEvent event);通知正在收听的对象,应用程序已经被加载和
2.contextDestroyed(ServletCotextEvent event);通知正在收听的对象,应用程序已经被载出,即关闭。
(2)ServletAttributeListener:主要实现监听ServletContext属性的增加,删除和修改。该接口提供了一下3个方法
1.attributeAdded(ServletContextAttributeEvent event);当有对象加入Application的范围时,通知正在收听的对象
2.attributeReplaced(ServletContextAttributeEvent event);当在application的范围有对象取代另一个对象的时,通知正在收听的对象
3.attributeRemoved(ServletContextAttributeEvent event);当有对象从application的范围移除时,通知正在收听的对象
(3)HttpSessionListener; HTTP会话监听,该接口实现监听HTTP会话创建、销毁。该接口提供了一下两种方法
1.sessionCreated(HttpSessionEvent event):通知正在收听的对象,session已经被加载及初始化
2. sessionDestoryed(HttpSessionEvent event):通知正在收听的对象,session已经被载出(HttpSessionEvent类的主要方法是getSession(),可以使用该方法回传一个session对象)
(4)HttpSessionActivationListener:该接口实现监听HTTP会话active和passivate。 该接口提供了一下3个方法
1.attributeAdded(HttpSessionBindingEvent event);当有对象加入session的范围时,通知正在收听的对象
2.attributeReplaced(HttpSessionBindingEvent event);当在session的范围有对象取代另一个对象时,通知正在收听的对象。
3.attributeRemoved(HttpSessionBindingEvent event);当有对象从session的范围有对象取代另一个对象时,通知正在收听的对象 其中HttpSessionBindingEvent类主要有三个方法:getName()、getSession()和getValue()
(5)HttpBindingListener:接口实现监听HTTP会话中对象的绑定信息。它是唯一不需要在web.xml中设定Listener的。该接口提供了以下2个方法
1.valueBound(HttpSessionBindingEvent event);当有对象加入session的范围时会被自动调用
2.valueUnBound(HttpSessionBindingEvent event);当有对象从session的范围内移除时会被自动调用
(6)HttpSessionAttributeListener; 该接口实现监听HTTP会话中属性的设置请求。该接口提供了以下两个方法。
1.sessionDidActivate(HttpSessionEvent event);通知正在收听的对象,它的session已经变为有效状态。
2.sessionWillPassivate(HttpSessionEvent event);通知正在收听的对象,它的session已经变为无效状态
(7)ServletRequestListener;该接口提供了以下两个方法。
1.requestInitalized(ServletRequestEvent event):通知正在收听的对象,ServletRequest已经被加载及初始化
2.requestDestroyed(ServletRequestEvent event):通知正在收听的对象,ServletRequest已经被载出,即关闭
(8)ServletRequestAttributeListener:该接口提供了一下三种方法
1.attributeAdded(ServletRequestAttributeEvent event):当有对象加入request的范围时,通知正在收听的对象
2.attributeReplaced(ServletRequestAttributeEvent event); 当在request的范围内有对象取代两一个对象时,通知正在收听的对象
3.attributeRemoved(ServletRequestAttributeEvent event); 当有对象从request的范围移除时,通知正在收听的对象
6.jsp和servlet的区别有以下几点:
Jsp是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。
1、jsp经编译后就变成了Servlet。
2、jsp更擅长表现于页面显示,servlet更擅长于逻辑控制。
3、Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletResponse对象以及HttpServlet对象得到。
4、而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。
6、doGet和doPost方法的区别
1.GET提交的数据放在URL中,POST则不会。
2.GET回退浏览器无害,POST会再次提交请求
3.GET提交的数据大小有限制,POST没有
4.GET可以被保存为书签,POST不可以。这一点也能感受到。
5.GET能被缓存,POST不能
6.GET只允许ASCII字符,POST没有限制
7.GET会保存再浏览器历史记录中,POST不会。这点也能感受到。
7、转发和重定向的区别
forward转发是服务器行为 请求一次 地址栏不会发生改变,只能请求当前web服务器内的资源,数据不会发生丢失
redirect重定向是客户端行为,请求两次(不同的请求),地址栏发生改变,可以请求其他服务器内的资源,数据会发生丢失
8、jsp的四大域对象
从小到大分别是
1.PageContext 指定在当前页面传输数据,
2.Request 一次请求中(请求没有中断),可以转发
3.Session 一次会话中,默认session30min自动销毁
4.Application(ServletContext) 整个web服务器
9.九大内置对象
request:请求对象,触发服务调用的请求。
response:服务响应对象,对请求的应答。
session:session会话对象,为请求的客户创建一个session对象。
application:从servlet配置对象中获得servlet上下文。
out:输出流对象。
pageContext:页面的上下文。
page:实现处理本页当前请求的类的实例。
config:配置对象。
exception:异常对象。
10.cookie与session的区别
1.cookie是客户端会话技术,数据存在客户端,session是服务器会话技术,数据存在web服务器上
2.cookie不安全,session安全
3.cookie保存的数据不能超过4kb,同一个服务器的cookie不能超过20个 session
4.cookie只能存储String类型,session可以存任意的Java类型
5.cookie用于在不登陆的情况下对用户的身份识别,session依赖于cookie在服务器端对用户身份识别
session创建流程
1.客户端请求session,在服务器端会创建一个新的session对象 ,并创建一个唯一标识 sessionid
2.服务器发送响应给客户端,响应头:Set-Cookie中携带着 sessionid
3.客户端下次发送请求时,请求头cookie会携带着sessionid发送给服务器.
4.服务器自动获取cookie信息并根据cookie中携带着的sessionid找与之对应的对象.
11、jdbc的执行流程
1.注册驱动
2.建立数据库连接
3.获取数据库操作对象
4.定义SQL
5.获取执行SQL对象,执行SQL
6.获取并处理结果集
7.关闭结果集,数据库操作对象,数据库连接对象
12、ArrayList和linkedlist的区别
ArrayList 底层是可变数组 查询快,增删慢
LinkedList 底层是双向链表 增删快,查询慢
13、map集合的遍历方式
1.通过map.keySet()获取键集合,然后根据map.get(key)获取值 ,可以使用迭代器和增强for遍历
2.通过map.entrySet()获取集合中每一个entry对象,然后变量Set集合取出每一个entry对象的键 entry.getKey()和值entryValue()
14、面向对象的特征
封装:利用数据及数据类型将实现细节封装成类或者方法,对外提供公共访问的方式
继承:是实现类的共性抽取.
多态:一个对象的多种形态,编译类型与运行时类型
15、接口和抽象类的区别
1.接口中的方法修饰符只能是public,抽象类中可以使用public,protected,default修饰
2.接口允许多重继承,抽象类不允许
3.接口不能有私有方法和私有变量,抽象类可以有私有方法和私有变量
4.接口中所有的方法都是抽象的,抽象类中可以包含普通方法
5.接口中不能定义构造器,抽象类中可以定义构造器用于子类完成抽象类的初始化
16、异常的分类
异常分为两大类 Error Exception
Error是程序无法处理的错误,JVM出现的问题
Exception分为运行时异常和编译期异常
17、重写和重载的区别
重写出现的前提是继承 子类存在和父类同名的方法,参数列表和返回值相同
重载一个类中出现多个同名方法,但是参数列表和返回值不同
18、创建多线程的实现方式,以及如何实现
1.继承Thread类,重写run()方法,调用start()方法
2.实现Runnable接口,重写run()方法,调用start()方法
3.线程池创建 (ExecutorService)
4.实现Callable接口,然后重写call()方法 //进阶知识点
19、线程的生命周期五种状态
1.新建 new Thread,new关键字
2.就绪runnable,调用start()、yield()
3.运行running调用run()方法
4.死亡 dead,run()、call()、stop()方法结束后
5.阻塞 block,sleep()、notify()、suspend()
20、wait和sleep的区别
wait()是Object类的方法,sleep()是Thread类的方法
sleep()没有释放锁,而wait()释放了锁,使得其他线程可以使用同步控制块或者方法
wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep()可以在任何地方使用
21、反射的三种实现方式
1.Object类的getClass();
2.对象名.class
3.Class.forName("");
22、事务的特性以及隔离级别事务有四大特性
1.原子性:每个事务都是一个整体不可拆分
2.一致性:事务在执行前与执行后数据的状态一致
3.隔离性:事务之间互不影响
4.持久性:事务执行成功,对数据库的数据的修改就是永久性的.
隔离级别:
read uncommitted:读未提交
产生的问题:脏读、不可重复读、幻读
read committed:读已提交 (Oracle)
产生的问题:不可重复读、幻读
repeatable read:可重复读 (MySQL默认)
产生的问题:幻读
serializable:串行化
可以解决所有的问题
脏读: 一个事务读取到了另一个事务中尚未提交的数据
虚读(不可重复读):一个事务中两次读取的数据内容不一致, 这是事务 update 时引发的问题
幻读: 一个事务中两次读取的数据的数量不一致,这是 insert或 delete 时引发的问题
23、三大范式
1NF : 每一列都是不可分割的原子数据项,表中的每一列都不可拆分.
2NF: 简单记 在1NF的基础上,不产生局部依赖, 就是表中的每一个字段都完全依赖于主键.
3NF: 在2NF的基础上,不产生传递依赖,表中所有的列不依赖与其他非主键的列.