首页 > 代码库 > servlet笔记整理

servlet笔记整理

一、简介

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 共享数据时。

servlet笔记整理