servlet技术总结

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Servlet(小服务程序)技术总结
Servlet简介及生命周期:
servlet容器:就是你所有的应用服务器(如Tomcat),服务器的主要功能就是创建和维护servlet类所需的一些实例(如 doPost(HttpServletRequest req,HttpServletResponse res)中的req和res 对象及ServletContext对象,所以当你在不同的页面会话时,就不需自己创建这些对象,只要拿到这些对象用就行了),servlet容器就创建的 HttpSession对象,也就是你通过HttpSession session=res.getSession();所获取的对象。

Servlet被服务器实例化后,容器运行其init()方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doGet或者doPost方法等,当服务器决定将实例销毁的时候调用其destroy方法。

int(ServletConfig config):由于servlet初始化参数的使用非常依赖于部署描述文件(web.xml),该文件可存放servlet所需要的起始参数以及web应用程序的结构数据。

当servlet容器读取web.xml文件内容后,封装成一个对象(这个对象就是ServletConfig对象传给了init方法)并在调用init方法时传递给servlet。

GenericServlet实现了ServletConfig接口与Servlet接口,它提供了两种init方法:
第一种init方法是Servlet接口中init()方法的实现,将
量中,然后调用第二种不带参数的init()方法。

所以我们可以在Servlet内重写init方法,并通过ServletCongig对象来取得某些初始参数。

如果重写第二种init()方法,那么应该在子类的该方法中,写上super.init(config)代码调用,否则出现空指针异常。

service方法与doGet/doPost方法的关系:service()在javax.servlet.Servlet接口定义的,
javax.servlet.GenericServlet实现了javax.servlet.Servlet这个接口,javax.servlet.http.HttpServlet继承了
javax.servlet.GenericServlet这个类,doGet/doPost就是在javax.servlet.GenericServlet类中实现的。

javax.servlet.http.HttpServlet的service()方法主要做的事情就是判断请求类型是get还是post,然后调用对应的doGet/doPost执行
servlet与cgi(Common Gateway Interface公共网关接口)的区别:在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。

Servlet 与Struts2:Struts2:新建一个action接受用户的请求。

在这个action中调用模型中方法(查询数据库),得到结果后再跳转到jsp页面中显示出来。

Servlet:新建一个servlet接受用户的请求,调用模型中的方法(查询数据库)。

Servlet内置对象的作用范围及访问方法:
HttpServletRequest,HttpServletResponse:这两个属性的作用范围最小。

时间上:只是本身请求和应答完成就失效,当然转发是把当前的request对象取出来传给另一个资源,其实本身的request对象还是只生存到本次请求结束,response也同样。

空间上:只能发送请求的客户端有效。

HttpSession:一次连结到客户端关闭,时间作用范围比上面两个大,空间任用范围相同。

ServletConfig:从一个servlet被实例化后,对任何客户端在任何时候访问有效,但仅对本servlet 有效,一个servlet的ServletConfig对象不能被另一个servlet访问
ServletContext:对任何servlet,任何人在任何时间都有效,这才是真正全局的对象。

HtttpSession:
Session机制:http协议本身是“连接-请求-应答-关闭连接”模式的无状态的协议,客户每次读取web页面时,服务器都打开新的会话,而且服务器也不会自动维护客户的上下文信息,session就是一种保存上下文信息的机制。

它是针对每一个用户的,当一个用户向服务器发送第一个请求时,服务器为其建立一个session,并为此session创建一个标识号(sessionID),保存这个session id的方式可以采用cookie,系统会创造一个名为JSESSIONID的输出返回给客户端Cookie保存。

这个用户随后的所有请求都应包括这个标识号,服务器会校对这个标识号以判断请求属于哪个session,通过SessionID来区分不同的客户。

session是以cookie或URL 重写为基础的,默认使用cookie来实现。

如果在jsp中没有显式使用 <%@page session="false"%>,那么jsp编译时会加上HttpSession session = HttpServletRequest.getSession(true),这就是为什么打开一个jsp页面就建立了一个session。

服务端自动创建的session对象,过期时间tomcat默认是30分钟。

JSESSIONID:Jsessionid只是tomcat的对sessionid的叫法,其实就是sessionid;在其它的容器也许就不叫jsessionid了。

保存session id的几种方式:
1.保存session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。

2.由于cookie可以被人为的禁止,必须有其它的机制以便在cookie被禁止时仍然能够把session id传递回服务器,经常采用的一种技术叫做URL重写,就是把session id附加在URL路径的后面,附加的方式也有两种:一种是作为URL路径的附加信息,另一种是作为查询字符串附加在URL后面。

网络在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。

3.另一种技术叫做表单隐藏字段。

就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。

session在下列情况下被删除:
1.程序调用HttpSession.invalidate();
2.距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间
3.服务器进程被停止。

(关闭浏览器,只会是浏览器端内存里的session cookie消失,但不会使保存在服务器端的session对象消失,同样也不会使已经保存到硬盘上的持久化cookie消失。


Cookie:cookie的内容主要包括:名字,值,过期时间,路径和域。

路径与域一起构成cookie的作用范围。

若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。

这种生命期为浏览器会话期的cookie被称为会话cookie。

会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。

若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。

存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。

而对于保存在内存里的cookie,不同的浏览器有不同的处理方式。

代码:String usercode = (String)request.getSession().getAttribute("usercode");
Session session=req.getSession();
ServletConfig:
跟servletContext不同的是,一个Servlet对应一个servletConfig(不管有多少客户访问它从而开启了多少个线程),而servletContext是一个web工程只有一servletContext。

当然servletConfig也可以取得关联的servletContext。

也就是说,容器只有在创建servlet 实例时才会读文件中的<init-param></init-param>,并且在servlet一生中只读一次
首先HttpServlet继承自GenericServlet类,而 GenericServlet类又继承自Servlet 接口,Servlet接口有方法getServletConfig() ,所以HttpServlet肯定有方法getServletConfig() 。

---------------------------------------------------------------------------------- <servlet>
<servlet-name>ServletConfigTest</servlet-name>
<servlet-class>com.guo.ServletConfigTest</servlet-class>
<init-param>
<param-name>color</param-name>
<param-value>red</param-value>
</init-param>
</servlet>
在servlet代码中:
out.println(getServletConfig().getInitParameter("color"));
----------------------------------------------------------------------------------ServletConfig中的方法:
getInitParameter(String name):根据给定的初始化参数,返回匹配的初始化参
数值。

getInitParameterNames():返回一个Enumeration对象,里面包含了所有的初始化参数。

getServletContext():返回一个servletContext()对象.
getServletName():返回servlet的名字,即web.xml中的<servlet-name>的子元素的值。

如果没有配置这个子元素,则返回servlet类的名字。

ServletContext:
是Servlet中最大的一个接口,呈现了web应用的Servlet视图ServletContext实例是通过getServletContext()方法获得的。

启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml的两个节点:<listener></listener>和<context-param></context-param>,紧接着容器创建一个servletContext,这个web项目所有部分都将共享这个上下文。

1).初始化参数
ServletContext对象是在Web应用程序装载时初始化的。

正像Servlet具有初始化参数一样,ServletContext也有初始化参数。

Servlet上下文初始化参数指定应用程序范围内的信息。

[1]
<context-param>
<param-name>adminEmail</param-name>
<param-value>webmaster</param-value>
</context-param>
<context-param>元素是针对整个应用的,所以并不嵌套在某个<servlet>元素中,该元素是<web-app>元素的直接子元素。

[1]
从Servlet中访问初始化参数:ServletContext application=this.getServletContext();
out.println(application.getInitParameter("email"));
2).属性
可以通过编程的方式绑定,也可以作为web应用的全局变量被所有Servlet和JSPs访问
设置Context属性:ServletContext application=this.getServletContext();
application.setAttribute("person1",new Person("Jim"));
application.setAttribute("person2",new Person("Green"));
获取Context属性:ServletContext application=this.getServletContext();
(一种集合)Enumberation persons=application.getAttributeNames();
while(persons.hasMoreElements()){
String name=(String)persons.nextElement();
Person p=(Person)persons.getAttribute(name);
application.removeAttribute(name);
web.xml里面可以定义两种参数context-param和init-param区别:
(1)application范围内的参数,存放在servletcontext中,在web.xml中配置如下:
<context-param>
<param-name>context/param</param-name>
<param-value>avalible during application</param-value>
<param-name>name1</param-name>
<param-value>value1</param-value>
</context-param> // 服务器启动后就读取了
(2)servlet范围内的参数,只能在servlet的init()方法中取得,在web.xml中配置如下:
<servlet>
<servlet-name>MainServlet</servlet-name>
<servlet-class>com.wes.controller.MainServlet</servlet-class>
<init-param>
<param-name>param1</param-name>
<param-value>avalible in servlet init()</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet> // 容器创建servlet实例时才会读取
在servlet中可以通过代码分别取用:
package com.wes.controller;
import javax.servlet.*;
public class MainServlet extends HttpServlet ...{
public MainServlet() ...{
super();
}
public void init() throws ServletException ...{
System.out.println("下面的两个参数param1是在servlet中存放的");
System.out.println(this.getInitParameter("param1"));
System.out.println("下面的参数是存放在servletcontext中的");
System.out.println(getServletContext().getInitParameter("context/param"));
}
} //第一种参数在servlet里面可以通过getServletContext().getInitParameter("context/param")得到
//第二种参数只能在servlet的init()方法中通过this.getInitParameter("param1")取得
Servlet (作者:石教授)
第 10 页 Web.xml 中的listener :
监听器也叫Listener ,是Servlet 的监听器,它可以监听客户端的请求、服务端的操作等。

通过监听器,可以自动激发一些操作,比如监听在线的用户的数量。

当增加一个HttpSession 时,就激发
sessionCreated(HttpSessionEvent se)
方法,这样就可以给在线人数加1。

常用的监听接口有以下几个:
ServletContextAttributeListener 监听对ServletContext 属性的操作,比如增加、删除、修改属性。

ServletContextListener 监听ServletContext 。

当创建ServletContext 时,激发
contextInitialized(ServletContextEvent sce)方法;当销毁ServletContext 时,激发contextDestroyed(ServletContextEvent sce)方法。

HttpSessionListener 监听HttpSession 的操作。

当创建一个Session 时,激发
sessionCreated(HttpSessionEvent se)方法;当销毁一个Session 时,激发
sessionDestroyed(HttpSessionEvent se)方法。

HttpSessionAttributeListener 监听HttpSession 中的属性的操作。

当在Session 增加一个属性时,激发attributeAdded(HttpSessionBindingEvent se)方法;当在Session 删除一个属性时,激发attributeRemoved(HttpSessionBindingEvent se)方法;当在Session 属性被重新设置时,激发attributeReplaced(HttpSessionBindingEvent se)方法。

Servlet (作者:石教授)第11页
Servlet (作者:石教授)第12页。

相关文档
最新文档