servlet 2020-7-6

1.servlet的概念:是server Applet的缩写,指服务器应用程序,用来交互式的处理客户端发送的请求并完成相应的响应,是一项动态网页技术;是Java web程序开发的基础和javaee的重要组成部分

2.servlet的作用:接收客户端请求,完成操作,动态的生成网页,将包含操作结果的动态网页响应给客户端

3.补充:servlet的作用:指定【动态资源文件】开发步骤
                       指定http服务器调用动态资源文件规则
                       指定http服务器管理动态资源文件实例对象规则
4.servlet实现类接口;1.servlet接口来自于servlet规范下一个接口,这个接口存在于http服务器提供的jar包
                     2.Tomcat服务器下的lib文件由一个servlet.api.jar存放servlet接口(javax.servlet.Servlet接口)
                     3.http服务器能调用【动态资源文件】必须是一个servlet接口实现类
注意:不是所有的Java类都是动态资源文件,只有实现了servlet接口的Java类才是动态资源文件,才能被Tomcat服务器所调用

5.servlet接口实现类开发步骤:
    1.创建一个Java类继承HttpService父类,使成为一个servlet接口实现类
    2.重写HttpService父类两个方法,dopost 或 doget
    3.将service接口实现类信息【注册】到Tomcat服务器
    【网站】--》【web】--》【web_INF】-->web.xml
    <!--将servlet接口实现类类路径地址交个Tomcat-->
    <servlet>
        <servlet-name>mm</servlet-name><!--声明一个变量来存储servlet接口实现类类路径-->
            <servlet-class>com.bingjingpoer.onesertvlet</servlet-class><!--声明servlet接口实现类类路径-->
        </servlet>
    <!--为了降低用户访问servlet接口实现类难度,需要设置简短别名-->
    <servlet-mapping>mm</servlet-mapping>
    <url-pattern>/one</url-pattern><!--注意:别名要以/开头-->
    

6.Tomcat根据servlet规范调用servlet接口实现类规则:
    1.Tomcat有权创建servlet接口实现类实例对象 Servlet oneservlet=new Oneservlet();
    2.Tomcat根据实例对象调用service()方法处理当前请求 oneservlet.service();

7.servlet对象生命周期:
    1.网站中所有的servlet接口实现类的实例对象,只能由http服务器负责创建
    2.在默认情况下,http服务器接收到对于当前servlet接口实现类第一次请求时,自动创建这个servlet接口实现类对象
    3.在手动配置情况下,要求http服务器在启动时自动创建某个servlet接口实现类对象
    <servlet-name>mm</servlet-name>
    <servlet-class>com.dayo1.oneservlet</servlet-class>
    <load-on-start>20</load-on-start>
    4.在http服务器运行期间,一个servlet接口实现咧只能被创建一个实例对象
    5.在http服务器关闭时,自动将网站中所有的servlet对象烧毁

8.HttpServletResponse接口:
    1.介绍
        HttpServletResponse接口来自于servlet规范中
        HttpServletResponse接口实现类由http服务器负责提供
        HttpServletResponse接口负责将doget/dopost方法执行结果写入到响应体交给浏览器
        我们习惯将HttpServletResponse接口修饰的对象称【响应对象】
    2.主要功能:
        1.将执行结果以二进制的形式写入到【响应体】
        2.设置响应头中【content-type】属性值,从而控制浏览器使用对应的编译器将响应体二进制数据编译
        3.设置响应头【location】属性,将一个请求地址赋值给location,从而控制浏览器向指定服务器发送请求;

9.HttpServletRequest接口:
    1.介绍:HttpServletRequest接口负责在doget/dopost方法运行时读取http请求协议包中信息,我们习惯将它修饰的对象称为【请求对象】
    2.作用:
        1.可以读取http请求协议包中【请求行】信息
        2.可以读取保存在http请求协议包中【请求头】或【请求体】的参数信息
        3.可以代替浏览器向http服务器申请资源文件调用
    
10.在doget方法中,执行的结果需要发送到响应包中在浏览器上显示,我们可以在方法中使用响应对象response向服务器借输出流,通过输出流可以输出我们的数据到响应体,从而在浏览器显示,代码如下;
    PrintWriter writer =response.getWriter();
    writer.println(我们想要发送的数据);

11.在默认情况下,浏览器的content-type属性值为“text”文本编译器;所以我们需要在得到输出流之前,通过响应对象对响应头中【content-type】属性进行重新赋值用于给浏览器采用指定编译器解析数据;代码如下:
        Stringresult="hello<br>World<br>java<br><b>welcome</b>";
        resp.setContentType("text/html");
打印中文:resp.setContentType("text/html;charset=utf-8");
可以通过响应对象将地址赋值给响应头中的location属性;浏览器会自动将location的值在地址栏上发送请求;代码如下:
    String re2="http://www.baidu.com";
        resp.sendRedirect(re2);

12.URI:资源文件精准定位符,是从URL上截取的一个字符串,格式:/网站名/资源文件名。它用于让http服务器对被访问的资源文件的定位

13.浏览器以get方式发送请求,请求参数保存在【请求头】,在http请求协议包到达http服务器后,第一件事就是解码,【请求头二进制内容】由【Tomcat】负责解码,Tomcat默认使用【utf-8】字符集,能解释世界上所有的文字;
   浏览器以post方式发送请求,请求参数保存在【请求体】,在http请求协议包到达http服务器后,第一件事就是解码,【请求体二进制内容】由当前请求对象负责解码,请求对象默认使用ISO字符集,是一个东欧语系;
    解决方案;在post请求方式下,在读取请求体内容之前,应该通知请求对象使用utf-8字符集对请求体内容编码;代码演示:
    req.setCharacterEncoding("utf-8");

14.请求对象和响应对象生命周期;
    1.在http服务器接收到浏览器发送的【http请求协议包】后,自动为当前的【http请求协议包】生成一个【请求对象】和【响应对象】
    2.在http服务器调用doget/dopost方法时,负责将【请求对象】和【响应对象】作为参数传递到方法,确保doget/dopost正确执行
    3.在http服务器准备推送http响应协议包之前,负责将本次请求关联的【请求对象】和【响应对象】烧毁;

15.欢迎资源文件
    1.前提;用户记住网站名,但是不会记住网址资源文件地址        2.默认欢迎资源文件;用户发送一个针对某个网站的【默认请求】时,此时由http服务器自动从当前网站返回的资源文件
    正常请求;http://localhost:8080/myWeb/index.html
    默认请求:http://localhost:8080/myWeb/;
    3.Tomcat对于默认欢迎资源文件定位规则;
        1.<welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
依次去找,还没找打,打回404;
    4.设置当前网站的默认欢迎资源文件规则:
        1.在当前网站的web/WEB-INF/web-xml
        2.规则:如上代码演示

16.http状态码:
    1.介绍:由三位数字组成,http服务器在推送响应包之前,根据本次请求处理情况将状态码写入到响应包中【状态行】
    如果http服务器针对本次请求,返回对应的资源文件,通过状态码通知浏览器应该如何处理结果;如果没找到对应的资源文件,状态码就会告知浏览器不能提供服务的原因
    2.分类;(举例常见的状态码)
        100:通知浏览器本次返回的资源文件不是独立资源文件,需要浏览器继续向服务器索要依赖的文件(你在发起一次呗,我给你依赖文件哦)
        200:通知浏览器本次返回的资源文件是独立资源文件(亲,我已经全部给你了哦)
        302:通知浏览器本次返回的是资源文件地址,需要浏览器根据这个地址自动发起请求索要资源文件,例如:                     resp.sendRedirect("http://www.baidu.com");(亲,响应对象给了你一个地址,你在去找哦)
        404:告知浏览器在服务端没有找到资源文件(不好意思,没找到哦)
        405:通知浏览器在服务端已经定位到被访问的servlet,但是这个servlet处理浏览器采用的请求方式不对(亲,servlet的方法和浏览器的请求方式不同哦)
        500:告诉浏览器,在服务端找到了servlet,但是在运行时出现了异常;(亲,servlet在测测呗,有bug哦)

17.多个servlet之间的调用规则:
    1.前提条件:某些来自于浏览器的请求,往往需要服务端多个servlet协同处理,但是浏览器一次只能访问一个servlet,导致用户需要手动通过浏览器发送多次请求
    2.我们到设置无论本次请求涉及多少个servlet,用户只需要请求一次即可;
    3.处理方法:
        1.重定向解决方案
        2.请求转发

18.补充上面:浏览器请求;通过地址栏请求是get方式,通过超链接请求是get方式,表单可以get或者post;

19.重定向:
    1.工作原理:用户第一次通过【手动方式】通知浏览器访问servlet,oneservlet工作完毕后,将twoservlet的地址写入到响应包李的响应头,location属性中,Tomcat将302状态码写入到状态行中,浏览器在接收到响应包后,读取302状态码,通过location属性的地址发起第二次请求,访问twoservlet........
    2.实现命令:resp.sendRedirect("请求地址")
    3.特征
        1.请求地址:既可以把当前网站内的资源文件地址发送给浏览器(/网站名/资源文件名) 也可以把其他网站的资源文件地址发送给浏览器(http://ip地址:端口号/网站名/资源文件名)
        2.请求次数;浏览器至少发送两次请求,第一次由用户发送;
        3.请求方式:在重定向中,通过地址栏通知浏览器发起下一次请求,因此通过重定向调用的资源文件接收的请求一定是get方式;
    4.缺点:重定向需要在浏览器与服务器之间进行多次往返,大量时间消耗在往返上,增加用户等待时间

20.请求转发
    1.原理:用户第一次通过手动方式要求浏览器访问oneservlet。oneservlet工作完毕后,通过当前请求对象代替浏览器向Tomcat发送请求,申请调用twoservlet。Tomcat在接收到这个请求后,自动调用twoservlet来完成剩余任务;

    2.实现命令:请求对象代替浏览器向Tomcat发送请求
    RequestDispatcher report=req.getRequestDispatcher("/资源文件名") 注意:千万不能写网站名,格式一定要记清楚!
            将报告对象发送给Tomcat
    report.forword(当前请求对象,当前响应对象)
注意;这里的dispatcher是 调度员 的意思(将资源调配,分配,指定)
    3.优点:
        1.无论本次请求涉及到多少个servlet,用户只需要手动发送一次请求
        2.servlet之间调用发生在服务端计算机,节省了服务器与浏览器之间通信的时间,增加了处理速度;
    4.特征:
        1.浏览器只需要发送一次请求
        2.只能向Tomcat申请调用当前网站下的资源文件地址
        3.在请求转发过程中,浏览器只发送一个http请求协议包,参与本次请求的所有servlet共享同一个请求协议包,因此,这些servlet接收的请求方式与浏览器发送的请求方式保持一致;

21.多个servlet之间数据共享实现方案;
    1.数据共享;oneservlet工作完毕后,将产生的数据交给twoservlet来使用
    2.servlet规范中提供四种数据共享方案:
        1.ServletContext接口
        2.Cookie接口        
        3.HttpSession接口
        4.HttpServletRequest接口

22.ServletContext接口
    1.介绍:来自于servlet规范中一个接口,在Tomcat中存在servlet-api.jar,在Tomcat中负责提供这个接口实现类
            2.如果两个servlet来自于同一个网站,彼此之间通过网站的ServletContext对象实例实现数据共享
            3.开发人员习惯将ServletContext对象称为【全局作用域对象】       
    2.工作原理:每一个网站都存在一个全局作用域对象,这个对象相当于【Map】,在这个网站中oneservlet可以将一个数据存入到全局作用域对象,每当网站中其他servlet都可以从这个对象中得到数据

    3.全局作用域对象的生命周期:
        1.在http服务器启动时,自动为当前网站创建一个全局作用域对象;
        2.在http服务器运行期间,只能存在一个全局作用局对象;
        3.在http服务器运行期间,全局作用域对象一致处于存活状态;
        4.在http服务器关闭时,服务器将当前网站的全局作用域对象销毁;
总结一句话:全局作用域对象生命周期贯穿网站整个运行期间;

    4.代码实现:【同一个网站】oneservlet将数据共享给twoservlet
        1.通过请求对象向Tomcat索要当前网站中【全局作用域对象】ServletContext application=req.getServletContext();
        2.将数据添加到全局作用域对象作为【共享数据】application.setAttribute("key1",数据)
        3.从全局作用域对象中得到指定关键字对应数据 Object 数据=application.getAttribute("key1");
注意啊:全局作用域对象相当于是map集合,我们可以往里面添加任何数据,而它是占用服务端计算机内存的,如果我们不断往里面添加数据,会导致服务器爆炸,所以啊,普通的程序员只配从里面取数据,只有高级程序员才能往里面添加数据;

 23.Cookie
    1.介绍:
        1.Cookie来自于Servlet规范中一个工具类,存在于Tomcat提供的servlet-api.jar
        2。如果两个servlet来自于同一个网站,并且为同一个浏览器/用户提供服务,此时,借助于Cookie对象进行数据共享
        3.Cookie存放当前用户的私人信息,在共享数据过程中提高服务质量
        4.在现实生活中, Cookie相当于用户在服务端得到【会员卡】
    2.原理:用户通过浏览器第一次向MyWeb网站发送请求申请Oneservlet,oneservlet在运行期间创建一个Cookie存储于当前用户相关的数据,oneservlet工作完毕后,【将Cookie写入到响应头】交还给当前浏览器,浏览器收到响应包后,将Cookie存储在浏览器的缓存中,一段时间后,用户通过【同一个浏览器】向【MyWeb网站】发送请求申请oneservlet,【浏览器无条件的将MyWeb网站之前推送过来的Cookie写入到请求头】发送过去;此时,twoServlet在运行时,就可以通过读取请求头中Cookie的信息,得到oneservlet 提供的共享数据;
        
    3.实现命令:同一个网站 oneServlet与twoServlet借助于Cookie实现数据共享。在oneServlet中:
        1.创建Cookie对象,保存共享数据
        Cookie card=new Cookie(“key1”,"abc")
        Cookie card2=new Cookie("key2","dej")
注意:Cookie相当于一个Map,但是一个Cookie只能存放【一个】键值对,并且这个键值对的key和 value必须是String,并且key不能是中文
        2.将Cookie写入到响应头,交给浏览器
        resp.addCookie(card);
        resp.addCookie(card2);.....有几个Cookie就发几次
在twoServlet中
        1.调用请求对象从请求头得到浏览器返回的Cookie
        Cookie cookieArray=req.getCookies(); 返回一个数组              2.循环遍历数组
        for(Cookie card:cookieArray){
            String key=card.getName();
            String value=card.getValue();}

24.HttpSession接口:
    1.介绍:HttpSession接口来自于Servlet接口规范下一个接口,存在于Servlet-api.jar,其实现类由http服务器提供,Tomcat提供实现类存在于Servlet-api.jar
    2.如果两个Servlet来自同一个网站,并且为同一个浏览器/用户服务,借助于HttpSession对象进行数据共享
    3.开发人员习惯将HttpSession接口修饰对象称为【会话作用域对象】
    
25.HttpSession与Cookie的区别:(重点)
    1.存储位置:一个在天上,一个在底下
    Cookie存放于客户端计算机(浏览器内存),HttpSession存放于服务端计算机内存
    2.数据类型:
    Cookie对象只能存储String类型,HttpSession对象可以存储任意类型的数据Object
    3.数据数量:
    一个Cookie对象只能存放一个共享数据,HttpSession使用map集合存储,可以存储任意数量的数据;
    4.参照物;
    Cookie相当于用户在服务端的【会员卡】,HttpSession相当于用户在服务端的【私人储物柜】

    实现命令:在oneServlet中:
    1.调养请求对象向Tomcat索要当前用户在服务端的私人储物柜
        Httpsession session=req.getSession();
    2.将数据添加到用户私人储物柜
        session.setAttribute("key1",共享数据)
        
                  在twoServlet中:
    1.调用请求对象先Tomcat索要当前用户的私人储物柜
        HttpSession session=req.getSession();
    2.从会话作用域对象得到oneServlet提供的共享数据
        Object 数据=session.getAttribute("key1");

26.getSession()与 getSession(false)
    1.getSession():如果当前用户在服务端已经拥有了自己的私人储物柜,要求Tomcat将这个私人储物柜进行返回,如果没有,Tomcat为当前用户创建一个新的私人储物柜(认识,大气)

    2.getSession(false):如果当前用户在服务端已经拥有了自己的私人储物柜,要求Tomcat将这个私人储物柜进行返回,如果没有,Tomcat返回null;(不认识,小气,谨慎)

27.Http服务器如何将用户与HttpSession关联:Cookie(相当于一个箱号)

28.HttpSession销毁时机:
    1.用户与HttpSession关联时使用的Cookie只能存放于浏览器缓存,在浏览器关闭时,意味着用户与她的HttpSession关系被切断,由于Tomcat无法检测到浏览器何时关闭,因此,Tomcat不会讲关联用户的HttpSession销毁
    2.为了解决问题,Tomcat为 每一个HttpSession对象设置【空闲时间】,默认30分钟,如果当前HttpSession对象空闲时间到达了30分钟,此时Tomcat认为用户已经放弃了HttpSession,就会销毁它
    3.HttpSession空闲时间手动设置:
        1.在WEB-INF下设置
        2.<session-config>
            <session-timeout>5</session-timeout>
          </session-config>

29.httpServletRequest接口实现数据共享:
    1.介绍:在同一个网站中,如果两个Servlet之间通过【请求转发】方式进行调用,彼此之间共享同一个请求协议包,而一个请求协议包对应一个请求对象,因此,Servlet之间共享同一个请求对象,
    2.在请求对象实现Servlet之间的数据共享时,开发人员将请求对象称为:【请求作用域对象】

    3.命令实现;在oneServlet中
        1.将数据添加到【请求作用域对象】中attribute属性
        req.setAttrubute("key1",数据)//数据类型可以是任意类型
        2.向Tomcat申请调用twoServlet
        req.getRequestDispatcher("/two").forward(req,response)

             在twoServlet中
        1.从当前请求对象得

30.监听器接口:
    1.介绍:
        1.一组来自于Servlet规范下接口,共有8个接口,在Tomcat中的Servlet-api.jar
        2.监听器接口需要由开发人员实现,http服务器提供jar包并没有实现类;
        3.监听器接口用于监听【作用域对象生命周期变化时刻】和【作用域对象共享数据变化时刻】

    2.作用域对象
        1.在Servlet规范中,认为在【服务端内存中】可以在某些条件下为两个Servlet提供数据共享的对象是【作用域对象】
        2.Servlet规范下的作用域对象
            ServletContext:全局作用域对象
            HttpSession:会话作用域对象
            HttpServletRequest:请求作用域对象

    3.监听器接口实现类开发规范:三步
        1.根据监听的实际情况,选择对应的监听器接口进行实现
        2.重写监听器接口声明【监听书剑处理方法】
        3.在WEB-INF中注册监听器接口实现类到http服务器,代码如下:
         <listener>
                <listener-class>com.Listener.oneListener</listener-class>
             </listener>

31.ServletContextListener接口:
    1.作用:通过这个接口合法的监测全局作用域对象被初始化时刻和被销毁时刻
    2.监听事件处理方法;
        public void contextInitlized():在全局作用域对象被http服务器初始化被调用;
        public void contextDestory();在全局作用域对象被http服务器销毁时触发调用

32.ServletContextAttribute接口:
    1.作用:通过这个接口合法的监测全局作用域对象共享数据变化时刻
    2.监听事件处理方法:
        public void contextAdd():在全局作用域对象添加共享数据
        public void contextReplaced();在全局作用域对象更新共享数据
        public void contextRemove();删除时

    3.全局作用域对象共享数据变化时刻:
        ServletContext s=req.getServletContext();
        s.setAttribute("key1","hello");//添加
        s.setAttribute("key1","welcome");//更新
        s.removeAttribute("key1")//删除

33.Servlet规范扩展------Filter接口(过滤器接口)
    1.具体作用:
        1.拦截http服务器,帮助http服务器监测当前请求【合法性】
        2.拦截http服务器,对当前请求进行【增强操作】
    2,Fileter接口实现类开发步骤:三步
        1.创建一个Java类实现Filter接口
        2.重写Filter接口中doFilter方法
        3。在WEB-INF中的web.xml中注册

    3.原理:在filter实现类中的doFilter方法中进行拦截,判断条件是否符合,如果符合,放行--就调用filterChain对象将请求对象和响应对象返回给Tomcat,如果不符合,拦截--调用响应对象打回响应包

34.Filter过滤器拦截地址格式:
    1.命令格式:
        <filter-mapping>
            <filter-name>oneFilter</filter-name>
            <url-pattern>拦截地址</url-pattern>
         </filter-mapping>

    2.命令作用:拦截地址通知Tomcat在调用何种资源文件之前需要调用oneFilter过滤进行拦截

    3.要求Tomcat在调用某一个具体文件之间,来调用oneFilter拦截
        <url-pattern>/img/mm.jpg</url-pattern>
    4.要求Tomcat在调用某个文件夹下的所有资源文件之前调用oneFilter拦截
        <url-pattern>/img/*</url-pattern>

    5.要求Tomcat在调用任意文件夹下某种类型文件之间,来调用oneFilter拦截
        <url-pattern>*.jpg</url-pattern>

    6.要求Tomcat在调用网站中任意文件时,调用oneFilter来拦截
        <url-pattern>/*</url-pattern>

35.最后个人总结:HttpSession对象俗称我们说的会话作用域对象,它相当于用户在服务端的私人储物柜,它存放于服务端内存,然后进入用户登录的Servlet后,我们要手动的向Tomcat申请给用户创建一个HttpSession对象(私人储物柜),然后往里面存放共享数据,然后Tomcat自动生成一个Cookie(JSesson...)来表示HttpSession,相当于它的箱号,Cookie会通过响应对象存入响应头发送给浏览器,然后Cookie存放于用户浏览器的内存,当用户再次通过相同的浏览器向相同的网站发起请求时,Cookie就从内存中跑出来,存入请求包中的请求头,发送给浏览器,浏览器根据这个Cookie来判断这个用户是否有HttpSession(私人储物柜),这个时候,产生了两种方法,getSession()和getSession(false);前者在查到这个用户没有私人储物柜时自动为这个用户创建一个私人储物柜,后者当查到用户没有HttpSession时,打回null;
    根据上述原理,我们可以生成恶意登录解决方案,我们可以在filter实现类中的方法中设置拦截任意请求,然后判断,是login意思的请求或者默认请求的方式放行,通过这一轮筛选,如果是正常请求,用户在服务端内存就已经存在一个私人储物柜,如果是恶意登录,就没有,我们在第二轮筛选时只要判断用户的HttpSession是否存在就能判断用户是否是恶意登录;

总结二:filter实现类一般存放在filter包,listener实现类一般存放于listener包中;



        


原文地址:https://www.cnblogs.com/1877chl/p/13257864.html