Servlet的使用和原理分析


servlet是运行在Web服务器中的小型Java程序,通常通过HTTP接受和响应来自客户端的请求。
servlet 通常运行在多线程服务器上,因此应该意识到 servlet 必须处理并发请求并小心地同步对共享资源的访问。共享资源包括内存数据(比如实例或类变量)和外部对象(比如文件、数据库连接和网络连接)。

Servlet相关接口、类

Servlet工作流程

Servlet生命周期
Web服务器接收到HTTP请求后将请求委托给Servlet容器,然后

  1. 加载Servlet类 ,当Servlet容器接收到servlet的第一个请求时,类加载器将加载servlet类
  2. 创建Servlet实例 ,加载后会创建一个servlet实例
  3. 调用init() ,只初始化一次servlet,生命周期开始
  4. 调用service()
  5. 调用destory() ,将servlet从容器中移除

Servlet容器处理请求

  1. 将请求与web.xml文件中的servlet进行映射
  2. 为请求创建请求和响应对象
  3. 调用线程上的service方法
  4. 公共service方法内部调用受保护的service方法
  5. 受保护的service方法根据请求的类型调用doGet方法
  6. doGet方法生成响应,并将其传递给客户端
  7. 发送响应后,Web容器将删除请求和响应对象。线程包含在线程池中或删除取决于服务器实现。

war文件

web.xml

欢迎文件优先级:指定文件->index.html->
加载优先级:context-param -> listener -> filter -> servlet ,同类型按mapping顺序进行调用。
加载过程如下

  1. 启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取和两个结点。
  2. 紧急着,容创建一个ServletContext(servlet上下文),这个web项目的所有部分都将共享这个上下文。
  3. 容器将转换为键值对,并交给servletContext。
  4. 容器创建中的类实例,创建监听器。

元素详解:
向ServletContext提供键值对(上下文信息),getServletContext().getInitParameter(“context/param”)可得到。
监听客户端请求、服务端操作,可自动激发一些操作。常用监听接口、类有。
将一个名字与一个实现javaxs.servlet.Filter接口的类相关联。
是的子元素,代表servlet。
是的子元素,表示servlet的名称。
是的子元素,表示servlet的类。
是的子元素。它用于映射servlet。
是的子元素。客户端使用此模式来调用servlet。
1可传递正值负值,servlet将在项目部署或服务器启动时加载。
其他元素
其他
Listener

Servlet协作

	RequestDispatcher接口接收来自客户端的请求并将它们发送到服务器上的任何资源(比如 servlet、HTML 文件或 JSP 文件)的对象。

	获取RequestDispatcher对象:调用ServletRequest接口的getRequestDispatcher()方法返回RequestDispatcher的对象,它充当位于给定路径上的资源的包装器。可以使用 RequestDispatcher 对象将请求转发到资源,或者在响应中包含资源。

使用:
1)forward(请求转发,由第二个资源给客户端响应)
2)include(在调用资源的响应中包含另一个资源的响应内容)

serialVersionUID

Servlet重定向

HttpServletResponse接口的sendRedirect()方法可以用于将响应重定向到另一个资源,资源可能是servlet,jsp或html文件。与forward()不同的是方法在客户端工作。response.sendRedirect("http://www.yiibai.com");

属性配置

ServletConfig 从web.xml文件获取配置信息传递给servlet,提供了初始化参数
获取:调用Servlet接口的getServletConfig()

<servlet>
    ......
    <init-param>  
      <param-name>parameter_name</param-name>
      <param-value>parameter_value</param-value>
    </init-param>

ServletContext配置信息
ServletContext对象由Web容器在部署一个项目时创建一个ServletContext对象,可用于从web.xml文件获取配置信息。
如果有信息要共享给多个servlet使用,最好在web.xml文件中使用元素提供它。

ServletContext的优点如果有任何信息要共享给所有的servlet使用,并且要让它容易维护,最好的办法就是在web.xml文件中提供这些信息,所以如果信息要更改直接在web.xml中修改,而不需要修改servlet代码。

ServletContext接口的使用

  • ServletContext对象提供容器和servlet之间的接口。
  • 使用ServletContext对象在web.xml文件获取配置信息。
  • ServletContext对象可用于设置,获取或删除web.xml文件中属性。
  • ServletContext对象可用于提供应用程序间通信。

获取对象:

  • 通过ServletConfig接口的getServletContext()方法返回ServletContext对象
  • 通过GenericServlet类的getServletContext()方法返回ServletContext对象
<web-app>  
 ......  
  <context-param>  
    <param-name>parameter_name</param-name>  
    <param-value>parameter_value</param-value>  
  </context-param>
 ...... 

属性设置
Servlet中有以下4种属性方法,它们具体如下:
public void setAttribute(String name,Object object)
在应用程序范围内设置给定的对象。

public Object getAttribute(String name)
返回指定名称的属性。

public Enumeration getInitParameterNames()
返回上下文的初始化参数的名称,转为String对象的枚举。

public void removeAttribute(String name)
从servlet上下文中删除具有给定名称的属性。

过滤器

过滤器在web.xml中被定义,在预加载或后加载时被调用对web资源进行拦截从而实现转换、日志记录、压缩、加解密、输入验证等过滤任务。

Filter

Filter开发

  1. 编写java类实现Filter接口,并实现其doFilter方法。
  2. 在 web.xml 文件中使用和元素对编写的filter类进行注册,并设置它所能拦截的资源。

过滤器API
Filter接口提供了生命周期方法(init、doFilter、destory)。
FilterChain接口负责调用链中下一个过滤器或资源(doFilter)。
FilterConfig对象由Web容器创建,可用于获取web.xml文件中的配置信息(init、getInitParameter、getInitParameterNames、getServletContext)。
过滤器配置
用于为过滤器指定一个名字,该元素的内容不能为空。
元素用于指定过滤器的完整的限定类名。
元素用于为过滤器指定初始化参数,它的子元素指定参数的名字,指定参数的值。
在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。
元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
子元素用于设置filter的注册名称。该值必须是在元素中声明过的过滤器的名字
设置 filter 所拦截的请求路径(过滤器关联的URL样式)
指定过滤器所拦截的Servlet名称。

会话跟踪

HTTP协议是无状态的,需要一种方式来维护用户状态,即会话跟踪。
常用技术:Cookies 隐藏表格域 网址重写 HttpSession
Cookies
Cookie是由Server产生在客户端维护用于唯一地标识客户端的一段信息,具有名称,单个值和一些属性如注释路径域限定符版本号等。
类型

  • 非持久性cookie,适用于单个对话,关闭浏览器即删除
  • 持久性Cookie,适用于多个对话,在用户注销时才被删除

javax.servlet.http.Cookie提供了Cookie功能,有以下方法
构造:

  • Cookie()
  • Cookie(String name,String value) 构造具有指定名称和值的cookie
    常用方法:setMaxAge() getValue() getName() setName() setValue()

使用

  • servlet 通过使用 HttpServletResponse#addCookie 方法将 cookie 发送到浏览器,该方法将字段添加到 HTTP 响应头,以便一次一个地将 cookie 发送到浏览器。
  • 浏览器通过向 HTTP 请求头添加字段将 cookie 返回给 servlet。可使用 HttpServletRequest#getCookies 方法从请求中获取 cookie

隐藏表格字段
在隐藏表单字段的情况下,一般使用隐藏(不可见)文本字段来维护用户的状态。在服务器维护,每个页面需要额外提交表单字段。

URL重写
在URL重写中,我们将令牌或标识符附加到下一个Servlet或下一个资源的URL。
当用户单击超链接时,参数名称/值对将被传递到服务器。 从Servlet中可以使用getParameter()方法获取指定参数的值。
在链接上工作,只限于文本,不需要额外提交表单。

HttpSession

HttpSession对象在容器中为每个用户创建会话ID。容器使用此标识来识别特定的用户。
HttpSession的一个对象可用于执行两个任务:

  • 绑定对象
  • 查看和操作有关会话的信息,如会话标识符,创建时间和上次访问时间。

HttpServletRequest接口提供了两种获取HttpSession对象的方法:

  • public HttpSession getSession():返回与此请求相关联的当前会话,或者如果请求没有会话,则创建一个会话。
  • public HttpSession getSession(boolean create):返回与此请求相关联的当前HttpSession,如果没有当前会话,并且create的值为true,则返回一个新会话。

HttpSession接口的常用方法

  • public String getId() :返回一个包含唯一标识符值的字符串。
  • public long getCreationTime() :返回创建此会话的时间,GMT毫秒。
  • public long getLastAccessedTime() : 返回客户端发送与此会话相关联的请求的最后一次,GMT。
  • public void invalidate() : 使此会话无效,然后取消绑定绑定到该对象的任何对象。
  • public void setAttribute(String name, Object value):使用指定名称将对象绑定到此会话
  • public Object getAttribute(String name):返回与此会话中的指定名称绑定在一起的对象

事件和监听器

更改对象的状态称为事件。事件发生时可以执行一些操作:计数总数和当前登录的用户数,在部署项目时创建数据库的表,创建数据库连接对象等。
事件类

  • ServletRequestEvent
  • ServletContextEvent
  • ServletRequestAttributeEvent
  • ServletContextAttributeEvent
  • HttpSessionEvent
  • HttpSessionBindingEvent

事件接口

  • ServletRequestListener
  • ServletRequestAttributeListener
  • ServletContextListener
  • ServletContextAttributeListener
  • HttpSessionListener
  • HttpSessionAttributeListener
  • HttpSessionBindingListener
  • HttpSessionActivationListener

servlet初始化时ServletConfig作为配置对象由容器提供给servlet,ServletContext对象包含在ServletConfig对象中实现servlet与容器的通信,容器在ServletContext对象之后创建ServletContextEvent的对象用于通知有关 Web 应用程序的 servlet 上下文更改的信息。

ServletContextEvent和ServletContextListener
Web应用部署时会通知ServletContextEvent事件,如果在部署时创建数据库连接、创建项目所有表需要给ServletContextListener接口提供方法实现。

  • 事件构造方法:ServletContextEvent(ServletContext e)
  • 事件中返回更改的ServletContext实例:public ServletContext getServletContext()
  • 实现的接口方法应用部署时被调用:public void contextInitialized(ServletContextEvent e)
  • 实现的接口方法取消部署时被调用: public void contextDestroyed(ServletContextEvent e)
    HttpServletEvent和HttpSessionListener
    HttpServletEvent是表示Web程序内会话更改的类,相应的监听器接口是HttpServletListener。可以在这个事件上计数统计当前登录的用户,记录登录时间,注销时间等用户详细信息。
    HttpServletEvent给出了以下方法:
  • public HttpSessionEvent(HttpSession source):构造来自给定源的会话事件。
  • public HttpSession getSession():返回更改的会话。
    HttpSessionListener接口中声明了两种需给出实现的方法:
  • public void sessionCreated(HttpSessionEvent e):在创建会话对象时被调用。
  • public void sessionDestroyed(ServletContextEvent e):当会话无效时被调用。

官方文档

许令波写的原理分析

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值