Servlet学习笔记

Servlet规范

servlet简介

1、servlet是sun公司开发动态web的一门技术。

2、sun公司在这些API提供了一个接口:servlet。

如果想开发一个servlet程序,只需要完成两个小步骤:1:编写一个

类,实现servlet接口。2:把开发好的Java类部署到web服务器中

3、把实现了servlet接口的Java程序叫做:Servlet,本质上还是Java程序。

4、servlet是javaWeb三大组件之一,其中三大组件分别是:servlet程序、filter过滤器、listener监听器。

5、servlet是运行在服务器上的一个java小程序,他可以接受客户端发送过来的请求,并响应数据给客户端。

servlet规范介绍

1.servlet规范来自于JAVAEE规范中的一种。

2.作用:

1):在Servlet规范中,指定【动态资源文件】开发步骤

2):在Servlet规范中,指定HTTP服务器调用动态资源文件规则。

3):在Servlet规范中,指定HTTP服务器管理动态资源文件实例对象规则。

Servlet接口实现类

1、Servlet接口来自于Servlet规范下的一个接口,这个接口存在于当前的HTTP服务器提供的jar包中。

2.Tomcat服务器下lib文件有一个Servlet-api.jar存放Servlet接口。

3.Servlet规范中认为,HTTP服务器能掉用的动态资源文件必须是一个Servlet接口实现类。

Servlet接口实现类开发步骤

第一步:创建一个Java类继承于HttpServlet父类,使之成为一个Servlet接口实现类。

第二步:重写HttpServlet父类的两个方法。doGet.doPost

第三步:将Servlet接口实现类信息【注册】到Tomcat服务器

在web.xml文件上补上相关代码

 

<!--将servlet接口实现类类路径地址交给Tomcat-->
<servlet>
   <servlet-name>gp</servlet-name><!--声明一个变量存储servlet接口实现类的路径-->
   <servlet-class>com.hao.servlet.GetParameter</servlet-class><!--声明servlet接口实现类类路径-->
</servlet>
<!--然后Tomcat会声明一个变量gp,将com.hao.servlet.GetParameter放进去-->
<!--为了降低用户访问servlet接口实现类难度,需要设置简短请求别名-->
<servlet-mapping>
   <servlet-name>gp</servlet-name>
   <url-pattern>/gp</url-pattern><!--设置简短别名,别名在书写的时候必须以"/"开头-->
</servlet-mapping>

手动实现Servlet程序

1、编写一个类去实现Servlet接口

2、实现service方法,处理请求,并相应数据

3、在web.xml中配置servlet程序的访问地址。

Servlet对象生命周期

1.网站中所有的Servlet接口实现类的实例对象,只能由Http服务器负责创建,开发人员不能手动创建Servlet接口实现类的实例对象

2.在默认的情况下,Http服务器接收到对于当前Servlet接口实现类第一次请求时自动创建这个Servlet接口实现类的实例对象

3.在手动配置的情况下,要求Http服务器在启动时自动创建某个Servlet接口实现类的实例对象

<servlet>
   <servlet-name>gp</servlet-name><!--声明一个变量存储servlet接口实现类的路径-->
   <servlet-class>com.hao.servlet.GetParameter</servlet-class><!--声明servlet接口实现类类路径-->
   <load-on-startup>30</load-on-startup><!--填写一个大于0的整数即可,通知Tomcat在启动的时候创建GetParameter实例对象-->
</servlet>
<!--然后Tomcat会声明一个变量gp,将com.hao.servlet.GetParameter放进去-->

4.在Http服务器运行期间,一个Servlet接口实现类只能被创建出一个实例对象

5.在Http服务器关闭时刻,自动将网站中的所有的Servlet对象进行销毁。

HttpServletResponse接口

介绍:

1.HttpServletResponse接口来自于Servlet规范中,在Tomcat中存在servlet-api.jar

2、HttpServletResponse接口实现类由Http服务器负责提供

3、HttpServletResponse接口负责将doGet/doPost方法执行结果写入到【响应体】交给浏览器

4.开发人员习惯于将HttpServletResponse接口修饰的对象称为【响应对象】

主要功能:

1.将执行结果以二进制形式写入到【响应体】

2.设置响应头中【content-type】属性值,从而控制浏览器使用对应的编译器将响应体二进制数据编译为【文字,图片,视频,命令】

3.设置响应头中【location】属性,将一个请求地址赋给【location】,从而控制浏览器向指定服务器发送请求resp.sendRedirect(location);

 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //resp.setContentType("text/html"); 设置自己的代码有text文档,和html文档
       //resp.setCharacterEncoding("utf-8"); 设置自己代码的字符集
       int str=50;
       PrintWriter out=resp.getWriter();
       out.write(str); //结果会输出2,因为write是按照ASCII码输出的,因此应该用out.print(str)打印会出现50
    String result="http://www.baidu.com";
    resp.sendRedirect(result);//该语句可以直接访问result里面的网址
  }

HttpServletRequest接口

1.介绍

1.HttpServletRequest接口来自于Servlet规范中,在Tomcat中存在servlet-api.jar

2、HttpServletRequest接口实现类由Http服务器负责提供

3.HttpServletRequest接口负责在doGet/doPost方法运行时读取Http请求协议包中信息

4.开发人员习惯于将HttpServletRequest接口修饰的对象称为【请求对象】

作用:

1、可以读取Http请求协议包中【请求行】信息

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>test002</title>
</head>
<body>
   <center>
       <a href="/myweb/test002?username=jiahao&password=123">通过超链接访问test002并且携带请求参数信息</a>
   </center>

</body>
</html>
package com.hao.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;

public class test002 extends HttpServlet{
   protected void doGet(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{
       Enumeration paramNames=req.getParameterNames();
       while(paramNames.hasMoreElements()){
           String paramName=(String)paramNames.nextElement();
           String value=req.getParameter(paramName);
           System.out.println("请求参数名"+paramName+"参数值:"+value);
      }
  }

   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       super.doPost(req, resp);
  }
}
  <servlet>
   <servlet-name>test002</servlet-name>
   <servlet-class>com.hao.servlet.test002</servlet-class>
 </servlet>
 <servlet-mapping>
   <servlet-name>test002</servlet-name>
   <url-pattern>/test002</url-pattern>
 </servlet-mapping>

2.可以读取保存在Http请求协议包中【请求头】或者【请求体】中的请求参数信息

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
</head>
<body>
   <center>
       <form action="/myweb/test003" method="get">
          请求参数信息:<input type="text" name="username" />
           <input type="submit" value="获取请求参数信息" />

       </form>
       <form action="/myweb/test003" method="post">
          请求参数信息:<input type="text" name="username" />
           <input type="submit" value="获取请求参数信息" />
       </form>
   </center>
</body>
</html>
package com.hao.servlet;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import java.io.IOException;

public class test003 extends HttpServlet{
   protected void doGet(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{
       String str=req.getParameter("username");
       System.out.println("get方法获得的参数信息为"+str);
  }
   protected void doPost(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{
       req.setCharacterEncoding("utf-8");
       String str=req.getParameter("username");
       System.out.println("post方法获得的参数为:"+str);
  }
}
<servlet>
<servlet-name>test003</servlet-name>
<servlet-class>com.hao.servlet.test003</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test003</servlet-name>
<url-pattern>/test003</url-pattern>
</servlet-mapping>

通过运行代码可以看出结果:

以Get方式发送中文参数,得到正常结果,但如果以POST方式发送中文参数,则会得到乱码结果

原因是:

浏览器以GET方式发送请求,请求参数保存在【请求头】,在Http请求协议包到达HTTP服务器后,第一件事就是进行解码,请求头二进制内容由Tomcat负责解码,Tomcat默认使用【utf-8】字符集,可以解释一切国家

以POST方式发送请求,请求参数保存在【请求体】中,在Http请求协议包到达HTTP服务器后,第一件事就是进行解码,请求体二进制内容由当前请求对象(request)负责解码,request默认使用【ISO-8859-1】字符集,一个东欧语系字符集,如果此时请求体参数内容是中文,将无法解码,只能得到乱码,因此要使用req.characterEncoding("utf-8");

3.可以代替浏览器向Http服务器申请资源文件调用

package com.hao.servlet;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import javax.servlet.ServletException;
import java.io.PrintWriter;

public class test001 extends HttpServlet{
protected void doGet(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
String string=req.getRequestURL().toString();//通过请求对象,获取请求行中的的URL信息
String string2=req.getMethod(); //通过请求对象获取请求行中的method信息(GET/POST)
//通过请求对象,读取【请求行】中uri信息,URI是资源文件精准定位地址,在请求行中并没有URI这个属性,实际上URL中截取一个字符串。字符串格式为“/网站名/资源名”,URI用于让HTTP服务器对被访问的资源文件进行定位。
System.out.println(string);
System.out.println(string2);
}
protected void doPost(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{

}
}

URI:是资源文件精准定位地址,在请求行中并没有URI这个属性,实际上URL中截取一个字符串。字符串格式为“/网站名/资源名”,URI用于让HTTP服务器对被访问的资源文件进行定位。

请求对象(HttpServletRequest)和响应对象(HttpServletResponse)的生命周期

1.在Http服务器接收到浏览器发送的【Http请求协议包】之后,自动为当前的【Http请求协议包】生成一个【请求对象】和一个【响应对象】。

2.在Http服务器调用doGet/doPost方法时候,负责将【请求对象】和【响应对象】作为实参传递到方法,确保doGet/doPost正确执行。

3.在Http服务器准备推送Http响应协议包之前,负责将本次请求关联的【请求对象】和【响应对象】销毁。

------【请求对象】和【响应对象】生命周期贯穿一次请求的处理过程中,一旦处理过程结束,【请求对象】和【响应对象】就立刻会被销毁。

1

 

 

欢迎资源文件

1.前提:用户可以记住网站名,但是不会记住网站资源文件名

2.默认欢迎资源文件:

用户发送了一个针对某个网站的默认请求时,此时由Http服务器自动从当前网站返回的资源文件

正常请求:http://localhost:8080/myweb/index.html

默认请求:http://localhost:8080/myweb

3.Tomcat对于默认欢迎资源文件定位规则

1.位置规则:Tomcat安装位置/cong/web.xml

2.命令规则:

  <welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

tomcat首先会找index.html文件,如果有,欢迎页面就执行index.html文件,如果没有,则会找index.htm,如果再没有就找index.jsp文件,如果都没有,则会显示404页面。

4.设置当前网找的默认欢迎资源文件规则

1.位置规则:网站/webapp/WEB-INF/web.xml

2.命令规则:

 <welcome-file-list>
       <welcome-file>login.html</welcome-file>
   </welcome-file-list>

3.网站设置自定义默认文件定位规则,此时tomcat自带定位规则将失效。

Http状态码

1.介绍:

1)由三位数字组成的一个符号。

2)Http服务器在推送响应包之前,根据本次请求处理情况,将Http状态码写入到响应包中【状态行】上

3)如果Http服务器针对本次请求,返回了对应的资源文件,通过Http状态码通知浏览器应该如何处理这个结果。

如果Http服务器针对本次请求,无法返回对应的资源文件,通过Http状态码向浏览器解释不能提供服务的原因。

2.分类:

1)组成 : 由100---599;五百个数字组成,分为五个大类。

2)1XX:

最有特征的是100;代表浏览器本次返回的资源文件并不是一个独立的资源文件,需要浏览器在接受响应包之后,继续向Http服务器索要依赖的其他资源文件。

3)2XX:

最有特征的是200:通知浏览器本次返回的资源文件是一个完整独立资源文件,浏览器在接收到之后不需要索要其他关联文件。

4)3XX:

最有特征302,通知浏览器本次返回的不是一个资源文件内容,而是一个资源文件地址,需要浏览器根据这个地址自动发起请求来索要这个资源文件。

5)4XX:

404:通知浏览器,由于在服务端没有定位到被访问的资源文件,因此无法提供帮助。

405:通知浏览器,在服务端已经定位到被访问的资源文件(Servlet)但是这个Servlet对于浏览器采用的请求方式不能处理。

6)5XX:

500:通知浏览器,在服务端已经定位到被访问的资源文件(Servlet),这个Servlet可以接收浏览器采用请求方式,但是Servlet在处理请求期间,由于Java异常导致处理失败。

多个Servlet之间的调用规则

OneServlet和TwoServlet是两个mouble程序

1.前提条件:

某些来自于浏览器发送请求,往往需要服务端中多个servlet协同处理,但是浏览器一次只能访问一个Servlet,导致用户需要手动通过浏览器发起多次请求才能得到服务,这样增加用户获得服务难度,导致用户放弃访问当前网站。

2.提高用户使用感受规则:

无论本次请求涉及到多少个Servlet,用户只需要手动通知浏览器发起一次请求即可。

3.多个Servlet之间的调用规则:(2个)

1)重定向解决方案

2)请求转发解决方案

重定向解决方案:

工作原理:

用户第一次通过手动方式通知浏览器访问OneServlet,Oneservlet工作完毕后,将TwoServlet地址写入到响应头location属性中,导致Tomcat将302状态码写入到状态行。在浏览器接收到响应包之后,会读取到302状态,此时浏览器自动根据响应头中location属性地址发起第二次请求,去访问TwoServlet去完成请求中剩余任务。

实现命令:

response.sendRedirect("请求地址")

将地址写入到响应包中响应头中location属性

特征:

1)请求地址:

既可以把当前网站内部的资源文件地址发送给浏览器(/网站名/资源文件名),也可以把其他网络资源文件地址发送给浏览器(http://ip地址:端口号/网站名/资源文件名)。

2)请求次数

浏览器至少发送两次请求,但是只有第一次请求是用户手动发送。后续请求都是浏览器自动发送的。

3)请求方式:

重定向解决方案中,通过地址栏通知浏览器发起下一次请求,因此通过重定向解决方案调用的资源文件接收的请求方式一定是【GET】

4)缺点:

重定向解决方案需要在浏览器与服务器之间进行多次往返,大量时间消耗在往返次数上,增加用户等待服务时间

请求转发解决方案

1.原理:

用户第一次通过手动方式要求浏览器访问OneServlet,OneServlet工作完毕后,通过当前的请求对象代替浏览器向Tomcat发送请求,申请调用TwoServlet,Tomcat在接到这个请求之后,自动调用TwoServlet来完成剩余任务。

2:实现命令:

请求对象代替浏览器向Tomcat发送请求

//1.通过当前请求对象生成资源文件申请报告对象

RequestDispatcher report=request.getRequestDispatcher("/资源文件名"); 要以“/”开头

//2、将报告对象发送给Tomcat

report.forward(当前请求对象,当前响应对象)

3.优点:

1)无论本次请求涉及到多少个Servlet,用户只需要手动通过浏览器发送一次请求,

2)Servlet之间调用发生在服务端计算机上,节省服务端与浏览器之间的往返次数,增加处理服务速度。

4.特征:

1)请求次数:在请求转发过程中,浏览器只发送一次请求。

2)请求地址:只能向Tomcat服务器申请调用当前网络下资源文件地址,

request.getRequestDispatcher("/资源文件名");切记:不要写网络名

3)请求方式:在请求转发过程中,浏览器只发送了一个Http请求协议包,参与本次请求的所有Servlet共享同一个请求协议包,因此这些Servlet接收的请求方式与浏览器发送的请求方式保持一致。

多个Servlet之间数据共享实现方案

1.数据共享:OneServlet工作完毕后,将产生的数据交给TwoServlet来使用。

2.Servlet规范中提供四种数据共享方案

1.ServletContext接口

2.Cookie类

3.HttpSession接口

4.HttpServletRequest接口

ServletContext接口

1.介绍:

1)来自于Servlet规范中一个接口,在Tomcat中存在servlet-api.jar,在Tomcat中负责提供这个接口实现类

2)如果两个Servlet来自于同一个网站,彼此之间通过网站的ServletContext实例对象实现数据共享

3)开发人员习惯于将ServletContext对象称为【全局作用域对象】。

2.工作原理

每一个网站都存在一个全局作用域对象,这个全局作用域对象相当于一个Map,在这个网站中OneServlet可以将一个数据存入到全局作用域对象,当前网站中其他Servlet此时都可以从全局作用域对象得到这个数据进行使用。

ServletContext工作流程图

 

 

3.全局作用域对象生命周期:

1)在Http服务器启动过程中,自动为当前网站在内存中创建一个全局作用域对象

2)在Http服务器运行期间,一个网站只有一个全局作用域对象。

3)在Http服务器运行期间,全局作用域对象一直处于存活状态

4)在Http服务器准备关闭时,负责将当前网站中全局作用域对象进行销毁处理

全局作用域对象生命周期贯穿网站整个运行期间

4.实现命令:

web容器在启动的时候,他会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用

1.共享数据:即在一个Servlet中保存的数据,可以在另一个servlet中拿到。

放置数据的Java代码:

public class HelloServlet extends HttpServlet {
   protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException,IOException{
       //1.通过请求对象向Tomcat索要当前网站中全局作用域对象
       ServletContext context=this.getServletContext();
       String username="李家豪";
//2.将数据添加到全局作用域对象作为共享数据
       context.setAttribute("username",username);
  }

}

读取数据的java代码:

public class GetServlet extends HttpServlet {
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       ServletContext context=this.getServletContext();//this可以用req代替
       String username=(String) context.getAttribute("username");
       resp.setContentType("text/html");
       resp.setCharacterEncoding("utf-8");
       resp.getWriter().print("名字:"+username);
  }

   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       super.doPost(req, resp);
  }
}

配置xml:

 <servlet>
       <servlet-name>hello</servlet-name>
       <servlet-class>com.hao.servlet.HelloServlet</servlet-class>
   </servlet>
   <servlet-mapping>
       <servlet-name>hello</servlet-name>
       <url-pattern>/hello</url-pattern>
   </servlet-mapping>

   <servlet>
       <servlet-name>servletcontext</servlet-name>
       <servlet-class>com.hao.servlet.GetServlet</servlet-class>
   </servlet>
   <servlet-mapping>
       <servlet-name>servletcontext</servlet-name>
       <url-pattern>/getc</url-pattern>
   </servlet-mapping>

2:初始化参数

public class GetParameter extends HttpServlet {
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       ServletContext context=this.getServletContext();
       String url=context.getInitParameter("url");
       resp.getWriter().print(url);
  }
}
 <context-param>
       <param-name>url</param-name>
       <param-value>jdbc:mysql//localhost:3306/aaaa</param-value>

   <servlet>
       <servlet-name>gp</servlet-name>
       <servlet-class>com.hao.servlet.GetParameter</servlet-class>
   </servlet>
   <servlet-mapping>
       <servlet-name>gp</servlet-name>
       <url-pattern>/gp</url-pattern>
   </servlet-mapping>

3:请求转发

Cookie

1.介绍:

1)Cookie来自于Servlet规范中一个工具类,存在于Tomcat提供servlet-api.jar中

2)如果两个Servlet来自于同一个网站,并且为同一个浏览器/用户提供服务,此时借助于Cookie对象进行数据共享。

3)Cookie存放当前用户的私人数据,在共享数据过程中提高服务质量

4)在现实生活场景中,Cookie相当于用户在服务端得到的【会员卡】

5)Cookie相当于一个map,一个cookie中只能存放一个键值对,并且键值对中的key和value类型只能是String,并且键值对中的key不能是中文。

2.原理:

用户通过浏览器第一次向myweb网站发送请求申请OneServlet。OneServlet在运行期间创建一个Cookie存储与当前用户相关数据,OneServlet工作完毕后,【将Cookie写入到响应头】交还给当前浏览器。

浏览器收到响应包之后,将Cookie存储在浏览器的缓存中,一段时间之后,用户通过【同一个浏览器】再次向【myweb】发送请求申请TwoServlet时,【浏览器需要无条件的将myweb网站之前推送过来的Cookie,写入到请求头】发送过去。此时TwoServlet在运行时,就可以通过读取请求头中Cookie信息,得到OneServlet提供的分享信息。

3.实现命令

OneServlet{
   public void doGet(HttpServletRequest req,HttpServletResponse resp){
       //1.创建一个Cookie对象,保存共享数据(当前用户数据)
       Cookie card =new Cookie("key1","abc");
       //将Cookie写入到响应头,交给浏览器
       resp.addCookie(card);
  }
}
TwoServlet{
    public void doGet(HttpServletRequest req,HttpServletResponse resp){
        //1.调用请求对象从请求头得到浏览器返回的Cookie
        Cookie[] cookieArray=req.getCookies();
        //2.循环遍历数据得到每个cookie的key与value
        for(Cookie card : cookieArray){
            String key=card.getName(); //读取key,"key1"
            String value=card.getValue();//读取value “abc”
        }
    }
}

4、Cookie生命周期

1.在默认情况下,Cookie对象存放在浏览器的缓存中,因此只要浏览器关闭,Cookie对象就会被销毁掉。

2.在手动设置情况下,可以要求浏览器将接收的Cookie存放在客户端计算机的硬盘上,同时需要指定Cookie在硬盘上存活时间,在存活时间范围内,关闭浏览器,关闭客户端计算机,关闭服务器,都不会导致Cookie被销毁。存活时间到达,Cookie自动从硬盘上被删除。

3.设置Cookie在客户端硬盘上的存活时间命令

cookie.setMaxAge(60);//设置名为cookie的Cookie的存活时间为一分钟。

HTTPSession接口

1.介绍:

1)HttpSession接口来自于Servlet规范下的一个接口,存在于Tomcat中servlet-api.jar中,其实现类由Http服务器提供,Tomcat提供实现类存在于servlet-api.jar中

2)如果两个Servlet来自于同一个网站,并且为同一个浏览器/用户提供服务,此时借助于HttpSession对象进行数据共享。

3)开发人员习惯于将HttpSession接口修饰对象称为【会话作用域对象】

2.HttpSession和Cookie的区别

1)存储位置:

Cookie存放在客户端计算机(浏览器内存/硬盘)

HttpSession存放在服务端计算机内存

2)数据类型:

Cookie对象存储共享数据类型只能是String

HttpSession对象可以存储任意类型的共享数据Object

3)数据数量:

一个Cookie对象只能存储一个共享数据

HttpSession使用map集合存储共享数据,所以可以存储任意数量共享数据

4)参照物:

Cookie相当于客户在服务端的会员卡,存放数据比较单一,比较少

HttpSession相当于客户在服务端的私人保险柜,可以存放的数据比较多,并且种类丰富。 3.命令实现: 同一个网站下OneServlet将数据传递给TwoServlet

OneServlet{
   public void doGet(HttpServletRequest req,HttpServletResponse resp){
       //1.调用请求对象向Tomcat索要当前用户在服务端的私人储物柜
       HttpSession session=req.getSession();
       //2.将数据添加到用户私人储物柜
       session.setAttribute("key1",共享数据);
  }
}

浏览器访问/myweb中的TwoServlet

TwoServlet{
   publid void doGet(HttpServletRequest req,HttpServletResponse){
       //1.调用请求对象向Tomcat索要当前用户所在服务端的私人储物柜
       HttpSession session = req.GetSession();
       //2.从会话作用域对象得到OneServlet提供的共享数据
       Object 共享数据 =session.getAttribute("key1");
  }
}

4.getSession()与getSession(false)

1)getSession():如果当前用户在服务端已经拥有了Cookie,要求tomcat将相关记录进行返回,如果当前用户在服务端尚未拥有自己的cookie,则要求tomcat为当前用户创建一个全新的cookie

2)getSession(false):如果当前用户在服务端已经拥有了自己的cookie,则要求tomcat将相关记录进行返回,如果当前用户在服务端尚未拥有自己cookie,则tomcat将返回null

5.Httpsession销毁时机

1.用户与HttpSession关联时使用的Cookie只能存放在浏览器缓存中,

2.在浏览器关闭时,意味着用户与他的HttpSession关系被切断

3.由于Tomcat无法检测浏览器何时关闭,因此在浏览器关闭时并不会导致tomcat将浏览器关联的HttpSession进行销毁。

4.为了解决这个问题,Tomcat为每一个HttpSession对象设置【空闲时间】,这个空闲时间默认30分钟,如果当前HttpSession对象空闲时间达到30分钟,此时Tomcat认为用户已经放弃了自己的HttpSession,此时Tomcat就会销毁掉这个HttpSession。

6.HttpSession空闲时间手动设置

在当前网站/webapp/WEB-INF/web.xml

<session-fonfig>
   <!--当前网站中每一个session最大空闲时间为5分钟-->
<session-timeout>5</session-timeout>
</session-fonfig>

 

HttpServletRequest接口实现数据共享

1.介绍:

1)在同一个网站中,如果两个Servlet之间通过【请求转发】方式进行调用,彼此之间共享同一个请求协议包,而一个请求协议包只对应一个请求对象,因此servlet之间共享同一个请求对象,此时可以利用这个请求对象在两个Servlet之间实现数据共享。

2)在请求对象实现Servlet之间数据共享功能时,开发人员将请求对象称为【请求作用域对象】

2.命令实现:OneServlet通过请求转发申请调用TwoServlet时,需要给TwoServlet提供共享数据

OneServlet{
   public void doGet(HttpServletRequest req,HttpServletResponse response){
       //1.将数据添加到【请求作用域对象】中attribute属性
       req.setAttribute("key1",数据);//数据可以是任意类型,Object
       //2.向Tomcat申请调用TwoServlet
       req.getRequestDispatcher("/two").forward(req,resp);
  }
}
TwoServlet{
   public void doGet(HttpServletRequest req,HttpServletResponse resp){
       //从当前请求对象得到OneServlet写入到共享数据
       Object 数据=req.getAttribute("key1");
  }
}

Servlet规范扩展--------监听器接口

1.介绍:

1)一组来自于Servlet规范下接口,共有8个接口,在Tomcat存在servlet-api.jar包

8个接口有:

1)ServletContextListener接口

2)ServletContextAttributeListener接口

2)监听器接口需要由开发人员亲自实现,Http服务器提供jar包并没有对应的实现类

3)监听器接口用于监控【作用域对象生命周期变化时刻】以及【作用域对象共享数据变化时刻】

2.作用域对象:

1)在Servlet规范中,认为在服务端内存中可以在某些条件下为两个Servlet之间提供数据共享方案的对象,被称为【作用域对象】

2)Servlet规范下作用域对象

ServletContext: 全局作用域对象

HttpSession : 会话作用域对象

HttpServletRequest: 请求作用域对象

3.监听器接口实现类开发规范:三步

1)根据监听的实际情况,选择对应监听器接口进行实现

2)重写监听器接口声明【监听事件处理方法】

3)在web.xml文件将监听器接口实现类注册到Http服务器

4.ServletContextListener接口:

1)作用:通过这个接口合法的监测全局作用域对象被初始化时刻以及被销毁时刻。

2)监听事件处理方法:

public void contextInitlized() :在全局作用域对象被Http服务器初始化被调用

public void contextDestory() :在全局作用域对象被Http服务器销毁时被触发调用。

5.ServletContextAttributeListener接口:

1)作用:通过这个接口合法的监测全局作用域对象共享数据变化时刻

2)监听事件处理方法:

public void contextAdd() :在全局作用域对象添加共享数据

public void contextReplaced() :在全局作用域对象更新共享数据

public void contextRemove() :在全局作用域对象删除共享数据

6.全局作用域对象共享数据变化时刻:

ServletContext application=request.getServletContext();

application.setAttribute("key1",100); //新增共享数据

application.setAttribute("key1",200); //更新共享数据

application.removeAttribute("key1"); //删除共享数据

Servlet规范接口-------Filter接口(过滤器接口)

1.介绍:

1)来自于Servlet规范下接口,在Tomcat中存在于servlet-api.jar包

2)Filter接口实现类由开发人员负责提供,Http服务器不负责提供

3)Filter接口在Http服务器调用资源文件之前,对Http服务器进行拦截

2.具体作用

1)拦截Http服务器,帮助Http服务器简称当前请求的合法性

2)拦截Http服务器,对当前请求进行增强操作

3.Filter接口实现类开发步骤:三步

1)创建一个Java类实现Filter接口

2)重写Filter接口中的doFilter方法

3)web.xml将过滤器接口实现类注册到Http服务器

4.Filter拦截地址格式

1)命令格式

<Filter-mapping>
<filter-name>oneFilter</filter-name>
   <url-pattern>拦截地址</url-pattern>
</Filter-mapping>

2)命令作用:

拦截地址通知Tomcat再调用何种资源文件之前需要调用OneFilter过滤进行拦截

3)要求Tomcat再调用某一个具体文件之前,来调用OneFilter拦截

<url-pattern>/文件夹名/具体文件名</url-pattern>

4)要求Tomcat再调用某一个文件夹下所有的资源文件之前,来调用OneFilter拦截

<url-pattern>/文件夹名/*<url-pattern>

5)要求Tomcat在调用任意文件夹下某种类型文件之前,来调用OneFilter拦截

                            <url-pattern>*.jpg</url-pattern>    

<!--此语句调用的是一个jpg文件-->

6)要求Tomcat在调用网站中任意文件是,来调用OneFilter拦截

                <url-pattern>/*</url-pattern>

互联网通信流程图

 

 

posted @ 2021-10-03 19:23  AMHAO  阅读(97)  评论(0编辑  收藏  举报