Servlet知识点笔记

容器Tomcat的作用:
1,通信支持,无需自己建立serverSocket,监听端口等
2,管理servlet的生命周期
3,为servlet请求创建新的线程
4,翻译JSP代码为java


容器处理请求:
1,容器发现是个servlet请求,创建HttpServletResponse 和 HttpServletRequest
2,为servlet创建一个线程,把 请求,响应对象传给他
3,容器调用servlet的service方法,service方法 +调用doget或dopost方法
4,doget生成动态页面,并将页面传给响应对象
5,把响应对象转换为一个HTTP响应,然后删除请求响应对象

servlet生命周期的三大重要时刻:
1,init()实例创建后,为客户提供服务前,进行初始化,只有调用了init才是真正的Servlet。构造函数只是使其成为一个对象,  init是GenericServlet中的
2,service()开启一个新的线程,调用service        service是HttpServlet中的      
3,doPost doGet    有时候可以直接重写service()不用分辨是post还是get



如果有时候自己不想处理响应,可以让servlet进行重定向。转到另一个  response.sendRedirect(“”)

1,如果里面没有加斜线,就会沿着原来的路径加上后面的路径,

2,如果加了斜线,就会以斜线后的第一个地址为根目录。

3,重定向的URL会发生改变

4,请求分派还是服务器完成工作给另外组件,就像把工作分配给另外一个同事做 

属性和参数的区别:
属性,setAttribute() 返回 Object  getAttribute()
参数,xml中设置,返回String,getInitParameter()
属性 的三个作用域,上下文,请求,会话。 Context  Request  HttpSession


上下文属性是线程不安全的:

解决办法,为上下文本身加锁 锁为getServletContext()

synchronized(getServletContext() )
     getServletContext().setAttribute()
     getServletContext().getAttribute()

会话属性是一个对象,用来维护于一个客户的会话状态。
它也是线程不安全的,需要对HttpSession同步
HttpSession  session = request.getSession()
synchronized(session)
     getServletContext().setAttribute()
     getServletContext().getAttribute()


分派器,把任务给其他组件,两种获取方法:
RequestDisapacher view = request.getRequestDisapacher(“result.jsp”);    只有forward和include两种方法。
RequestDisapacher view = getServletContext().getRequestDisapacher(“/result.jsp”);

服务端跳转:

request.getRequestDispacher( )  还是同一页面
客户端跳转:
response.sendRedirect() 另外一个页面

自启动:
有的时候会有这样的业务需求:
tomcat一启动,就需要执行一些初始化的代码,比如校验数据库的完整性等。
但是Servlet的生命周期是在用户访问浏览器对应的路径开始的。如果没有用户的第一次访问,就无法执行相关代码。
这个时候,就需要Servlet实现 自启动 即,伴随着tomcat的启动,自动启动初始化,在初始化方法init()中,就可以进行一些业务代码的工作了。在web.xml中,配置Hello Servlet的地方,增加一句
<load-on-startup>10</load-on-startup>
如果有多个Servlet都配置了自动启动,小的数字先启动


  • 每个Servlet都有ServletConfig 和 ServletContext, servlet初始化参数,从ServletConfig 获得,容器只能读一次初始化参数,所以想要改变初始化参数,就得重新部署Tomcat。
  • request 和 reponse两个对象,都是由容器帮你实现了HttpServletRequest和HttpServletResponse方法。 他们两是由ServletRequest,ServletResponse扩展的,HttpServlet大多来自于GenericServlet。
  • 幂等:可以反复的执行一件事而不会担心有副作用,get在http规范是幂等的,post本质上不是幂等的,但是可以写成幂等。如果form中没有表示method=post  那么会默认为get。
  • 上下文初始化参数(context-param)和servlet初始化参数很相似,只不过上下文参数针对整个Web都可以用,而不是一个servlet(一个WEB可能有多个Servlet)
  • 上下文初始化 参数,ServletContext 。getServletContext()

  • web服务器没有短期记忆,如果想跟踪客户的回答。可以使用HttpSession对象保存
HttpSession对象可以保存跨同一个客户多个请求的会话状态,换句话说,和一个客户整个会话期间HttpSession会持久储存。
  • 如果有其他客户访问,会开一个新的线程,给一个新的HttpSession对象,对容器而言,每一个请求都来自于一个新客户,所以客户需要一个会话ID,当客户请求的时候,容器会生成一个会话ID,以后每次访问,客户都会在请求中返回会话ID。会话ID经常是用Cookie发送的 ,Cookie实际上是在客户端和服务端 之间交换的一小段数据。
  • 容器几乎会完成Cookie的所有工作,
  • 在响应中发送一个会话Cookie  ,从请求得到会话ID。HttpSession session = request.getSession( );
  • 默认的,Cookie 的寿命和会话一样长,但是你可以让它活的更长一些,甚至在浏览器已经关闭后仍然存活。
  • 另一种得到会话的方法:如果实现了与会话相关的4种监听接口的任意一种,就可以用事件来访问会话,event.getSession();
  • 判断是否是一个新的会话:  session.isNew().
  • 返回一个原有的会话req.getSession(false) 如果没有原有会话,会返回一个null     req.getSession(true)会话不存在会创建一个新的会话
  • 如果用户禁用了Cookie 会忽略Set-Cookie的响应首部,isNew会一直返回true。解决办法是重写URL,
  • 在URL后面加上会话ID。重写的条件是,确实对URL完成了编码。那么容器就会首先使用cookie,如果不行再用URL重写  response.encodeURL()
  • 如果想吧请求重定向到另一个URL,然后继续使用这个会话那么 response.encodeRedictURL( )
  • 如果会话长时间不动,那么希望能够撤销并回收这个会话。
相关的HttpSession方法:getCreationTime() ,getLastAccessedTime() setMaxInactiveInterval(设置最大间隔时间),getMaxInactiveInterval() invalidate(结束会话)

其实无需你自己用这些方法来删除无用会话,容器会为你做。
会话有三种死法:
  1. 超时 :在DD中设置超时<session-config><seesion-timeout>15 (分钟)    session.setMaxInactiveInterval() 
  2. 在会话对象上调用invalidate()
  3. 应用结束
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值