servlet

目录

含义和作用

生命周期

架构和类关系

ServletContext

web.xml 注册servlet

Servlet 过滤器

Servlet 异常处理

Servlet cookie和session

转发和重定向

含义和作用

含义

servlet是SUN公司早期用于开发动态web的一门技术。

servlet是SUN提供的一个接口,要开发一个servlet程序只需要两步:1.编写类来实现servlet、2.部署到web服务器中。

servlet是Web 浏览器或其他 HTTP 客户端的请求和 服务器上的数据库或应用程序之间的中间层。

作用

1. 接受用户的请求数据【显示数据--表单数据、隐式数据--cookies】

2. 将数据返回给请求端【多种数据格式--本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等】

生命周期

初始化--调用--销毁--被回收

初始化后调用inti() + servlet调用service()+ 销毁前调用destroy()

init() 方法

init 在Servlet 第一次创建时被调用,后续每次用户请求不再调用。

Servlet 在第一次被调用时创建,但也可以指定 Servlet 在服务器第一次启动时被加载。

service() 方法

service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。

每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。

service() 方法由容器调用,service 方法在适当的时候调用 doGet、doPost、doPut、doDelete 等方法。所以,您不用对 service() 方法做任何动作,您只需要根据来自客户端的请求类型来重写 doGet() 或 doPost() 即可。

doGet() 和 doPost() 特征:

GET 默认请求方式,或者来自未指定 method 的 HTML 表单,它由 doGet() 方法处理。

POST 请求来自于一个指定了 method 为 POST 的 HTML 表单,它由 doPost() 方法处理

destroy() 方法

destroy() 方法只会被调用一次。

在 Servlet 生命周期结束时被调用。

destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。

在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收。

架构和类关系

架构

 类关系

ServletContext

实现不同servlet数据共享,获取初始化参数

在自己的servlet中有this点出所有方法

ServletContext servletContext = this.getServletContext();
servletContext.setAttribute("userName","kaka");

 

web.xml 注册servlet

<web-app>      
    <servlet>
        <servlet-name>HelloWorld</servlet-name>
        <servlet-class>HelloWorld</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>HelloWorld</servlet-name>
        <url-pattern>/HelloWorld</url-pattern>
    </servlet-mapping>
</web-app>

Servlet 过滤器

  • 拦截请求,在客户端的请求访问后端资源之前
  • 处理响应,在服务器的响应发送回客户端之前

过滤器web.xml中XML 标签来声明,然后映射到相应的 Servlet 名称或 URL 模式。

当 Web 容器启动 Web 应用程序时,声明每一个过滤器开始实例化。

Filter的执行顺序与在web.xml配置文件中的配置顺序一致,一般把Filter配置在所有的Servlet之前

 

过滤器是一个实现了 javax.servlet.Filter 接口的 Java 类。javax.servlet.Filter 接口定义了三个方法: 初始化-过滤-销毁

public void init(FilterConfig filterConfig)
web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。

public void doFilter (ServletRequest, ServletResponse, FilterChain)
该方法完成实际的过滤操作,当客户端请求方法与过滤器设置匹配的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain用户访问后续过滤器。

public void destroy()
Servlet容器在销毁过滤器实例前调用该方法,在该方法中释放Servlet过滤器占用的资源。

Servlet 异常处理

当一个 Servlet 抛出一个异常时,Web 容器在使用了 exception-type 元素的 web.xml 中搜索与抛出异常类型相匹配的配置。

您必须在 web.xml 中使用 error-page 元素来指定对特定异常 或 HTTP 状态码 作出相应的 Servlet 调用

Servlet Cookie 和 session

HTTP 是一种"无状态"协议,这意味着每次客户端检索网页时,客户端打开一个单独的连接到 Web 服务器,服务器会自动不保留之前客户端请求的任何记录。因此需要以下方式:

cookie

一个 Web 服务器可以分配一个唯一的 session 会话 ID 作为每个 Web 客户端的 cookie,对于客户端的后续请求可以使用接收到的 cookie 来识别。

这可能不是一个有效的方法,因为很多浏览器不支持 cookie,所以我们建议不要使用这种方式来维持 session 会话。

三个步骤:

      • 服务器脚本向浏览器发送一组 Cookie。例如:姓名、年龄或识别号码等。
      • 浏览器将这些信息存储在本地计算机上,以备将来使用。
      • 当下一次浏览器向 Web 服务器发送任何请求时,浏览器会把这些 Cookie 信息发送到服务器,服务器将使用这些信息来识别用户。

通过 Servlet 设置 Cookie

Cookie cookie = new Cookie("key","value");
cookie.setMaxAge(60*60*24); //设置最大生存周期,指定 cookie 能够保持有效的时间(以秒为单位)
response.addCookie(cookie);//使用 response.addCookie 添加Cookie到HTTP响应头中的

 

3 通过 Servlet 读取 Cookie

要读取 Cookie,您需要通过调用 HttpServletRequest 的 getCookies( ) 方法创建一个 javax.servlet.http.Cookie 对象的数组。然后循环遍历数组,并使用 getName() 和 getValue() 方法来访问每个 cookie 和关联的值。

4 通过 Servlet 删除 Cookie

删除 Cookie 是非常简单的。如果您想删除一个 cookie,那么您只需要按照以下三个步骤进行:

      • 读取一个现有的 cookie,并把它存储在 Cookie 对象中。
      • 使用 setMaxAge() 方法设置 cookie 的年龄为零,来删除现有的 cookie。
      • 把这个 cookie 添加到响应头。

Session

创建Session

Servlet 提供了 HttpSession 接口。

该接口提供了一种 跨多个页面请求 或访问时识别用户+存储用户信息的方式。

调用 HttpServletRequest 的公共方法 getSession() 来获取 HttpSession 对象

HttpSession session = request.getSession();

 

删除 Session

      • 移除一个特定的属性:调用 public void removeAttribute(String name) 方法来删除与特定的键相关联的值。
      • 删除整个 session 会话:调用 public void invalidate() 方法来丢弃整个 session 会话。
      • 设置 session 会话过期时间:调用 public void setMaxInactiveInterval(int interval) 方法来单独设置 session 会话超时。
      • 注销用户:如果使用的是支持 servlet 2.4 的服务器,您可以调用 logout 来注销 Web 服务器的客户端,并把属于所有用户的所有 session 会话设置为无效。
      • web.xml 配置:如果您使用的是 Tomcat,除了上述方法,您还可以在 web.xml 文件中配置 session 会话超时,以分钟为单位,覆盖 Tomcat 中默认的 30 分钟超时时间
 <session-config>
    <session-timeout>15</session-timeout>
  </session-config>

注:在一个 Servlet 中的 getMaxInactiveInterval() 方法会返回 session 会话的超时时间,以秒为单位。所以,如果在 web.xml 中配置 session 会话超时时间为 15 分钟,那么 getMaxInactiveInterval() 会返回 900。

 

此外,也可以用以下方式:

隐藏的表单字段

一个 Web 服务器可以发送一个隐藏的 HTML 表单字段,以及一个唯一的 session 会话 ID,如下所示:

<input type="hidden" name="sessionid" value="12345">

该条目意味着,当表单被提交时,指定的名称和值会被自动包含在 GET 或 POST 数据中。每次当 Web 浏览器发送回请求时,session_id 值可以用于保持不同的 Web 浏览器的跟踪。

这可能是一种保持 session 会话跟踪的有效方式,但是点击常规的超文本链接(<A HREF...>)不会导致表单提交,因此隐藏的表单字段也不支持常规的 session 会话跟踪。

URL 重写

您可以在每个 URL 末尾追加一些额外的数据来标识 session 会话,服务器会把该 session 会话标识符与已存储的有关 session 会话的数据相关联。

例如,http://w3cschool.cc/file.htm;sessionid=12345,session 会话标识符被附加为 sessionid=12345,标识符可被 Web 服务器访问以识别客户端。

URL 重写是一种更好的维持 session 会话的方式,它在浏览器不支持 cookie 时能够很好地工作,但是它的缺点是会动态生成每个 URL 来为页面分配一个 session 会话 ID,即使是在很简单的静态 HTML 页面中也会如此。

 


转发与重定向

相同

都是实现页面跳转

区别

实现转发调用的是HttpServletRequest对象中的方法

实现重定向调用的是HttpServletResponse对象中的方法

 

转发时浏览器中的url地址不会发生改变

重定向时浏览器中的url地址会发生改变

 

转发时浏览器只请求一次服务器

重定向时浏览器请求两次服务器

 

转发能使用request带数据到跳转的页面

重定向能使用ServletContext带数据到跳转的页面

 

posted @ 2021-10-03 00:11  四叶笔记  阅读(61)  评论(0编辑  收藏  举报