Servlet——了解Java Servlet技术

来源:互联网 发布:求职简历邮件正文知乎 编辑:程序博客网 时间:2024/05/17 21:47

Servlet——了解Java Servlet技术

什么是Servlet

Servlet是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。
Servlet必须部署在Java servlet容器才能使用

Servlet框架

很多开发者都使用Java Server Pages(JSP)和Java Server Faces(JSF)等Servlet框架,但是这些技术都要在幕后通过Servlet容器把页面编译为Java Servlet

先有Servlet然后才有Jsp

Servlet是服务器上的一段小程序,一个servlet就是一个Java类,可以通过“请求——响应”编程方式访问驻在这个服务器上的servlet程序

编写动态的Servlet响应内容

Java Servlets如此有用的原因之一是Servlet能动态显示网页内容。这些内容可以从服务器本身、另外一个网站、或者许多其他网络可以访问的资源里获取。Servlet不是静态网页,它们是动态的。可以说这是它们最大的优势。

Tomcat容器等级

Tomcat分为四个容器等级,Servlet的容器管理Context容器,一个context对应一个web工程
Tomcat -> container -> enginer -> Host -> context -> wrapper
他们之间是层层包裹下去的

Servlet编写

继承关系图:
* Servlet(三个方法 init、service、destroy) interface
* genericServlet (与协议无关的servlet) abs class
* httpServlet 实现了http协议的servlet abs class
* 自定义servlet 重写doGet doPost

编写步骤

  1. 继承HttpServlet
  2. 重写doGet doPost
  3. web.xml注册servlet
<servlet><servlet-name></servlet-name><servlet-class></servlet-class></servlet><servlet-mapping><servlet-name></servlet-name> //和上面的name一样对应<url-pattern>/</url-pattern> //一个斜杠/代表的是当前web站点的根目录,这里配置对应的访问url</servlet-mapping>

servlet执行顺序

发出一个url请求后
在web.xml找到与之对应的url地址<url-pattern>/</url-pattern>
找到对应的name<servlet-name></servlet-name>
最后找到class来处理
找到处理类,根据提交方式get post执行doXXX

生命周期

当servlet被部署到应用服务器中后,由服务器控制Servlet的生命周期。Servlet生命周期包含四个阶段:加载和实例化–>初始化–>请求处理(服务)–>终止服务(销毁)。

初始化前判断是否存在servlet实例,如果不存在,进行构造方法生成实例,生成servlet实例,如果存在进入2阶段执行service
1. 初始化阶段——调用init() 方法
2. 响应客户端请求阶段——调用service方法,service根据请求方式决定执行doXXX
3. 销毁阶段——调用destroy方法,服务器停止或者结束服务的时候

生命周期的详细过程

Servlet生命周期的三个核心方法分别是 init() , service() 和 destroy()。每个Servlet都会实现这些方法,并且在特定的运行时间调用它们。

加载和实例化

一般情况下,Servlet只会在第一次请求到达后,才会被加载和实例化。除非特别配置了启动时加载(配置了load-on-startup),Servlet才会在应用启动时加载和实例化。在Servlet加载和实例化之前,有两个类先实例化:* ServletContext(Servlet上下文)——全局变量* Filter(过滤器)——filter chain

在Servlet生命周期的初始化阶段

  • 时机:一般情况下,Servlet只会在第一次请求到达后,才会被初始化。
  • web容器通过调用init()方法来初始化Servlet实例,并且可以传递一个实现 javax.servlet.ServletConfig 接口的对象给它。这个配置对象(configuration object)使Servlet能够读取在web应用的web.xml文件里定义的名值(name-value)初始参数。这个方法在Servlet实例的生命周期里只调用一次。

初始化后,Servlet实例就可以处理客户端请求了

  • 处理方法在service方法中根据HTTP请求的Method分派到相应的doGet、doPost等方法
    web容器调用Servlet的service()方法来处理每一个请求。service() 方法定义了能够处理的请求类型并且调用适当方法来处理这些请求。编写Servlet的开发者必须为这些方法提供实现,
    如果发出一个Servlet没实现的请求,那么父类的方法就会被调用并且通常会给请求方(requester)返回一个错误信息。
    通常我们不重写service
  • 会话管理
    会话管理也是类似的方式:
    方法a,是协议本身支持状态,让协议去记住每一个会话,但显然http不可能是这么强大。
    方法b,是让客户端保持状态。
    方法c,则是在服务端保持状态.
    • 使用cookie,即让客户端保持状态。
      Cookie是指网站为了辨别用户身份而储存在用户本地终端的数据。整个流程携带信息请求。
      使用cookie操作方便,使用简单。但缺点也是很明显的:数据保存在客户端,必须要对数据进行加密/签名;cookie大小有限制,对复杂数据是不够的。
    • session机制,即在服务端保持状态。
      当一个请求到达时,服务器先检查请求中是否包含了一个Session标识——称为SessionId。
      如果已包含SessionId,服务器就根据该SessionId将对应的Session检索出来。
      如果不包含SessionId,则为此客户端创建一个Session并且生成一个与该Session关联的SessionId。
      保存SessionId的方式可以采用Cookie 也可以采用URL重写

    一次请求的过程:
    将前面所说的内容串一下吧:当一个Servlet请求到达时,服务器会根据Filter的配置,为Servlet生成一条对应的Filter链。Filter链按顺序(配置中出现的顺序)执行,
    所有Filter执行完成后,执行Servlet的service方法。(不一定执行完全部filter,可能filter里面嵌套了 service的方法)
    Filter执行过程中,可以获取到请求、响应的实例,修改请求、响应的数据;也可以在Filter里做会话管理,判断客户端状态。
    而在Servlet中,service方法处理业务逻辑、通过ServletContext获取资源、设置共享属性,并生成显示内容。

最后,web容器调用destroy()方法来终结Servlet

如果你想在Servlet的生命周期内关闭或者销毁一些文件系统或者网络资源,你可以调用这个方法来实现。destroy() 方法和init()方法一样,在Servlet的生命周期里只能调用一次。

Tomcat容器装载servlet时刻

  • web.xml配置——启动时自动装在servlet实例
<servlet><loadon-startup>1<loadon-startup> //数字代表优先级,数字越小优先级越高</servlet>
  • 第一次request请求
  • servlet 类被修改更新

创建的servlet实例保存在内存中,init只被调用一次


关于servlet的用法

servlet和jsp的九大内置对象

  1. out —–> response.getwriter()
  2. request —–> service(request)
  3. response —–> service(response)
  4. session ——> request.getsession()
  5. application ——> getServletContext()
  6. exception —–> Throwable
  7. Page —–> this
  8. PageContext —–> PageContext
  9. Config —–> getServletConfig

servlet获取表单数据

获取多个复选按钮的值
requeset.getParamaterValues(“”)

servlet 的路径问题

url 超链接:
相对路径 第一斜线“/”表示的是根目录
绝对路径 request.getContextPath项目根目录
<url-pattern> 中斜线开头 表示项目的根目录

@WebServlet注解来开发Servlet

使用 @WebServlet 注解并且不需要在web.xml里为Servlet注册任何信息。容器会自动注册你的Servlet到运行环境,并且像往常一样处理它。

@WebServlet(name = "MyFirstServlet", urlPatterns = {"/MyFirstServlet"})public class MyFirstServlet extends HttpServlet {}

处理Servlet请求和响应

为了获取请求参数,需要调用 HttpServletRequest 对象的 getParameter() 方法,并且传递你要获取的输入参数的id给该方法。
使用 HttpServletResponse 对象给客户端发送响应。

传递Servlet初始化参数

可以在代码里调用 getServletConfig.getInitializationParameter() 并传递参数名给该方法来使用参数
String value = getServletConfig().getInitParameter(“name”);

为特定的URL请求添加Servlet过滤器

过滤器必须要实现 javax.servlet.Filter 接口。
这个接口包含了init(),descriptor()和doFilter()这些方法。init()和destroy()方法会被容器调用。 doFilter()方法用来在过滤器类里实现逻辑任务。
如果你想把过滤器组成过滤链(chain filter)或者存在多匹配给定URL模式的个过滤器,它们就会根据web.xml里的配置顺序被调用。
在web.xml里配置过滤器,需要使用和 XML元素以及相关的子元素标签。

    <filter>        <filter-name>LoggingFilter</filter-name>        <filter-class>LoggingFilter</filter-class>    </filter>    <filter-mapping>        <filter-name>LogingFilter</filter-name>        <url-pattern>/*</url-pattern>    </filter-mapping>

使用注解来为特定的servlet配置过滤器,你可以使用@WebFilter注解。

使用Servlet读写Cookie

很多应用都想在客户端机器里保存用户当前的浏览历史。目的是当用户再次使用应用时,他能够从上次离开的地方开始浏览。为了实现这个需求,通常使用cookies。你可以把它看作是保存在客户端机器里的键值对基本数据。当使用浏览器打开应用时,应用可以对这些数据进行读写。

为了创建cookie,需要实例化一个新的 javax.servlet.http.Cookie 对象并且为它分配名称和值。实例化cookie后,可以设置属性来配置cookie。在这个例子里,我们使用 setMaxAge() 和 setHttpOnly() 方法来设置cookie的生命周期和防范客户端脚本。

从Servlet3.0 API开始,已经可以把cookie标记为HTTP only了。这使cookie可以防范客户端脚本的攻击,使cookie更加安全。

Cookie cookie = new Cookie("sessionId","123456789");cookie.setHttpOnly(true);cookie.setMaxAge(-30);response.addCookie(cookie);

谢谢。
参考学习