Servlet(小服务程序)技术总结
Servlet简介及生命周期:
servlet容器就是你所有的应用服务器(如Tomcat),服务器的主要功能就是创建和维护servlet类所需的一些实例(如 doPost(HttpServletRequest req,HttpServletResponse res)中的req和res 对象及ServletContext对象,所以当你在不同的页面会话时,就不需自己创建这些对象,只要拿到这些对象用就行了,servlet容器就创建的 HttpSession对象,也就是你通过HttpSession Session();所获取的对象。
Servlet被服务器实例化后,容器运行其init()方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doGet或者doPost方法等,当服务器决定将实例销毁的时候调用其destroy方法。
    int(ServletConfig config)由于servlet初始化参数的使用非常依赖于部署描述文件(l),该文件可存放servlet所需要的起始参数以及web应用程序的结构数据。当servlet容器读取l文件内容后封装成一个对象(这个对象就是ServletConfig对象传给了init方法)并在调用init方法时传递servlet
GenericServlet实现了ServletConfig接口与Servlet接口,它提供了两种init方法:
第一种init方法是Servlet接口中init()方法的实现将ServletConfig对象保存在一个transient实
例变量中,然后调用第二种不带参数的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被实例化后,对任何客户端在任何时候访问有效,但仅对本servl
et有效,一个servlet的ServletConfig对象不能被另一个servlet访问
ServletContext:对任何servlet,任何人在任何时间都有效,这才是真正全局的对象。
HtttpSession:
    Session机制:http协议本身是“连接-请求-应答-关闭连接”模式的无状态的协议,客户每次读取web页面时,服务器都打开新的会话,而且服务器也不会自动维护客户的上下文信息,session就是一种保存上下文信息的机制它是针对每一个用户的,当一个用户向服务器发送第一个请求时,服务器为其建立一个session,并为此session创建一个标识号(sessionID)保存这个session id的方式可以采用cookie系统会创造一个名为JSESSIONID的输出返回给客户端Cookie保存。这个用户随后的所有请求都应包括这个标识号,服务器会校对这个标识号以判断请求属于哪个session,通过SessionID来区分不同的客户session是以cookieURL重写为基础的,默认使用cookie来实现
如果在jsp中没有显式使用 <%@page session="false"%>,那么jsp编译时会加上HttpSession session = Session(true),这就是为什么打开一个jsp页面就建立了一个session服务端自动创建的session对象,过期时间tomcat默认是30分钟
JSESSIONIDJsessionid只是tomcat的对sessionid的叫法,其实就是sessionid;在其它的容器也许就不叫jsessionid了。
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消失。
Cookiecookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成cookie的作用范围。若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式。   
代码:String usercode = (Session().getAttribute("usercode");
Session Session();
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"));
----------------------------------------------------------------------------------

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。