一、简介
servlet是一段服务器程序,它是客户端和服务端的 中间层。可以通过servlet往页面动态展示当前时间,可以从客户端接受数据存到数据库,或者从数据库取数据到页面展示给客户。
二、应用程序的体系结构
1、C/S(Client/Server)
特点:1必须安装特定软件;
2维护升级麻烦;
2、B/S(Browser/Server)
特点:1不需要安装特定软件
2维护升级相对简单
3使用的是http协议,方便和internet整合
三、
(1)实现servlet接口 必须实现接口所有方法
(2)继承GenericServlert 必须实现service抽象方法,(和协议无关)
(3)继承HttpServlet 通常覆盖和http协议相关的service方法 (注意必须在JavaProject导入servlet-api.jar)
四、请求servlet方式
1地址栏请求2超链接请求3表单请求
五、servlet生命周期
调用的方法 调用时间 调用次数
实例化 构造方法 第1次请求 1
初始化 init 构造之后,接着调用 1
服务 service client请求到达 N
销毁 destroy server停止 1
特殊情况:
当在<servlet>中定义了<load-on-startup>时,实例化和初始化阶段 会被提前到tomcat启动时进行。
1)load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法)。
2)它的值必须是一个整数,表示servlet应该被载入的顺序
2)当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;
3)当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载。
4)正数的值越小,该servlet的优先级越高,应用启动时就越先加载。
5)当值相同时,容器就会自己选择顺序来加载。
所以,<load-on-startup>x</load-on-startup>,中x的取值1,2,3,4,5代表的是优先级,而非启动延迟时间。
六如果定义了成员变量servlet不安全(一个用户一个线程一个servlet对象,多个用户多个线程,多个servlet对象,共享成员变量,),不定义则安全。
七redirect和forward
1forward:
// 1 获取client数据
// 2 调用业务类的方法,实现“XXX”功能
// 3 根据结果,跳转
RequestDispatcher rd = request.getRequestDispatcher(“/url-pattern”);
rd.forward(request, response);
--传递数据
// 往request中设置命名属性(在ActionServlet中)
request.setAttribute(“name”, obj);
// 从request中获取命名属性(在ViewServlet中)
Object obj = request.getAttribute(“name”);
2redirect
1) 传递数据
response.sendRedirect(“/web应用名/url-pattern?xx=111”);
3区别
Forward: 服务器内部的转 共享同一个request 地址栏不变 响应的永久转 只能转站内
重定向:client的跳转 不共享request f 地址栏改变 响应永久转 可以转站外
使用场景区分:
需要往后传递数据 ,必须使用 forward;
除此以外 重定向优先!!!
八session和cookies
会话跟踪技术: 用于解决 http协议的无状态。
一、Cookie
Cookie,是 server 往 client 写的一小段文本信息,由2部分构成:name 和 value。
1、server往client写cookie
Cookie c = new Cookie(“name”, ”tom”);
c.setMaxAge(n); // 设置cookie的有效时间(秒)
n>0 // n秒后cookie失效
n=0 // 删除当前cookie
n<0 // cookie的有效期 和 浏览器绑定,IE关 则cookie失效
response.addCookie(c);
2、读取client的cookie
Cookie[] cs = request.getCookies(); // 没有cookie 返回null
二、Session【重点】
会话,同1个client 和 server 建立起连接后的 多次请求/响应 过程。
HttpSession session = request.getSession(true);
True: 如果当前client没有session 则创建;有session 则直接使用。
False: 则返回null;有 则直接使用。
1、作用域范围
开始:client第1次请求server 并且遇到getSession(true)时
结束:超时、调用invalidate()方法。
使用:session.setAttribute(“name”, obj); //设置命名属性
obj = session.getAttribute(“name”); // 获取命名属性
session.removeAttribute(“name”); // 删除命名属性
2、Session的特点
1) session 和 client浏览器(同1机器上 打开的同类 产品) 一一对应;
2) Session 比 request 作用范围大。
4、设置session的失效时间
session.setMaxInactiveInterval(秒); // 设置当前session的失效时间为指定的秒
在web.xml中进行配置(整个项目中的session)
<!-- 设置session的失效时间,分钟 -->
<session-config>
<session-timeout>10</session-timeout>
</session-config>
5、底层实现
Session 的实现 底层使用了 cookie!
Client第1次请求server,server接收请求 检查当前client是否有对应的session,如果没有 则为该client创建对应的session对象(唯一的ID-32位的16进制数),处理完请求响应回client时,把当前sessionID以cookie(JSESSIONID-xxxxx 有效期为负数)的形式 存入client。
以后次请求,client会先读取本地的cookie(名称是JSESSIONID的) 获取到SESSIONID ,和请求信息一起 到达server,server接到请求,根据client请求中的sessionID在内存中检查是否有ID相同的session,如果有 代表是当前client对应的session。
如果cookie被禁用,JAVAEE中可以使用 response.encodeURL(“网址”)进网址进行编码,如果检查到cookie被禁用,则在原网址后;jseessionid=xxxxx实现会话跟踪。
三、ServletContext接口
1、是web.xml在内存中的表现。
演示读取全局初始化参数:
1) web.xml 配置全局初始化参数
<!-- 配置全局初始化参数 -->
<context-param>
<param-name>name</param-name>
<param-value>tom</param-value>
</context-param>
2) 使用ServletContext获取全局初始化参数
ServletContext ctx = super.getServletContext();
String val = ctx.getInitParameter("name");
2、作用域范围
开始:server启动
结束:server停止
使用:ctx.setAttribute(“name”, obj);
obj = ctx.getAttribute(“name”);
ctx.removeAttribute(“name”);
小结Servlet中的三个作用域对象:
request:
开始:client发出请求开发
结束:响应结果回到client结束
session
开始:client第1次请求 遇到getSession(true)
结束:超时、手动销毁(调用invalidate)
ServletContext
不同的client 共享数据时。