JavaWeb-三大组件(Servlet、Filter、Listener)

推荐大佬javaweb学习笔记

https://www.cnblogs.com/xdp-gacl/p/3729033.html

Tomcat:
     Catalina run  #可看到服务启动时报错信息
建立虚拟目录:

<Host> <Context path="/appName" docBase="目录绝对路径" reloadable="true" debug="0"/> </Host>

tomcat服务器会自动管理webapps目录下的所有web应用,并把它映射成虚似目录。项目放入webapp下打包成web应用(静态资源文件可打包成war去使用)
Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包

Servlet
servlet接口实现类
  Servlet接口SUN公司定义了两个默认实现类,分别为:GenericServlet、HttpServlet。

  HttpServlet指能够处理HTTP请求的servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。
  HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。因此,开发人员在编写Servlet时,通常只需要覆写doGet或doPost方法,而不要去覆写service方法。

       Servlet: 单例的
       生成:类实现 servlet 接口
       配置:web.xml 中配置与映射
            servlet-class 与 servletMapping: 绑定、映射,提供访问。
            <servlet>
                <load-on-startup>
            标记容器是否在启动的时候就加载这个servlet。当值为0或者大于0时,表示容器在应用启动时就加载这个servlet;当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。
            正数的值越小,启动该servlet的优先级越高。

ServletConfig 
            初始化参数配置:
                web.xml---<servlet>
                                <init-param>
                                <param-name>user</param-name>
                                <param-value>xusx</param-value>
                              </init-param>
                          </servlet> 
                获取参数:    ServletConfig对象.getInitParameter    

ServletContext

  WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。
  ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。
  由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象-------------application。

共享初始化参数配置:
                web.xml--- 
                <context-param>
                <param-name>name</param-name>
                <param-value>xusx1111</param-value>
                </context-param>
                获取参数:ServletContext对象.getInitParameter
                获取程序名:servletContext对象.getContextPath()
            读取文件:
                ServletContext读取--当前web应用
                gerResourceAsStream(String path) / 当前Web应用的根目录  
                eg:/text.txt
                类加载器获取配置文件--src下
                类.class.gerResourceAsStream
                类.class.getClassLoader.gerResourceAsStream
                eg:当前类下-----test.txt;其他类下 com.yinhai.first.text.txt
                注:其路径为当前类的目录路径
                
                
   ----------------------             
                
                
    request 请求 
     1、
      getRequestURL方法返回客户端发出请求时的完整URL。
    getRequestURI方法返回请求行中的资源名部分。
    getQueryString 方法返回请求行中的参数部分。
      getMethod() 得到请求URL地址时使用的方法
      2、获取请求参数
      getParameter(String)方法(常用)
      getParameterValues(String name)方法(常用)
      getParameterMap()方法(编写框架时常用)
      
      getParameterMap()方法(编写框架时常用)
      Map<String, String[]> parameterMap = request.getParameterMap();
        for (Map.Entry<String, String[]> map:parameterMap.entrySet()){
            String key = map.getKey();
            System.out.println("key:"+key);
            String[] value = map.getValue();
            for (String a:value){
                System.out.println("value:"+a);
            }
        }
    get\post 乱码问题:
       客户端与服务单编码格式不一致导致
    1、以POST方式提交表单中文参数的乱码问题
        客户端utf-8

在第一次请求参数之前设置起作用
          request.setCharacterEncoding("UTF-8");-----服务器端以UTF-8的编码进行接收
    2、以get方式中文乱码问题
  对于以get方式传输的数据,request即使设置了以指定的编码接收数据也是无效的(至于为什么无效我也没有弄明白),默认的还是使用ISO8859-1这个字符编码来接收数据,客户端以UTF-8的编码传输数据到服务器端,而服务器端的request对象使用的是ISO8859-1这个字符编码来接收数据,服务器和客户端沟通的编码不一致因此才会产生中文乱码的。解决办法:在接收到数据后,先获取request对象以ISO8859-1字符编码接收到的原始数据的字节数组,然后通过字节数组以指定的编码构建字符串,解决乱码问题。代码如下:    
        
          String name = request.getParameter("name");//接收数据
          name =new String(name.getBytes("ISO8859-1"), "UTF-8") 
        
    reponse 响应
    
       响应输出数据:
       
       response.setCharacterEncoding(charset)"设置字符以什么样的编码输出到浏览器,
       response.setHeader("content-type", "text/html;charset=UTF-8");//通过设置响应头控制浏览器以UTF-8的编码显示数据,
        1、OutputStream---二级制字节输出
        data.getBytes()是一个将字符转换成字节数组的过程,这个过程中一定会去查码表。方法如果不带参数,那么就会根据操作--系统--的语言环境来选择转换码表,如果是中文操作系统,那么就使用GB2312的码表
        data.getBytes("utf-8")  将字符转换成字节数组,指定以UTF-8编码进行转换
        
        2、PrintWriter---字符串输出
        在获取PrintWriter输出流之前首先使用"response.setCharacterEncoding(charset)"设置字符以什么样的编码输出到浏览器,如:response.setCharacterEncoding("UTF-8");设置将字符以"UTF-8"编码输出到客户端浏览器,然后再使用response.getWriter();获取PrintWriter输出流,这两个步骤不能颠倒,
        
        转发、重定向
        response.sendRedirect();
        req.getRequestDispatcher().forward();
        
    
     一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理,称之为请求转发/307。
    一个web资源收到客户端请求后,通知浏览器去访问另外一个web资源进行处理,称之为请求重定向/302。

    会话:web服务器从大量的请求中区分那些请求属于同一个会话,即能识别出来之同一个浏览器请求,这需要浏览器对其发出的每个请求消息进行标识

    每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据。

    三、保存会话数据的两种技术
    1、Cookie
      Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
        本质: 浏览器第一次访问web服务器。服务器给其cookie  之后的访问,每次都带着cookie到浏览器;cookie 中存一个key,value
                    默认情况下 cookie 存储在浏览器内存中,退出浏览器即删除。如存储在磁盘上,则需设置maxAge--单位秒
                    setPath:设置有效路径---访问此路径才会带cookie来
                    创建:cookie cookie=new cookie(key,value)
                    添加cookie:reponse.addcookie
                    删除cookie.setMaxAge(0);

    2、Session
      Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
        session :  sessionid    服务器与浏览器存在连接 sessionid 不变,断开在去连接则sessionid 也会重现变化
                    本质:利用cookie  传递jesessionid,让传入服务器后,服务器通过过sessionid 找到其对应的 session
                    创建:request.getSession
                    删除:session对象.invaldate 
                    有效期:serMaxIncativeInterval(秒) 默认:1800秒
                            web.xml 中设置
                            <session-config>
                                <session-timeout>30</session-timeout>
                            </session-config>
    
    
        
    
JSP:Java Server 

    本质:jsp 本质就是 servlet 
    隐含对象:request
              response
              pageConext   页面上下文
              session      浏览器与服务器一次会话
              application  当前Web 应用 servletContext
              config      当前servlet对应的 servletConfig对象
              out          打印字符串到浏览器
              page 
              exception     前提条件:当声明 jso  isErrorpage='true'
              
    属性范围:pageContext(当前界面)  设置属性 setAttribute(value,scope)
    request(同一个请求) session(一次会话) application(当前web应用)
    
    web-info目录:此目录下的文件是无法被请求直接访问的。

    
    JSP原理:
        声明
            JSP页面中编写的所有代码,默认会翻译到servlet的service方法中, 而Jsp声明中的java代码被翻译到_jspService方法的外面。语法:
            <%! 
                java代码
            %>
          所以,JSP声明可用于定义JSP页面转换成的Servlet程序的静态代码块、成员变量和方法 。 
        表达式:
             JSP脚本表达式(expression)用于将程序数据输出到客户端
            语法:<%= 变量或表达式 %>
        脚本片段:
             JSP脚本片断(scriptlet)用于在JSP页面中编写多行Java代码。语法:
            <% 
                    多行java代码 
            %>

              在<% %>中可以定义变量、编写语句,不能定义方法。
        
    JSP指令:
            JSP指令的基本语法格式:<%@ 指令 属性名="值" %>
            
            page指令
                contentType:指定页面响应的内容,以及字符编码。其本质是---->response.setContentType();
            Include指令 :静态引入最后只生个一个Servlet源文件
            taglib指令
            
            
    JSP标签:include :会分别生成两个Servlet源文件
             forward : 转发 
             param: 参数
    错误界面:
            1.<%@ page language="java" import="java.util.*" errorPage="/ErrorPage/error.jsp" pageEncoding="UTF-8"%>
            
            2.web.xml中使用<error-page>
                                  <error-code>404</error-code>
                                  <location>/ErrorPage/404Error.jsp</location>
                            </error-page>
    
    pageConext:是JSP技术中最重要的一个对象,它代表JSP页面的运行环境,这个对象不仅封装了对其它8大隐式对象的引用,它自身还是一个域对象
    
    EL表达式:
            ${标识符} 
                本质:pageContext.findAttribute---findAttribute方法按照查找顺序"page→request→session→application"在这四个对象中去查找,只要找到了就返回属性值,如果四个对象都没有找到要查找的属性,则返回一个null。
                
                EL表达式语句在执行时,会调用pageContext.findAttribute方法,用标识符为关键字,分别从page、request、 session、application四个域中查找相应的对象,找到则返回相应对象,找不到则返回”” (注意,不是null,而是空字符串)。

Servlet                 
                
过滤器:Filter 接口  --用户在访问某个目标资源之前,对访问的请求和响应进行拦截
                Filter的创建和销毁由WEB服务器负责。 web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作,filter对象只会创建一次,init方法也只会执行一次。
       注册、映射:
         <filter>
         <filter-mapping>
                [dispatcher]:
        注解配置:@WebFilter(filterName = "myFilter",urlPatterns = {"/*"})
监听器:监听器其实就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法立即被执行。
    监听对象:ServletContext, HttpSession和 ServletRequest
                1 +listener---创建、销毁
                    ServletContext
                        创建:服务器启动针对每一个Web应用创建ServletContext
                    销毁:服务器关闭前先关闭代表每一个web应用的ServletContext
                    httsesion
                        创建一个Session时,激发sessionCreated (HttpSessionEvent se) 方法
                      销毁一个Session时,激发sessionDestroyed (HttpSessionEvent se) 方法。
                    servletRequest:
                      创建:用户每一次访问都会创建request对象
                    销毁:当前访问结束,request对象就会销毁
                2 +AttributeListener--属性变更
    注册:<listener>
        注解配置: @WebListener
    异常界面:
        1  <%@page contentType="text/html;charset=utf-8" isErrorPage="true"%>
        
        2 根据状态码处理:
            <error-page> 
                <error-code>400</error-code> 
                <location>/400.jsp</location> 
            </error-page> 
               
            <error-page> 
                <error-code>404</error-code> 
                <location>/404.jsp</location> 
            </error-page> 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值