Java Web基础知识(Servlet、Cookie、Session、Filter、Listener)

Java Web基础知识(Servlet、Cookie、Session、Filter、Listener)

码农世界 2024-06-04 前端 100 次浏览 0个评论

文章目录

  • Servlet
    • 什么是Servlet?
    • Servlet的生命周期
    • ServletConfig对象
    • ServletContext对象
    • Servlet请求转发和重定向
      • Servlet请求转发(forward和include)
      • Servlet重定向(redirect)
      • 重定向和转发的区别?
      • 读取文件、下载文件
      • 会话管理
        • Cookie
          • 什么是Cookie?
          • Cookie的特点:
          • Cookie具体使用:
          • Session
            • HttpSession 保存信息过程
            • HTTP Session的特点:
            • HttpSession的用法:
            • Session的销毁方式
            • Session生命周期?
            • Cookie、Session区别?
            • Servlet三个域对象
            • Filter
            • Listener

              Servlet

              什么是Servlet?

              1. Servlet是运行在Web服务器中的小型Java程序,侠义的Servlet是实现了Java语言实现的一个接口,广义的Servlet是任何实现了这个Servlet接口的类,作用是:接受用户的请求,并对请求做出处理,将处理结果响应给客户端。
              2. Servlet有三种实现方式:实现Servlet接口,继承抽象类GennericServlet,继承HttPServlet。
              3. Servlet是可以接受HTTP请求并做出相应的一种结束,是Java语言编写的一种动态资源。
              4. Servlet是前后端衔接的一种技术,不是所有的Java类都可以接受请求和做出相应,但是Servlet可以。

                在MVC模式中,Servlet作为Controller层主要技术,用来和浏览器完成数据交互,控制交互逻辑。

              5. Servlet的工作模式:客户端发送请求至服务器,服务器运行并调用Servlet,Servlet根据客户端请求生成相应内容并将其传给服务器,相应内容动态生成,通常取决于客户端的请求,服务器将相应返回客户端。
              6. Servlet是Tomcat的一个组件,Servlet的功能需要依赖包servlet-api.jar,由Tomcat提供,Tomcat在初始化Servlert时候首先读取web.xml文件,根据web.xml文件中的参数信息初始化ServletConfig,ServletContext对象,同时帮助我们创建HttpServletRequest和HttpServletResponse对象一并交给Servlet实例,此时Servlet就具有了相关的功能。

              Servlet的生命周期

              Servlet的生命周期是由容器管理的,Servlet容器会根据下面的规则来调用三个方法:

              1. 初始化方法init(),只会执行一次(启动Tomcat的时候默认是不执行的,在访问的时候才会执行,但是可以根据web.xml中的配置更改为容器启动并初始化),当Servlet第一次被请求时,Servlet容器会实例化这个Servlet,然后就会调用init()方法来初始化Servlet,然后后续请求时,这个方法就不会再被执行,一般用来完成初始化工作。
              2. 服务方法service(),每当请求Servlet时,Servlet容器就会调用这个方法,第一次请求时,Servlet就会初始化一个Servlet对象,然后调用service()方法来完成工作,后续请求就直接调用service()方法。
              3. 销毁方法destory(),当要销毁Servlet时候,Servlet容器就会调用这个方法,卸载应用程序或者关闭Servlet容器时候,就会执行这个方法,一般用来写一些清楚工作代码。

              ServletConfig对象

              每个Servlet都有一个ServletConfig对象,ServletConfig对象对应web.xml中的节点,Servlet初始化后就会Servlet的配置信息封装到ServletConfig中,例如:

              
                
                  ServletLifeCycle
                  com.xxliao.servlet.ServletLifeCycle
                  
                  1
                  
                  
                    author
                    xxliao
                  
                
              
              ServletConfig获取参数方式,例如:
              ServletConfig servletConfig = this.getServletConfig();
              System.out.println(servletConfig.getServletName());
              System.out.println(servletConfig.getInitParameter("author"));
              

              ServletContext对象

              Servlet上下文对象,一个Webapp程序一个ServletContext对象。Web容器启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,这个对象全局唯一,web程序中的所有Servlet共享这个对象,因此也叫全局应用共享对象。具体配置参数使用标签进行配置,例如:

              
                
                  author
                  xxliao
                
              
              // ServletContext获取参数例子:
               ServletContext servletContext = this.getServletContext();
               System.out.println(servletContext.getInitParameter("author-context"));
              

              ServletContext的生命周期:Servlet容器启动时候,就会创建ServletContext对象,然后一直缓存这个对象,直到容器关闭后该对象生命周期结束。

              Servlet请求转发和重定向

              Servlet请求转发(forward和include)

              请求转发是在服务器中进行的转发,由一个Servlet转发到另一个Servlet,然后返回客户端的请求方式,浏览器端的地址栏不会发生改变,只发送了一次请求,两次跳转之间传输的数据不会丢失,可以通过request对象进行传递,根据response是否能够传递,请求转发分为forward转发(不传递)和include转发(传递),具体代码为:

              request.getRequestDispatcher(“接quest受请求的Servlet的路径”).forward(request,response)

              request.getRequestDispatcher(“接quest受请求的Servlet的路径”).include(request,response)

              两种方式的区别:

              1.forward在servlet传递间,不能输出响应体,include可以输出相应体

              2.forward不能设置响应体,但是可以设置响应头,include响应头和响应体均可以设置。

              Servlet重定向(redirect)

              Servlet的重定向是,服务器告诉客户端,你需要重新发送一个请求,到一个target路径,因此浏览器需要发送两次请求,且请求地址会发生改变,具体使用代码为:response.sendRedirect(targetUrl);

              重定向和转发的区别?

              1. 对于客户端来说,转发是一次请求一次响应,重定向是两次请求两次响应。
              2. 请求转发浏览器地址栏不会发生变化,重定向会变化成功转发后的URL。
              3. 转发不支持跨域跳转,只能在项目内转发,重定向则不受限制。
              4. 转发之间可以传递request对象,重定向不能,本质是两次请求。

              读取文件、下载文件

              //读取文件:
              InputStream is = this.getServletContext().getResourceAsStream("/WEBINF/classes/com/xxliao/servlet/aa.properties");
              //下载文件:
              ServletOutputStream out = resp.getOutputStream();
              out.write
              

              会话管理

              Http协议本身不具备直接记录用户状态的功能,JavaWeb提供了Cookie和Session技术来帮助我们记录用户的状态。

              Cookie

              什么是Cookie?

              Cookie是一种保存少量信息到浏览器端的技术,请求时服务器段可以给浏览器一些Cookie信息保存下来,后续请求可以携带之前的Cookie信息到服务器端。

              Cookie的特点:

              1. Cookie使用字符串保存实句,使用的是key-value的数据结构存储,单个Cookie的存储大小限制是4097字节。
              2. ]Cookie存储的数据不支持中文,Servlet4.0中支持,4.0之前保存中文可以采用编码和解码处理方式,具体为:

                将内容按照指定的编码方式做URL编码处理:URLEncoder.encode(“content”,“code”)

                将内容按照指定的编码方式做URL解码处理:URLDecoder.decode(“content”,“code”)

              3. Cookie分为状态Cookie(保存在内存中)和持久化Cookie(保存在磁盘上)。
              4. Cookie是与域名绑定,所以Cookie不支持跨一级域名访问。
              5. 浏览器能保存的Cookie个数是有限的,不同浏览器支持的数量不同。
              6. 浏览器每次请求时,都会将访问域名相关的Cookie携带到服务端。
              7. Cookie是基于明文的方式存储的,所以安全性较低。

              Cookie具体使用:

              1. Cookie的创建:

                Cookie cookie = new Cookie(“key”,”value“);

                resp.addCookie(cookie); //添加到response 对象中

              2. Cookie获取:

                Cookie[] cookies = req.getCookies();

              3. 设置Cookie的过期时间

                cookie.setMaxAge(time);ime是描述,一旦设置后cookie将保存到磁盘中,当失效时间到达后再删除。

              Session

              HttpSession 保存信息过程

              HttpSession是一种保存少量信息到服务器的一种技术,具体保存过程是:

              1. 第一次请求时,服务器端会创建HttpSession对象,然后将数据保存在该对象后,服务器端会将HttpSession的JSESSIONID以Cookie形式响应给浏览器。
              2. 第二次请求,浏览器会携带之前JSESSJIONID的Cookie,服务器端根据JSESSIONID对象获取对对应的HttpSession对象,然后从HttpSession对象中获取缓存的数据,

              HTTP Session的特点:

              1.HttpSession保存到服务器端,也是使用key-value的存储结构存储数据,其中value可以是任何数据类型。

              2.HttpSession保存数据没有大小限制。

              HttpSession的用法:

              1. 创建Session:

                HttpSession session = request.getSession();第一次获取则创建该对象,后面根据JSESSIONID获取已经创建的对象。

                HttpSession session = request.getSession(false);根据JSESSIONID获取对象, 有则返回,没有不会创建新对象。

              2. 将数据存储在Session中:

                session.setAttribute(“key”,value);

              3. 根据key,从session中获取数据:

                Object obj = session.getAttribute(“key”);

              4. 根据key删除Session数据:

                session.removeAttribute(“key”);

              Session的销毁方式

              1.通过web.xml中设置超市时间(最大不活动时间)

              
                
                  60
                
              
              1. session.invalidate(),销毁当前HTTP Session对象

              Session生命周期?

              Session的生命周期没有固定的创建和销毁时间,合适创建取决于合适调用getSession()方法,HttpSession的销毁时间取决于设置的最大不活动时间或者调用invalidate()方法,如果均没有,那么HttpSession会一直存储,默认超时时间为30分钟。

              Cookie、Session区别?

              1. Cookie保存到客户端,Session保存到服务端,
              2. Cookie不安全,HttpSession安全
              3. Cookie保存数据有限制(单个容量4K,浏览器个数闲置)

              Servlet三个域对象

              1. request:一次请求有效,请求转发可以进行数据传递,生命周期和request对象周期相同。
              2. session:单词会话有效,可以跨多个请求。
              3. application:当前web服务内,跨请求,跨会话。
              // 1.设置数据
              域对象.setAttribute("key",value)
              // 2.获取数据
              域对象.getAttribute("key")
              

              Filter

              1. implements Filter接口,然后重写init、doFilter、destroy方法
              public class DemoFilter implements Filter {
                  @Override
                  public void init(FilterConfig filterConfig) throws ServletException {
                      System.out.println("DemoFilter的init...");
                  }
                  @Override
                  public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
                      System.out.println("DemoFilter的doFilter...");
                      // 通过filter
                      filterChain.doFilter(servletRequest,servletResponse);
                  }
                  @Override
                  public void destroy() {
                      System.out.println("DemoFilter的destroy...");
                  }
              }
              
              2. web.xml配置
                
                
                  DemoFilter
                  com.xxliao.filter.DemoFilter
                
                
                  DemoFilter
                  /servlet/*
                
              

              Listener

              1. JavaWeb8大监听器:
              • ServletContextListener
              • ServletContextAttributeListener
              • HttpSessionListener
              • HttpSessionAttributeListener
              • ServletRequestListener
              • ServletRequestAttributeListener
              • HttpSessionBindingListener
              • HttpSessionActivationListener

                需要监听什么内容就实现上面的监听器,然后将监听器配置到web.xml文件中

                2. 测试监听器

                package com.xxliao.listener;
                import javax.servlet.http.HttpSessionEvent;
                import javax.servlet.http.HttpSessionListener;
                /**
                 * @author xxliao
                 * @description: 演示Listener
                 * @date 2023/11/19$ 12:25$
                 */
                public class DemoListener implements HttpSessionListener {
                    @Override
                    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
                    }
                    @Override
                    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
                    }
                }
                
                1. web.xml配置
                
                  
                    com.xxliao.listener.DemoListener
                  
                

转载请注明来自码农世界,本文标题:《Java Web基础知识(Servlet、Cookie、Session、Filter、Listener)》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,100人围观)参与讨论

还没有评论,来说两句吧...

Top