菜鸟学习第十九天,详细学习servlet,Session

1.servlet

1.servlet最重要的功能是与其他服务器资源(比如数据库或者基于java的应用程序)进行通信
2.servlet的框架是由2个java包组成:
1)javax.servlet包:定义了所有的servlet类都必须实现或者扩展的通用接口和类
2)javax.servlet.http包:定义了采用HTTP协议通信的HttpServlet类。(HttpServlet继承自GenericServlet,GenericServlet是一个通用的,独立于协议的servlet,也就是说还可以用于其他协议,并且实现了Servlet接口,HttpServlet对Servlet中定义的service方法进行了实现,将ServletRequest和ServletResponse转换为HttpServletRequest和HttpServletResponse并调用自己的service方法,在该service方法中,首先从HttpServletRequest对象中获得到请求方式的信息,然后根据方法名调用对应的doxxx方法,doGET,doPost等。在HttpServlet类中所提供的doxxx方法都是直接返回错误信息,所以我们需要在自己定义的Servlet中重写这些方法。)
3.所有的servlet类必须实现Servlet接口(我们说一个servlst通常要去继承HttpServlet,而所有的Servlet必须实现Servlet接口,其实是HttpServlet已经实现了Servlet接口),servlet框架的核心是javax.servlet.Servlet接口,在servlet接口中定义了五个方法,其中三个方法代表了Servlet的生命周期
1)init方法:负责初始化Servlet对象;
2)service方法:负责响应客户的请求;(请求到服务器,并不是直接调用doGet或者doPost方法,而是由service来决定调用哪个)
3)destroy方法:当Servlet对象退出生命周期时,负责释放占用的资源。
4.查看底层源代码可知,其实我们的setAttribute其实就是新建了一个HashMap来帮忙进行存储
5.ServletRequest接口的主要方法
getAttribute:根据参数给定的属性名返回属性值
getContentType:返回客户请求数据MIME(媒体)类型
getInputStream:返回以二进制方式直接读取客户请求数据的输入流
getParameter:根据给定的参数名返回参数值
getRemoteAddr:返回远程客户主机的ip地址
getRemoteHost:返回远程客户主机名
getRemotePort:返回远程客户主机的端口
ServletResponse接口的主要方法
getOutputStream:返回可以向客户端发送二进制数据的输入流对象
getWriter:返回可以向客户端发送字符数据的PrintWriter对象
getCharacterEncoding:返回Servlet发送的响应数据的字符编码
getContentType:返回Servlet发送的响应数据的MIME类型
getContentType:设置Servlet发送的响应数据的MIME类型
6.初始化阶段:
在下列时刻Servlet容器装载Servlet类:
1)Servlet容器启动时自动装载某些Servlet(在web.xml文件中为指定当启动时想要去装载的Servlet类,方式是:在servlet-class下面增加一个子元素<load-on-startup>5</load-on-startup>并指定一个数字来指定配置多个load-on-startup时的启动顺序)
2)在Servlet容器启动后,客户首次向Servlet发出请求(指的是所有用户的第一个,如果第二个客户再发出请求,那么不会再调用init())
3)Servlet的类文件被更新后,重新装载Servlet
Servlet被装载后,Servlet容器就会创建一个Servlet实例并且调用Servlet的init()方法进行初始化,在整个生命周期中init()只会被调用一次。
7.响应客户请求阶段:
1)对于到达Servlet容器的客户请求,Servlet容器创建特定于这个请求的ServletRequest对象和ServletResponse对象,然后调用Servlet的service方法,service方法从ServletRequest对象获得客户请求信息,处理该请求,并通过ServletResponse对象向客户返回响应结果。
8.终止阶段:
1)当web应用被终止或者Servlet容器终止运行,或者Servlet容器重新装载Servlet的新实例时,会先调用destroy方法释放Servlet所占用的资源。
9.servlet实例何时创建
默认情况下,当web客户第一次请求访问某个Servlet时,web容器创建这个servlet实例,如果没有<servlet-mapping>元素在那么在web.xml中配置了<load-on-startup>3</load-on-startup>//中间数字代表servlet执行顺序,让容器在启动时自动加载该Servlet,并且调用其init方法完成一些全局性的初始化工作。
10.ServletContext和web应用的关系:
1)ServletContext,是一个全局的储存信息的空间,服务器开始,其就存在,服务器关闭,其才释放。request,一个用户可有多个;session,一个用户一个;而servletContext,所有用户共用一个。所以,为了节省空间,提高效率,ServletContext中,要放必须的、重要的、所有用户需要共享的线程又是安全的一些信息。当Servlet容器启动web应用时,并为每个web应用创建唯一的ServletContext对象,你可以把ServletContext看成是一个web应用的服务端组件的共享内存,在ServletContext中可以存放共享数据,它提供了读取和设置共享数据的方法:serAttribute()和getAttribute()
获取ServletContext对象的方法:

/获取到servletContext对象1   (从当前Servlet对象获得)
        ServletContext c1=this.getServletContext();
        
        //获取到servletContext对象2  (从ServletConfig对象获得)
        ServletContext c2=this.getServletConfig().getServletContext();
        
        //获取到servletContext对象3   (从会话对象获取到,这是常用的方式)
        ServletContext c3=req.getSession().getServletContext();
        

2)创建一个ServletContext对象:实现一个计数器

 ServletContext context=request.getSession().getServletContext();//创建一个ServletContext实例
 
        if (null==context.getAttribute("counter"))
        {
            context.setAttribute("counter",1);
        }
        else
            {
                int counter=(Integer) context.getAttribute("counter");
                context.setAttribute("counter",counter+1);
            }
        request.getRequestDispatcher("counter.jsp").forward(request,response);

11.Servlet的多线程同步问题:
1)因为Servlet本身是单实例的,这样当有多个用户同时访问某个Servlet,会访问该唯一的Servlet实例中的成员变量,如果对成员变量进行写入操作,就会导致Servlet多线程问题,即数据不一致。
2)解决办法:将成员变量改成局部变量,这样不管有多少个线程访问,都有各自一份数据。

12.Cookie:
1)Cookie是用户访问web服务器时,服务器在用户硬盘上存放的信息,服务器可以根据Cookie来跟踪用户,一个Cookie包含了一对Key/Value。
2)创建一个Cookie:

 Cookie cookie=new Cookie("username","zhangsan");
 response.addCookie(cookie);//可以调用多次,来发送多个Cookie

13.Session
1).web服务器跟踪客户状态通常有四种方法:
建立包含有跟踪数据的隐藏字段
重写包含额外参数的URL
使用持续的Cookie
使用Servlet API中的Session(会话)机制
14.session运行机制:
1)当一个Session开始时,Servlet容器将创建一个HttpSession对象,在HttpSession对象中可以存放客户状态的信息
2)Servlet容器为HttpSession分配一个唯一的标识符,称为Session ID,Servlet容器把Session ID作为Cookie保存在客户的浏览器中。
3)每次客户发出Http请求时,Servlet容器可以从HttpServletRequest对象中读取Session ID,然后根据Session ID找到相应的HttpSesion对象,从而获取客户的状态信息。
15.Session方法:
getId();获取session ID
invalidate();使session失效
isNew();是否是新的session
setAttribute();
getAttribute();
setMaxInactiveInterval();设置session处于不活动的最大时间间隔,也就是从客户端发送请求到服务端使session失效的这段时间,负数表示永远不会失效。(如果不调用这个方法,session失效时间默认是30分钟)
16.Session的生命周期:
1)当客户第一次访问web应用中支持Session的某个网页时,就会开始一个新的Session。
2)接下来当客户浏览这个web应用的不同网页时,始终处于同一个Session
3)默认情况下,jsp网页都是支持Session,也可以通过显示声明支持Session:

<%@ page session="true"%>

4)以下情况Session将结束生命周期:
Session过期
浏览器关闭(这不是session真正关闭的原因,只是一个现象导致的结果,事实上服务器的session对象还没有被销毁,因为服务器不知道客户端关闭了,当客户端重新打开网页会建立一个新的session,原sesison在过期后被销毁。)
invalidate方法(不建议使用)
17.session在实际开发的应用:
在一个登陆页面中,我们提交用户名和密码,和用户类型到一个servlet,这个servlet对获取到的request对象进行获取,通过判断用户类型,然后判断用户名和密码是否正确,然后进行之后的页面,如果提交数据错误我们通过重定向或者请求转发的方式回到登录页面并将用户输入的数据返回到登录页面上,那么登录页面进行获取发送回来的在servlet中存在session中的数据并显示在登录页面,对于按钮或者下拉框,我们用clecked或者selected来指定其被选中,如果登录成功我们跳转到一个jsp页面,页面上2个< a>标签分别跳转到2个不同servlet,并在页面进行session数据验证,如果session为null说明用户没有通过登录页面提交数据,我们重定向到登录页并return,然后再对这2个servlet进行判断用户类型,决定是否能够使用该servlet,在jsp页面中判断如果是管理员那么才显示(修改)这个页面的链接,并在servlet中进行判断用户是否为null来判断用户是否是直接通过地址访问我们的servlet,并进行对应的操作(其实这里每个jsp,servlet都要进行判断,为了防止用户直接通过地址访问我们的页面造成不安全的因素,这里sun公司为我们提供了过滤器,二十天将学习过滤器)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值