Servlet生命周期
1.容器收到请求后创建对应的servlet的实例对象
也可以指定servlet在服务器启动时加载
只需要在web.xml部署文件对应的servlet里面添加<load-on-startup>标签
它的值必须是一个整数,当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet
正数的值越小,该servlet的优先级越高,应用启动时就越先加载。
2.servlet通过调用init()方法进行初始化
init()方法只调用一次,在后续每次用户请求时不再调用。
3.servlet调用service处理客户端请求
4.servlet调用destroy方法结束
destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。
最后垃圾回收器进行垃圾回收
重定向:
当前请求处理完毕,让浏览器重写发送一个请求到对应的servlet
request.sendRedirect("url");//jsp或者servlet
转发:
把当前客户端请求转交给另外一个servlet处理
request.setAttribute("name",Object);//绑定数据
处理转发的servlet可通过request.getAttribute("name")获取数据
RequestDispatcher rd = request.getRequestDispatcher("url");//获取转发器
rd.forward(request,response);//执行转发
Cookie
服务端发送给浏览器的少量数据,大约4KB左右
Cookie cookie = new Cookie("name","value");//创建Cookie
cookie.setMaxAge(60*60*24);//指定 cookie 能够保持有效的时间(以秒为单位)
不设置的话,默认为存储在内存,浏览器关闭则清除
response.addCookie(cookie);//添加 HTTP 响应头中的 Cookie
Cookie[] cookies = request.getCookies();//获取Cookie 对象的数组
Cookie只能存放合法的ascii字符,对于中文,需要将其转换成合法的ascii字符的形式。
在添加cookie时,使用encode方法来编码
String URLEncoder.encode(String str,String charset);
在读取cookie时,使用decode方法来解码
String URLDecoder.decode(String str,String charset);
建议,在添加cookie时,不管是否是中文,都统一使用encode方法 来处理。
Cookie的路径问题:
浏览器在向服务器发送请求时,会比较请求地址是否符合cookie的路径要求,只有符合要求的cookie才会被发送。
符合要求:请求地址要么等于Cookie的路径,要么是其子路径。
Cookie的默认路径等于添加该Cookie的web组件的路径,比如:/TestServlet/demo/Login.jsp内添加了一个Cookie,则该Cookie的默认路径就是:"/TestServlet/demo"
修改Cookie的默认路径:cookie.setPath(String path);
Session(会话)
服务器为了保存用户状态而创建的一个特殊对象,该对象一般称之为session对象。
该对象有一个唯一的id,一般称之为sessionId。
服务器会将sessionId以Cookie形式发送给浏览器。
当浏览器再次访问服务器是会将sessionId发送过来,服务器就可以利用sessionId找到对应的session对象。
获取Session对象:
HttpSession session = request.getSession();
服务器先查看请求当中是否有sessionId,如果没有,则创建一个session对象;如果有,则依据该sessionId去查找对应的session对象,如果找到了,则返回该session对象,如果没有找到,则创建一个新的session对象。
HttpSession session = request.getSession(false);
服务器先查看请求当中是否有sessionId,如果没有,则返回null;如果有,则依据该sessionId去查找对应的session对象,如果找到了,则返回该session对象,如果没有找到,则返回null。
使用session进行状态管理:
session.setAttribute("name",obj);//将数据绑定到session对象上。
obj = session.getAttribute("name");//依据绑定名获取绑定值,没有返回null。
session.removeAttribute("name");//接触绑定。
Session超时:服务器会把空闲时间过长的session对象从内存中删除,一般默认30分钟
修改Session的超时时间长度:session.setMaxInactiveInterval(int seconds);//单位:秒
删除Session:session.invalidate();
优点:安全、支持更多的数据类型、可存放的数据量更大。
缺点:session会占用服务器端的内存空间,如果用户量大,会严重 影响系统性能(cookie不会占用服务器端的内存空间)。
Servlet上下文
容器启动之后,会为每一个web应用创建唯一的一个符合ServletContext 接口要求的对象,该对象一般称之为Servlet上下文。
一个web应用对应一个Servlet上下文。
ServletContext中的属性的生命周期从创建开始,到服务器关闭结束。
2)如何获得Servlet上下文?
GenericServlet、ServletConfig、HttpSession及FilterConfig都提供了一个方法(getServletContext)来获得上下文。
绑定到Servlet上下文中的数据所有用户都能访问到。
添加属性:setAttribute(String name, Object obj);
得到值:getAttribute(String name),这个方法返回Object
删除属性:removeAttribute(String name)
<!--配置全局参数-->
<context-param>
<param-name>name</param-name>
<param-value>tom</param-value>
</context-param>
String getInitParameter("name"); //获取全局参数