Web 总结

web总结

  1. HTTP总结
  2. Servlet总结
  3. Cookie-Session会话
  4. JSP总结
  5. EL表达式-JSTL标签库
  6. Filter过滤器
  7. Listener监听器-Servlet事件监听
  8. JSP开发模型

HTTP总结

HTTP协议

  1. HTTP协议即超文本传输协议在浏览器与服务器的交互过程中要遵守一定的规则。

  2. HTTP协议专门用于定义浏览器与服务器之间数据交换过程及数据本身 的格式。

  3. Http1.0每次请求都需要对服务器重新建立链接。

  4. Http1.1克服了Http1.0的缺陷可传多个请求响应。


HTTP消息

  1. Http请求消息

    GET / index.php ? tn=monline_3_dg HTTP/1.1
    Host: www.baidu.com
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0
    Accept:text/html,application/xhtml+xml,application/xml;
    Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,
    Accept-Encoding: gzip, deflate, br
    Connection: keep-alive
    Cookie: BAIDUID=5C0BA=1;
    Upgrade-Insecure-Requests: 1
    Cache-Control: max-age=0

    • 请求行:位于请求消息第一行,包括三个部分 1. 请求方式 2. 资源路径 3. Http版本
    • 请求消息头:向服务器传递附加信息
    • 实体内容

  2. Http响应消息

    HTTP/1.1 200 OK
    Bdpagetype: 1
    Bdqid: 0x8e36be8
    Cache-Control: private
    Connection: keep-alive
    Content-Encoding: gzip
    Content-Type: text/html;charset=utf-8
    Date: Mon, 01 Feb 2021 11:21:13 GMT
    Expires: Mon, 01 Feb 2021 11:21:12 GMT
    P3p: CP=" OTI DSP COR IVA OUR IND COM "
    Server: BWS/1.1domain=.baidu.com
    Set-Cookie: BD_HOME=1; path=/
    domain=.baidu.com

    • 响应状态行:位于响应消息第一行,包括三个部分 1. Http版本 2. 状态码 3. 状态码对应的文本描述
    • 响应消息头:向客户端传递附加信息
    • 实体内容

Servlet总结

Tomcat

  1. Tomcat简介:一个动态的web资源开发完毕后需要发布在web服务器上才能被外界访问。Tomcat服务器 == web服务器。

  2. 什么是web应用:在web服务器上运行的所有web资源称为web应用,所谓web应用就是就是多个web资源的集合,一个web应用有多个web资源或其他文件组成。


Servlet

  1. Servlet概述

    • 狭义的说servlet是指servlet接口广义地说servlet是指实现了servlet接口的类。
    • Servlet容器 : 是指提供了servlet功能的服务器即Tomcat 。servlet容器将servlet动态资源 (静态资源服务器自动解析)加载到HTTP服务器上

    Web 总结

  2. 从Servlet接口到HttpServlet类都经历了什么

    • Servlet接口有五个抽象方法

      public interface Servlet {
          void init(ServletConfig var1) throws ServletException;
          ServletConfig getServletConfig();
          void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
          String getServletInfo();
          void destroy();
      }
      
      
    • GenericServlet抽象类除了service方法(改写成抽象方法),其他四个方法都具体实现了因此,当我们使用继承GenericServlet类时,只需要具体实现service方法即可。

      public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
          private static final long serialVersionUID = 1L;
          private transient ServletConfig config;
          public void destroy() {
          }
          public ServletConfig getServletConfig() {
              return this.config;
          }
          public String getServletInfo() {
              return "";
          }
          public void init(ServletConfig config) throws ServletException {
              this.config = config;
              this.init();
          }
          public void init() throws ServletException {
          }
          public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
         // 其他方法省略
      }
      
    • HttpServlet 继承了 GenericServlet。从HttpServlet 源码可以看出HttpServlet定义了doGet,doPost方法实现了service方法,还增加了重载形式。因此只需继承HttpServlet并调用doGet,doPost方法即可。

      public abstract class HttpServlet extends GenericServlet {
          
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              String msg = lStrings.getString("http.method_get_not_supported");
              this.sendMethodNotAllowed(req, resp, msg);
          }
      
          
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              String msg = lStrings.getString("http.method_post_not_supported");
              this.sendMethodNotAllowed(req, resp, msg);
          }
      
          protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              String method = req.getMethod();
              long lastModified;
              if (method.equals("GET")) {
                  lastModified = this.getLastModified(req);
                  if (lastModified == -1L) {
                      this.doGet(req, resp);
                  } else {
                      long ifModifiedSince;
                      try {
                          ifModifiedSince = req.getDateHeader("If-Modified-Since");
                      } catch (IllegalArgumentException var9) {
                          ifModifiedSince = -1L;
                      }
      
                      if (ifModifiedSince < lastModified / 1000L * 1000L) {
                          this.maybeSetLastModified(resp, lastModified);
                          this.doGet(req, resp);
                      } else {
                          resp.setStatus(304);
                      }
                  }
              } else if (method.equals("HEAD")) {
                  lastModified = this.getLastModified(req);
                  this.maybeSetLastModified(resp, lastModified);
                  this.doHead(req, resp);
              } else if (method.equals("POST")) {
                  this.doPost(req, resp);
              } else if (method.equals("PUT")) {
                  this.doPut(req, resp);
              } else if (method.equals("DELETE")) {
                  this.doDelete(req, resp);
              } else if (method.equals("OPTIONS")) {
                  this.doOptions(req, resp);
              } else if (method.equals("TRACE")) {
                  this.doTrace(req, resp);
              } else {
                  String errMsg = lStrings.getString("http.method_not_implemented");
                  Object[] errArgs = new Object[]{method};
                  errMsg = MessageFormat.format(errMsg, errArgs);
                  resp.sendError(501, errMsg);
              }
      
          }
      
         
          public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
              HttpServletRequest request;
              HttpServletResponse response;
              try {
                  request = (HttpServletRequest)req;
                  response = (HttpServletResponse)res;
              } catch (ClassCastException var6) {
                  throw new ServletException(lStrings.getString("http.non_http"));
              }
      
              this.service(request, response);
          }
          // 其他方法省略
      }
      
  3. Servlet生命周期

    • init()出生 >> service()运行 >> destroy()销毁

      Web 总结

  4. Servlet虚拟路径映射

    1. web默认index页面配置

         <welcome-file-list>
              <welcome-file>index.html</welcome-file>
              <welcome-file>index.jsp</welcome-file>
          </welcome-file-list>
      
    2. 多重映射

       <!--配置多个<servlet-mapping>-->
      	<servlet>
              <servlet-name>hello</servlet-name>
              <servlet-class>xxx.class</servlet-class>
          </servlet>
          <servlet-mapping>
              <servlet-name>hello</servlet-name>
              <url-pattern>/form 1</url-pattern>
          </servlet-mapping>
          <servlet-mapping>
              <servlet-name>hello</servlet-name>
              <url-pattern>/form 2</url-pattern>
          </servlet-mapping>
      
      <!--配置多个<url-pattern>-->
      	<servlet>
              <servlet-name>hello</servlet-name>
              <servlet-class>xxx.class</servlet-class>
          </servlet>
          <servlet-mapping>
              <servlet-name>hello</servlet-name>
              <url-pattern>/form 1</url-pattern>
              <url-pattern>/form 2</url-pattern>
          </servlet-mapping>
      
    3. 映射路径中的通配符

      • 格式为"* .扩展名",例如:" *.hello"匹配.hello结尾**的所有URL地址。
      • 格式为" /* ",例如:"/hello/*"匹配/hello开始的所有URL地址。
    4. 缺省Servlet

      • 缺省映射路径( / ),那么servlet也为缺省servlet如果在web.xml中找不到mapping元素的URL那么就会交给缺省servlet处理。
  5. ServletConfig接口---ServletContext接口

    1. ServletConfig接口

      • ServletConfig接口是什么?

        在Servlet运行期间,需要获取一些web.xmld的配置信息,比如文件的编码使用Servlet共享等,servletConfig就是用来获取初始化配置信息的。web.xml中使用< init-param >进行配置初始化信息。当Tomcat初始化一个Servlet时,会将该Servlet配置信息封装到ServletConfig对象中,通过调用initi(ServletConfig config)方法将ServletConfig对象传给Servlet。

      • ServletConfig接口的常用方法。

        方法说明 功能描述
        String getInitParameter(String name) 根据初始化参数返回对应的初始化参数值
        Enumeration getInitParameterNames() 返回一个Enumeration对象,其中包含了所有初始化参数名
        ServletConfig getServletContext() 返回一个代表当前web应用的ServletContext对象
        String grtSetvletName() 返回Servlet的名字,即web.xml中<servlet - name>元素的值
    2. ServletContext接口

      • ServletContext对象代表什么?

        1 .Servlet容器启动时会为每个Web应用创建唯一的ServletContext对象代表当前web应用所以ServletContext域就是web应用。

        2 .在xml文件中可以配置<cont - param>初始化参数

        通过ServletContext接口的方法获取参数。

            <context-param>
                <param-name>yyy</param-name>
                <param-value>xxx</param-value>
            </context-param>
        
      • Web应用中ServletConfig对象数据共享。

        1 .ServletConfig对象代表当前Web应用所以,在web应用中所有Servlet可共享Servlet Config对象。

        2 .ServletConfig对象共享数据的增删改查。

        void setAttribute(String var1, Object var2);
        Object getAttribute(String var1);
        void removeAttribute(String var1);
        //返回Enumeration对象,该对象包含了所有存放ServletContext中的所有域属性名。
        Enumeration<String> getAttributeNames();
        
      • ServletConfig对象读取Web应用下的资源文件。

        1 .ServletContext接口中定义了一些读取Web资源的方法,这些方法依靠Servlet容器(Tomcat)来实现。Servlet容器根据资源文件相对与web应用的路径,返回关联资源文件的io流,资源文件在文件系统中的相对路径绝对路径

        2 .相对路径

            public void doGet(HttpServletRequest request, HttpServletResponse response)
         IOException {
                response.setContentType("text/html;charset=utf-8");
                ServletContext context = this.getServletContext();
                PrintWriter out = response.getWriter();
                // 获取相对路径中的输入流对象
                InputStream in = context
                    .getResourceAsStream("/WEB-INF/classes/itcast.properties");
                Properties pros = new Properties();
                pros.load(in);
                out.println("username=" + pros.getProperty("username") + "<br/>");
                out.println("password=" + pros.getProperty("password") + "<br/>");
            }
        

        3 .绝对路径

            public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
                response.setContentType("text/html;charset=utf-8");
                ServletContext context = this.getServletContext();
                PrintWriter out = response.getWriter();
                // 获取文件绝对路径
                String path = context
                    .getRealPath("/WEB-INF/classes/itcast.properties");
                FileInputStream in = new FileInputStream(path);
                Properties pros = new Properties();
                pros.load(in);
                out.println("username=" + pros.getProperty("username") + "<br/>");
                out.println("password=" + pros.getProperty("password") + "<br/>");
            }
        

        4 .ServletContext接口的常用方法。

        方法说明 功能描述
        Set getResourcePaths(String path) 返回一个 Set 集合,集合中包含资源目录中子目录和文件的路径名 称。参数 path 必须以正斜线(/)开始,指定匹配资源的部分路径
        String getRealPath(String path) (path为/WEB-INF/...) 返回资源文件在服务器文件系统上的真实路径(文件的绝对路径)。参数 path 代表资源文件的虚拟路径,它应该以正斜线(/)开始,/ 表示当前 Web 应用的根目录,如果 Servlet 容器不能将虚拟路径转换为文 件系统的(绝对路径)真实路径,则返回 null。
        URL getResource(String path) 返回映射到某个资源文件的 URL 对象。参数 path 必须以正斜线(/)开始,/ 表示当前 Web 应用的根目录
        InputStream getResourceAsStream(String path)(path为/WEB-INF/...) 返回映射到某个资源文件的 InputStream 输入流对象。参数 path 的传递规则和 getResource() 方法完全一致
  6. 浏览器访问Servlet过程

    • web服务器在收到客服端的Http请求后会调用servlet()方法,但是在调用Servlet方法之前会创建两个对象HttpServletRequest(用于封装Http请求消息),HttpServletResqonse(用于封装Http响应消息)。

      Web 总结

  7. 请求转发

    • HttpServletRequest对象

      1 . 获取请求行方法:获取Http请求方式String getMethod()等。

      2 . 获取请求头方法:用于获取指定头字段的值String getHeader()。

    • 利用Referer请求头防止“盗链”

    • HttpServletRequest对象的应用

      1 . 设置解码方式

      //该解码方式只对POST有效对对GET方式无效。
      request.setCharacterEncoding("utf-8");

      2 . 获取请求参数

      方法说明 功能描述
      String getParameter(String name) 通过指定名称获取参数值。
      String[] getParameterValues(String name) 通过指定名称获取参数值数组,有可能一个名字对应多个值,例如表单中的多个复选框使用相同的name时。
      Enumeration getParameterNames() 获取所有参数的名字。
      Map getParameterMap() 获取所有参数对应的Map,其中key为参数名,value为参数值。

      3 . 传递数据

      void setAttribute(String name,object o);

      object getAttribute(String name);

      void removeAttribute(String name);

      Enumeration getAttributeNames();

    • RequestDispatcher对象的应用

      1 . RequestDispatcher接口方法

      方法声明 功能描述
      RequestDispatcher getRequestDispatcher(String path) path是web资源下的根目录WEB-INF,可以是文件

      2 . RequestDispatcher对象方法

      方法声明 功能描述
      forword(ServletRequest request,ServletResponse response) 该方法用于将请求从一个Servlet传递给另一个web资源。可以将请求传给其他资源精选响应,需要注意该方法需要在响应提交之前被调用否则将抛出lllegalStateException异常。
      include(ServletRequest request,ServletResponse response) 该方法用于将其他资源作为当前响应包含起来。

      1 . 请求转发

      RequestDispatcher dispatcher=request.getRequestDispatcher("/URL").forward(request,response);

      Web 总结

      2 . 请求包含

      RequestDispatcher dispatcher=request.getRequestDispatcher("/URL").include(request,response);

      Web 总结

  8. 请求重定向

    • HttpServletResqonse对象

      1 .发送响应状态行(状态码):setStatus(int status)设置响应状态码,sendError(int sc),发送错误信息状态码。

      2 . 发送响应消息头:设置响应头方法addHeader();setHeader;addIntHeader();setIntHeader();设置字符编码方法:setContentType();setLocale();setCharacterEncoding();

      3 . 发送响应消息体:输出二进制格式的响应正文getOutputStream();输出字符文本内容getWriter();

    • HttpServletResqonse对象的应用

      //重定向方法

      Public void sendRedirect(java.long.String location) throws java.io.IOException

      //设置编码方式

      response.setContentType("text/html;charaset=utf-8");

      Web 总结

  9. 转发与重定向的比较

    • 请求转发是一个请求,而重定向是两个请求。
    • 请求转发后浏览器地址栏不会有变化,而重定向会有变化,因为重定向是两个请求。
    • 请求转发的目标只能是本应用中的资源,重定向的目标可以是其他应用。
    • 请求转发对ServletA和ServletB的请求方法是相同的,即要么都是GET,要么都是POST,因为请求转发是一个请求。
    • 重定向的第二个请求一定是GET。
  10. 从HTTP请求到HTTP响应到底经历了什么.

    Web 总结


Cookie-Session会话

  1. 什么是Cookie?

    Cookie的英语翻译过来是饼干的意思,Cookie是一种会话技术,它用于将会话过程中的数据保存到用户的浏览器中。当用户通过浏览器访问web服务器时,服务器会给客服端发送一些消息,这些消息这些消息都保存在Cookie中。当浏览器再次访问服务器时,会在请求头中将Cookie发送给服务器,方服务器对浏览器做出正确响应。

  2. Cookie在浏览器和服务器之间的传输过程。

    服务器向客服端发送Cookie时会在HTTP响应头字段中增加Set-Cookie响应头字段。Set-Cookie头字段中的设置Cookie遵循一定的语法格式例如:Set-Cookie: user=itcast; path=/ ;

    user表示Cookie的名称,itcast表示Cookie的值,Path表示Cookie的属性

    需要注意“Cookie必须以键值对的形式存在,其属性可以有多个,但属性之间必须用分号和空格分隔”.

    Web 总结

  3. Cookie API。

    1.构造方法

    public Cookie(java.long.String name,java.long.String value)
        //Cookie创建成功他的名称不能更改
        //但值创建后允许被修改
    

    2.Cookie常用方法

    String getName();//返回Cookie名称
    void setValue(String newValue);//为Cookie设置一个新的值
    String getValue();//返回Cookie的值
    void setMaxAge(int expiry);//设置Cookie在浏览器客服机上保持的有效秒数
    int getMaxAge();//返回Cookie在浏览器客服机上保持的有效秒数
    void setPath(String uri);//设置Cookie项的有效目录路径
    String getPath();//返回Cookie项的有效目录路径
    void setDomain(String pattern);//设置该Cookie项的有效域
    String getDomain();//返回Cookie项的有效域
    void setVersion(int v);//设置该Cookie项采用的版本协议
    int getVersion();//返回该Cookie项采用的版本协议
    void comment(String purpose);//设置该Cookie项的注解部分
    String getComment();//返回该Cookie项的注解部分
    void setSecure(boolean flag);//用于设置该Cookiei项是否只能使用安全的协议传送
    boolean getSecure();//返回该Cookie项是否只能使用安全的协议传送
    

    <1>对常用方法setMaxAge(int espiry)-getMaxAge()的用法解释。

    setMaxAge()-getMaxAge()用于设置返回Cookie在浏览器上保持有效的秒数。如果值设置为正整数-那么浏览器会将Cookie信息保存到本地硬盘中,并且同一台计算机上运行的浏览器都可以使用这个Cookie。

    如果值设置为负整数-浏览器会将Cookie信息保存在缓存中,当浏览器关闭时Cookie信息会被删除。

    如果值设置为0-则表示通知浏览器立即删除这个Cookie信息,需要了解默认情况下MaxAge属性的值为-1.

    <2>对常用方法setPath(String uri)-getPath()的用法解释。

    这两个方法是针对Cookie的Path属性的,如果创建的某个Cookie对象没有设置Path属性,那么Cookie只能访问路径所属的目录及其子目录有效,如果想要某个Cookie项对站点的所有目录下的访问路径有效,应调节Cookie对象的setParh()方法将其Path属性值设置为”/“。

    <3>对常用方法setDomain(String pattern)-getDomain()的用法解释。

    domain属性用来指定浏览器访问的域。

  4. Cookie数据存储。

    创建Cookie(java.long.String name,java.long.String value)时可以对想要的数据进行存贮在多次请求下实现数据共享。

    但如果传递的信息比较多时,使用Cookie会增大服务器端程序处理的难度。

  5. 会话Cookie和持久Cookie。

    5.1 如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。
    这种生命期为浏览器会话期的cookie被称为会话cookie。
    会话cookie一般不保存在硬盘上而是保存在内存(缓存)里。

    5.2 .如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。
    设置过期时间: setMaxAge(param) param为具体的时间,单位为秒。

    5.3 存储在硬盘上的cookie可以在不同的浏览器进程间共享,

  6. 应用-“Cookie显示用户上次访问时间”。


Session

  1. 什么是Session?

    当信息比较多时使用Cookie技术会增大服务器端程序处理难度这时就可以使用Session,Session是一种将会话数据保存到服务器端的技术。就好比你去医院看病第一次需要挂号办理就诊卡当你第二次去复查时只要那就就诊卡就可以了,因为根据你的就诊卡号在医院的档案中可以看到你在该医院就诊的所有信息。就诊卡就相当于Session对象的ID属性当客服端访问了服务器,服务器就会给你一个Session.ID属性并把该客服端信息根据Session.ID号保存在服务器上,当该客服端再次访问服务器时根据客服端请求中的Session.ID属性服务器就能可以判断出该请求是那个客服端发送的。

    由于 客服端需要接收,记录和回送Session对象的ID,因此,通常情况下,Session是借助Cookie技术来传递ID属性的。

  2. Session工作原理。

    Web 总结

    2.1 第一次请求,请求头中没有jsessionid的cookie,当访问到对应的 servlet资源时,执行到getSession()会创建HttpSession对象;进而响 应时就将session的id作为cookie的value,响应到浏览器 Set- cookie:jsessionid=xxxx;

    2.2 再一次请求时,http请求中就有一个cookie:jsessionid=xxxx信息,那 么该servlet就可以通过getSession()获取到jsessionid在服务器内查找 对应的session对象,有就使用,无就创建。

  3. HttpSession API.

    3.1 HttpSessionSession构造

    public HttpSession getSession(boolean create);
    /**
    根据参数create判断是否创建新的HTTpSession对象
    如果参数为true,则在相关的HTTPSession对象不存在时创建并返回新的HTTPSession对象。
    否则不创建新的HttpSession而是返回null。
    */
    public HttpSession getSession();
    /**
    该方法则是当第一个方法参数为true的情况下,在相关的HttpSession对象不存在时总是创建新的HttpSession对象,注意:由于getSession()方法可能会产生发送会话标识号的Cookie头字段,因此,必须在发送任何响应内容之前调用getSession()方法。
    */
    

    3.2 HttpSessionSession常用方法

    String getid();
    //用于返回与当前HttpSession对象关联的会话标识号
    long getCreationTime();
    //返回Session创建时间,这个时间是创建Seesion的时间与1970年1月1日00:00:00之间的时间差的毫秒表示形式
    long getLastAccessedTime();
    //返回客服端最后一次发送与Session相关请求的时间,这个时间是发送请求时间与1970年1月1日00:00:00之间的时间差的毫秒表示形式
    void setMaxlnactivelnterval(int interval);
    //用于设置HttpSession对象可空闲的以秒为单位的最长时间,也就是修改当前会话的默认超时间隔
    boolean isNew();
    //判断当前HTTPSession对象是否是新创建的
    void invalidate();
    //强制使Session对象无效
    ServletContext getServletContext();
    //返回当前HTTPSession对象所属于的Web应用程序对象,即代表当前Web应用程序的ServletContext对象
    void setAttribute(String name,Object value);
    //将一个对象与一个名称关联后存储到当前HTTPSession对象中
    String getAttribute();
    //用于从当前HttpSession对象中返回指定名称的属性对象
    void removeAttribute(String name);
    //用于从当前HttpSession对象中删除指定名称的属性
    

    3.3 设置Session生命周期

    • 在浏览器关闭时,意味着用户与他的HttpSession关系被切断;
    • 由于Tomcat无法检测到浏览器何时关闭,因此在浏览器关闭时并不会导致Tomcat将浏览器关联的HttpSession进行销毁。
      为了解决这个问题,Tomcat为每一个HttpSession对象设置【空闲时间】
    • 这个空闲时间默认30分钟,如果当前HttpSession对象空闲时间达到30分钟,此时Tomcat认为用户已经放弃了这个HttpSession,此时销毁掉这个HttpSession。
    • 可在Tomcat 中 web.xml 文件中进行配置:
    <session-config>
       <session-timeout>30</session-timeout>
    </session-config>
    
  4. Session数据存储。

    创建Session后可以通过下面方法存储获取数据;

    void setAttribute(String name,Object value);
    String getAttribute();
    
  5. 应用-“Session超时管理”。

  6. 应用-“客服端禁用Cookie后,利用URL重写实现Session跟踪”。

    6.1 如果浏览器不支持或者禁用了Cookie,那么Session将无法获取到保 存用户用户信息的Session对象,web服务器会将该对话当成新的会 话。为了防止该类事情发生Servlet规划中引入了URL重些机制来保 存用户的会话信息。所谓的URL重些,指的是将Session的会话标识 号以参数的形式附加在超链接的URL地址的后面。对于Tomcat服 务器来说,就是将JSESSIONID关键字作为参数名以及会话标识符 的值作为参数附加到URL地址后面。

    6.2 当浏览器不支持Cooki或者关闭了Cookie时,在会话过程中,如果想 让Web服务器可以保存用户信息,必须对所有可能被客服端访问的 请求路径进行URL重写。

    ? 在HttpServletResponse接口中,定义了两个用于完成URL重写的方 法

    • encodeURL(String url):用于对超链接和Form表单的action属性中设置的URL进行重写。
    • encodeRedirectURL(String url):用于对要传递给HttpServletResponse.sendRedirect方法的URL进行重写。

HTTP请求中 4 大共享数据方式对比

  1. ServletContext:web容器在启动的时候,它会为每一个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用。生命周期为服务器的开启和关闭,所有用户都可以共享,但是范围过大,保密性不高。

  2. request:一次请求中实现数据共享生命周期太短一次请求就丢失。

  3. cookie:由于Cookie存贮在客服端,客服端可以对Cookie进行查看或修改所有不安全。而且Cookie无法定义特殊符号。

  4. session:根据Cookie存储在服务器上一般默认30分钟后销毁。

  5. 对比图:

    Web 总结

  6. 三大域对象:

    Web 总结

JSP总结

  1. JSP是什么

    • 在动态网页中,经常需要动态的生成HTML内容,使用静态内容和动态内容混合在一起会导致程序非常臃肿为了解决这个缺点Oracle(Sun)公司推出了JSP(java server pages)技术。
    • JSP是建立在Servler规范之上的动态网页开发技术。在JSP中HTML和java代码,其中HTML代码用来实现网页中静态内容的显示,Java代码用来是实现网页中动态代码的显示。
    • JSP特点:跨平台性,业务代码相分离,组件重用,预编译
  2. 运行原理

    • JSP的工作模型是请求/响应模型。

      Web 总结

    • 1.客服端发出请求,请求访问JSP文件。

    • 2.JSP容器先将JSP文件转换成一个Java源文件(Java Servlet源程序),在转换过程中如果发现JSP文件中存在任何语法错误,则中断转换过程,并向服务端和客服端返
      回出错误信息。

    • 3.如果转换成功则JSP容器将生成的Java源文件编译成相应的字节码文件*.class。该字节码文件就是一个Servlet,Servlet容器会像处理其他Servlet一样来处理它。

    • 4.由Servlet容器加载转换后的Servlet(.class)类创建一个该Servlet(JSP页面的转换的结果)实例,并执行Servlet的jspinit()方法。jspinit()方法在Servlet的
      整个生命周期里只执行一次。

    • 5.执行jspService()方法来处理客服端请求,对于每一个请求,JSP容器都会创建一个新的线程来处理他,如果多个客服端同时请求该JSP文件,则JSP容器也会创建多个线程,
      使得每一个客服端请求都对应一个线程。JSP运行过程中采用的这种多线程的执行方式可以极大的降低对系统资源的需求,提高系统并发量并缩短响应时间。<需要注意:
      由于第四部生成的Servlet是常驻内存的,所有响应速度非常快
      >

    • 6.如果JSP文件被修改了,则服务器将根据设置决定是否对该文件重新编译。如果需要重新编译,则使用重新编译后的结果取代内存中常驻Servlet,并继续上述处理内容。

    • 7.虽然JSP效率很高,但在第一次调用的时候往往由于需要转换和编译,所以会产生一些轻微的延迟。此外,由于系统资源不足等原因,JSP容器可能会以某种不确定的方式
      将Servlet从内存中移除,发生这种情况时首先会调用jspDestroy()方法,然后Servlte实例会被拉入“垃圾收集”处理。

    • 8.当请求处理完成后,响应对象有JSP容器接收,并将HTML格式的响应消息发送回客服端。

  3. JSP语法

    • <%!%>JSP声明语句:在JSP声明语句中被声明的Java代码将被编译到Servlet的_jspService()方法中,即在JSP声明语句中定义的都是成员方法,成员变量,静态方法,
      静态变量,静态代码块。JSP声明语句中声明的方法在整个页面都有效。
    • <%%>JSP Scriptlets:在JSP Scriptlets中声明的变量是JSP页面的局部变量,调用JSP Scriptlets时,会为局部变量分配内存空间,调用结束后,释放局部变量占
      有的内存空间。
    • <%=%>JSP表达式:用于将程序数据输出到客服端。
  4. JSP指令

    1. page指令

      • page语法格式:<%@ page 属性名1="属性1" 属性名2="属性2"...%>

      • 属性language:取值范围[java] 描述:[指明解释该JSP文件时采用的语言,默认为Java]

      • 属性import:取值范围[任何包名,类名] 描述:[要导入的包名或者类名]

      • 属性session:取值范围[true,false] 描述:[指明该JSP内是否内置Session对象,如果为true则说明内置Session对象,可以直接使用否则没有内置Session对象,默认情况下,session属性的值为true需要注意JSP引擎自动导入Java.lang.* +javax.servlet.*+javax.servlet.jsp.*+javax.servlet.http.*]

      • 属性isErrorPage:取值范围[true,false] 描述:[指定该页面是否为错误处理页面,如果为true则该JSP内置一个Exception对象的exception,可以直接使用。默认情况下,isErrorPage的值为false]

      • 属性errorPage:取值范围[某个JSP页面的相对路径] 描述:[指定错误页面,如果该JSP程序抛出一个未捕捉的异常,则传到errorPage指定的页面。errorPage指定页面的isErrirPage属性为true,且内置的exception对象为未捕获的异常]

      • 属性contentType:取值范围[有效的文档类型] 描述:[客服端浏览器根据该属性判断文档类型,如:HTML格式为text/html。纯文本格式为text/plain。JPG图像为image/jpeg。GIF图像为image/gif。Word文档为application/msword。]

      • 属性pageEnCoding:取值范围[当前页面] 描述:[指定页面编码格式]

    2. include指令

      • include语法格式:<%@ invlude file="被包含的文件地址"%>
      • include指令只有一个属性file属性注意:插入文件的路径一般不以“/”开头,而是使用相对路径。
  5. JSP内置对象

    1. 九大内置对象

      名称 类型 描述
      out javax.servlet.jsp.JspWriter 用于页面输出
      request javax.servlet.http.HttpServletRequest 得到用户请求信息
      response javax.servlet.http.HttpServletResponse 服务器向客服端的回应信息
      config javax.servlet.ServletConfig 服务器配置可以获得初始化参数
      session javax.servlet.http.HttpSession 保存用户信息
      application javax.servlet.ServletContext 所有用户的共享信息
      page javax.long.Object 指当前页面转换后的Servlet类的实例
      pageContext javax.servlet.jsp.PageContext JSP的页面容器
      exception javax.long.Throwable JSP页面所发生的异常
    2. out内置对象

      • out对象用来向客服端发送文本内容,与Servlet中的ServletResponse.getWriter()方法返回的PrintWriter对象非常相识,JSP中out对象是javax.servlet.jsp.JspWriter类的实例。JSP中out对象相当于一种带缓存功能的PriterWriter。下图所示是JSP页面的out对象与Servlet引擎提供的缓冲区之间的工作关系。
      • Web 总结
      • page指令设置out缓冲区大小<%@ buffer="0kb"%>
    3. pageContext内置对象

      • 使用pageContext对象可以获取JSP的其他8个隐式对象pageContext对象是javax.servlet.jsp.PageContext类的实例对象,它代表当前JSP页面的运行环境。

      • pageContext获取隐士对象的方法

        方法名 功能描述
        JspWriter getOut() 获取out隐式对象
        Object getPage() 获取page隐式对象
        ServletRequest getRequest() 获取request隐式对象
        ServletResponse getResponse() 获取response隐式对象
        HttpSession getSession() 获取session隐式对象
        Exception getException() 获取exception隐式对象
        ServletConfig getConfig() 获取config隐式对象
        ServletContext getServletContext() 获取application隐式对象
      • pageContext对象储存数据

        方法名 功能描述
        void setAttribute(String name,Object value,int scope) 用于设置pageContext对象的属性
        Object getAttribute(String name,int scope) 用于获取pageContext对象的属性
        void removeAttribute(String name,int scope) 删除指定范围内名称为name的属性
        void removeAttribute(String name) 删除所有范围内名称为name的属性
        Object finAttribute(String name) 从四个域对象中查找名称为name的属性4个域对象的查找顺序{page,request,session,application}

        上述方法中参数name指定的是属性名称,参数scope指定的是属性的作用范围

        pageContext的四个作用范围

        pageContext.PAGE_SCOPE:页面范围

        pageContext.REPUEST_SCOPE:请求范围

        pageContext.SESSION_SCOPE:会话范围

        pageContext.APPLIVATION_SCOPE:Web应用程序范围

    4. exception内置对象

      • 在page中用来捕获显示异常信息
  6. JSP动作元素

    1. < jsp : include >动作元素

      • < jsp : include page="relativeURL" flush"true | false" />
      • page="relativeURL":用于指定被引入资源的相对路径,flush"true | fales":用于指定是否将当前页面的输出内容刷新到客服端,默认false。
      • 过程原理:Webr容器首先会编译被包含的页面,然后将编译处理后的返回结果包含在页面中,之后编译包含页面,最后将两个页面组合的结果回应给浏览器。
    2. < jsp : forward>动作元素

      • < jsp : forward page="relativeURL" />

      • < jsp : forward>动作元素将当前请求转发到其他Web资源(HTML,JSP,Servlet),请求转发之后当前页面将不再执行,而是执行指定的目标页面。

  7. include指令与< jsp : include >标签动作元素的比较

    虽然include指令与< jsp : include >标签动作元素都能包含一个文件,但他们之间有很大的区别。

    • < jsp : include >标签要引入的资源和当前的JSP页面是两个彼此独立的执行实体,即被动态引入的资源必须能够被Web容器独立执行。而include指令只能引入遵循JSP格式的文件,被引入的文件与当前JSP文件需要共同合并才能翻译成一个Servlet源文件。
    • < jsp : include >标签中引入的资源是在运行时才包含的,而且只包含运行结果。而include指令引入的资源是在编译时期包含的,包含的是源码。
    • < jsp : include >标签运行原理与RequestDispatcher.include()方法类似,即被包含的页面不能改变响应状态码或者设置响应头,而invlude指令没有该方面的限制。

EL表达式-JSTL标签库

EL表达式

  1. EL是什么

    • 在JSP开发中,为了获取Servlet域对象中存储的数据经常需要书写Java代码,这样会使JSP页面混乱难以维护为此EL表达式诞生了。在JSP2.0规范中提供了EL表达式,他是一种简单的数据访问语言。
    • 语法格式:${表达式}
  2. EL语法简介

    • 在EL表达式中有${标识符 || 保留字 || 变量 || 常量 || 运算符 || }
  3. EL隐式对象

    • EL中隐式对象11个

      隐式对象名称 描述
      pageContext 对应于JSP页面的pageContext对象
      pageScope 代表page域用于保存属性的Map对象
      requestScope 代表request域用于保存属性的Map对象
      sessionScope 代表session域用于保存属性的Map对象
      applicationScope 代表application域用于保存属性的Map对象
      param 表示一个保存了所有请求参数的Map对象
      paramValues 表示一个保存了所有请求参数的Map对象,他对于某个请求参数,返回的是一个String类型的数组
      header 表示了一个保存了所有Http请求头字段的Map对象
      headerValues 表示了一个保存了所有Http请求头字段的Map对象,返回的是一个String类型的数组
      cookie 用于取得使用者的cookie值,cookie的类型是Map
      initParam 表示一个保存了所有Web应用初始化参数的Map对象
    • pageContext隐式对象

      • 使用EL表达式中的pageContext隐士对象可以获取request,response,servletContext,servletConfig对象中的属性,这里需要注意的是EL表达式的隐式对象和JSP中的隐士对象的区别,EL和JSP的隐式对象只有pageCOntext对象是他们所共有的其他隐式对象则毫不相干。
    • Web域相关的隐式对象(pageScope,requestScope,sessionScope,applicationScope)

      • 在Web开发中,pageContext,HttpServletRequest,HttpSession和ServletContext这四个对象之所以可以储存数据,是因为它们内部都定义了一个Map集合,这些Map集合是有一定的作用范围。我们习惯把这些Map集合称为域,这些Map集合所在的对象称为域对象,在EL表达式中为了获取指定域中的数据,提供了pageScope,requestScope,sessionScope和applicationScope4个隐士对象
      ${pageScope.pageName} || ${pageName}
      ${requestScope.requestName} || ${requestName}
      ${sessionScope.sessionName} || ${sessionName}
      ${applicationScope.applicationName} || ${applicationName}
      
    • paramparamValues隐式对象

      • 在JSP页面中,经常需要获取客服端传递的请求参数,为此EL表达式提供了paramparamValues两个隐士对象专门用于获取客服端访问JSP页面时传递的请求参数。

        param用于获取请求参数的某个值,是Map类型。与request.getParameter()方法相同,使用EL获取参数时如果参数不存在返回的时空字符串null比如:${para.one}

        paramValues如果一个参数有多个值可以使用paramValues对象来获取比如:${para.one[0]}

    • cookie隐式对象

      • 在JSP开发中,经常需要获取客服端的Cookie信息,为此,在EL表达式中提供了cookie隐式对象来获取Cookie对象的信息,EL表达式中的cookie隐式对象是一个代表所有Cookie信息的Map集合,Map集合中元素的键为各个Cookie的名称,值则为对应的Cookie对象。

        获取cookie对象的信息${cookie.userName}

        获取cookie对象的名称${cookie.userName.name}

        获取cookie对象的值${cookie.userName.value}


JSTL标签库

  1. JSTL是什么

    • 从JSP1.1规范开始,JSP就支持使用自定义标签,使用自定义标签大大降低了JSP页面的复杂度,同时增强了代码的重用性,因此许多Web应用厂商都自己定制了自身应用的标签库。由于不同Web厂商制定的标签库不同(但功能相同),导致开发者无从选择。为了解决这个问题Sun公司制定了一套标准的标签库(JavaServer Pages Standerd Tag Library),简称JSTL。

    • JSTL由5个不同功能的标签库共同组成

      标签库 标签库URl 前缀
      Core http://java.sun.com/jsp/jstl/core c
      |18N http://java.sun.com/jsp/jstl/fmt fmt
      SQL http://java.sun.com/jsp/jstl/sql sql
      XML http://java.sun.com/jsp/jstl/xml x
      Functions http://java.sun.com/jsp/jstl/functions fn
    • Core是一个核心标签库,它包含了实现Web应用中通用操作的标签。例如:【用于输出文本内容的<c: out>标签,用于条件判断的<c: if>标签,用于迭代的<c: forEach>标签】

    • |18N是一个国际化/格式化标签库,它包含了实现Web应用程序的国际化标签和格式化标签。例如:【设置JSP页面的本地信息,设置JSP页面的时区、使日期按照本地格式显示】

    • SQL是一个数据库标签库,它包含了用于访问数据库和对数据库中的数据进行操作的标签。例如:【从数据库中获取连接,从数据表中检索数据】

    • XML是一个操作XML文档的标签库,它包含XML文档中的数据进行操作的标签。例如:【解析XML文件,输出XML文档中内容,以及迭代处理XML文档中的内容,XML广泛应用于Web开发,使用XML标签库处理XML文档更加简单方便】

    • Functions是一个函数标签库,它提供了一套自定义EL函数包含了JSP网页制作作者经常要用到的字符串操作。例如:【提取字符串中的子字符串】

  2. Core核心标签库

    1. < c:out >

      • 语法1:没有标签体

        <c:out value="value" [default="defaultValue"] [escapeXml="{true|false}"]/>

      • 语法2:有标签体

        <c:out value="value" [escapeXml="{true|false}"]>

        ? default

        </c:out>

      • <c: out>标签当中的属性

        value属性:指定输出的文本内容。

        default属性:指定当value属性为null时所输出的默认值。

        escapeXml属性:指定要输出的内容是否将>、<、$、‘、"等特殊字符进行HTML编码转换后再进行输出,默认为true。

    2. < c:if >

      • <c: if>=if语句条件判断,如果在JSP页面中进行条件判断,就需要使用Core标签库的<c: if>标签

      • 语法1:没有标签体

        <c:if test="testCondition" var="result" [scope="{page | request | session | application}"]/>

      • 语法2:有标签体

        <C:if test="testCondition" var="result" [scope="{page | request | session | application}"]>

        ? body content

        </c:if>

      • <c: if>标签当中的属性

        test属性:用于设置逻辑表达式

        ver属性:用于设置逻辑表达式中变量的名字

        scope属性:用于指定ver变量的作用范围,默认为page

    3. < c:choose>

      • < c:choose>=if.else语句,< c:choose>标签用于指定多个条件选择的组合边界。必须与<c: when>、<c: otherwise>标签一起使用。
    • <c: choose>标签没属性在<c: choose>标签中可以嵌套多个<c: whne>标签和<c: otherwise>标签。

      <c: choose>
      
      ?	<c: when test=${param.age==20}>
      
      ?	//相当于if(param.age==10){ out }
      
      ?	</c: when>
      
      ?	<c: when test=${param.age==21}>
      
      ?	</c: when>
      
      ?	<c: otherwise>
      
      ?	//相当于else如果上面<c: whne>标签test属性都不成立则执行<c: otherwise>标签。
      
      ?	</c: otherwise>
      
      </c: choose>
      

      <c: choose>

      ? <c: when test=${param.age==20}>

      ? //相当于if(param.age==10){ out }

      ? </c: when>

      ? <c: when test=${param.age==21}>

      ? </c: when>

      ? <c: otherwise>

      ? //相当于else如果上面<c: whne>标签test属性都不成立则执行<c: otherwise>标签。

      ? </c: otherwise>

      </c: choose>

    1. < c:forEach >

      • < c:forEach >标签用于对Set,List,Map等集合进行迭代

      • 语法1:迭代包含多个对象的集合

        <c: forEach [var="varName"] items="collection" [varStatus="varStatusName"] [bdgin="begin"] [end="end"] [step="step"]>

        </c: forEach>

      • 语法2:迭代指定范围内的集合

        <c: forEach [var="varName"] [varStatus="varStatusName"] bdgin="begin" end="end" [step="step"]>

        </c: forEach>

      • < c:forEach >标签当中的属性

        var属性用于将当前迭代到的元素保存到page域中的名称。

        items属性:用于指定将要迭代的集合对象

        varStatus属性:指定档当前迭代状态信息的对象保存到page域中的名称。可以获取:【count,index,first,last】信息

        begin属性:用于指定从集合中第几个元素开始迭代。

        step属性:由于指定迭代的步长。

        <% 
        	Map userMap = new Hash();
        	userMap.put("Tom","123");
        	userMap.put("Make","123");
        	userMap.put("Lina","123");
        %>
        //遍历HashMap集合中的元素
        <c:forEach var="entry" items="<%=userMap%>">
            ${entry.key};${entry.value}
        </c:forEach>
        //使用begin,step属性指定步长遍历元素
        <c:forEach var="entry" items="<%=userMap%>" begin="0" end="1" step="2">
            ${entry.key};${entry.value}
        </c:forEach>
        //使用varStatus属性获取元素的状态信息,varEach属性用来javax.servlet.jsp.jstl.core.LoopTagStatus类型的变量,这个变量包含了从集合中取出元素的状态信息,可以获得以下信息S。
        	cound:表示元素在集合中的序号,从1开始计数。
        	index:表示当前元素在集合中的索引,从0开始。
        	first:表示当前是否为集合中的第1个元素。
        	last:表示当前是否为集合中的最后一个元素。
        <c:forEach var="entry" items="<%=userMap%>" varStatus="status">
            键值${entry.key};${entry.value}
            序号${status.count}
            索引${status.index}
            是否是第一个${status.first}
            是否为最后一个${status.last}
        </c:forEach>
        
        
    2. < c:param >||< c:url >

      • < c:param >标签用于在URL地址中的附加参数通常嵌套在<c: url>标签中使用。

      • 语法1:使用value属性指定参数的值

        <c:param name="name" value="value">

      • 语法2:在标签中指定参数的值

        <c:param name="name">

        </c:param >

      • < c:param >标签当中的属性

        name属性:用于指定参数的名称。

        value属性:用于指定参数的值。

      • < c:url >标签用于按特定的规则重新构造URL。

      • 语法1:没有标签实体的情况

        <c:url value="value" [context="context"] [var="varName"] [scope="{page | request | session | application}"]>

        </c:url >

      • 语法2:有标签实体的情况,在标签实体中指定构造URL参数

        <c:url value="value" [context="context"] [var="varName"] [scope="{page | request | session | application}"]>

        ? <c:param >标签

        </c:url >

      • < c:url >标签当中的属性

        values属性:用于指定构造的URL

        context属性:用于指定导入同一个服务器下其他Web应用的名称。

        var属性:用于指定将构造的URL地址保存到域对象的属性名称。

        scope属性:用于将构造好的URL保存到域对象中。

        两种方式构造URL路径

        //绝对路径构造URL
        <c:url var="myURL" value="http//localhost:8080/chapter07/register.jsp">
            <c:param name="username" nalue="长江">
            <c:param name="username2" nalue="黄河">
        </c:url>
                <a href="${myURL}">one.jsp</a>a>
        //相对路径构造URL
        <c:url var="myURL" value="one.jsp?username=长江&usernmae2=黄河" />
                <a href="${myURL}">one.jsp</a>
        

Filter过滤器

  1. Filter原理

    • Filter和Listener是Servlet规范中的两个高级特性,不同于Servlet,它们不用处理客服端请求。Fliter用于对Repuest,Response对象进行修改,Listener用于对context,session,repuest事件进行监听。
    • 当浏览器访问服务器的目标资源时,Filter拦截,在Filter中进行预处理操作,然后将请求发给目标资源,当服务器接收到这个请求后会对其进行响应,在服务器处理响应过程中,也要先将响应结果发给过滤器,在过滤器中对响应结果进行处理后,才会发给客服端。
    • Web 总结
  2. Filter方法

    • Filter过滤器其实就是一个实现了Javax.servlet.Filter接口的类在该接口中定义了3个方法。

      方法声明 功能描述
      init(FilterConfig filterconfig) init()方法用来初始化过滤器
      doFilter(ServletRequest request,ServletResponse response,FilterChain chain) doFilter()方法有多个参数,其中request和response参数为Filter链的上一个Filter传递过来的请求和响应对象。chain代表当前的Filter链的对象。
      destroy() 用于释放被Filter对象打开的资源
  3. Filter映射

    • 什么是Filter映射:Filter拦截的资源需要在web.xml文件中进行配置,这些配置信息就是Filter映射。

      比如:使用通配符”*“拦截用户所有请求

      <filter>
          <filter-name>Filter01</filter-name>
          <filter-class>xxx</filter-class>
      </filter>
      <filter-mapping>
          <filter-name>Filter02</filter-name>
          <url-pattern>/*</url-pattern>
      </filter-mapping>
      
    • 拦截不同方式的请求:在XML文件中,一个<filter - mapping>元素用于配置一个Filter所负责拦截的资源。<filter - mapping>元素中有一个特殊的子元素,该元素用于指定过滤器所拦截的资源被Servlet容器调用的方式,元素有4个值。

      <1>REQUEST

      当用户直接访问页面时,Web容器将会调用过滤器,如果目标资源是通过RequestDispatcher的include()或forward()方法访问的那么该过滤器将不会调用。

      <2>INCLUDE

      如果目标资源是通过RequestDispatcher的include()方法访问的,那么该过滤器将被调用,除此方法之外该过滤器都不会被调用。

      <3>FORWARD

      如果目标资源是通过RequestDispatcher的forward()方法访问的,那么该过滤器将被调用,除此之外,过滤器不会被调用。

      <4>ERROR

      如果目标资源是通过声明异常处理机制调用的,那么该过滤器将被调用,除此之外过滤器不会被调用。

      例如:

      <filter>
          <filter-name>Filter01</filter-name>
          <filter-class>ImplementsDilter</filter-class>
      </filter>
      <filter-mapping>
          <filter-name>Filter02</filter-name>
          <url-pattern>/*</url-pattern>
          //只对通过forward()方法访问的该页面的请求进行拦截
          <dispatcher>FORWARD</dispatcher>
      </filter-mapping>
      
  4. Filter

    • 每个Filter程序都可以针对某个URL进行拦截,如果多个程序都对同一个URL进行拦截,那么这些Filter就会组成一个Filter链(过滤器链)。需要注意Filter链中各个Filter拦截顺序与它们在web.xml文件中<ilter - mapping>元素的映射顺序一致。

      Web 总结

  5. FilterConfig接口

    • 为了获取Filter程序在web.xml文件中的配置信息,servlet API提供了一个FilterConfig接口,该接口封装了Filter程序在web.xml中的所有注册信息,提供了一些获取这些配置信息的方法。

      方法声明 功能描述
      String getFilterName() 该方法用来返回在web.xml文件中为Filter所设置的名称,也就是<filter - name>元素的值
      String getInitParameter(String name) 该方法用于返回在web.xml文件中为Filter所设置的某个名称的初始化参数值,如果不存在则返回null
      Enumeration getInitParamenerNames() 用于返回一个Enumeration集合的对象,该集合中包含了在xml文件中为当前Filter设置的所有初始化参数的名称
      ServletContext getServletContext() 该方法用于返回FilterContext对象中所包装ServletContext对象的引用

Listener监听器-Servlet事件监听

  1. 监听器的组成

    在开发Web应用程序时,也会使用监听器被称为Servlet事件监听器。Servlet事件监听器是一个实现列特殊接口的Java程序,专门用来监听Web应用程序中ServletContext,HttpSession,ServletRequest等域对象的创建和销毁过程,监听这些域对象属性的修改以及感知绑定到HttpSession域中某个对象的状态。

    • 事件(Event):用户的一个操作
    • 事件源:产生事件的对象
    • 事件监听器(Listener):负责监听发生在事件源上的事件
    • 事件处理器:监听器的成员方法

    事件监听器工作时可以分为几个步骤。

    • 将监听器绑定到事件源,也就是注册监听器。
    • 事件发生时会触发监听器的成员方法,即事件处理器。
    • 事件处理器通过事件对象获得事件源,并对事件源进行处理。
  2. Servlet事件监听器

    类型 描述
    ServletContextListener 监听ServletContext对象的创建与销毁过程
    HttpSessionListener 监听HttpSession对象的创建与销毁过程
    ServletRequestListener 监听ServletRequest对象的创建与销毁过程
    ServletContextAttributeListener 监听ServletContext对象中属性的比更
    HttpSessionAttributeListener 监听HttpSession对象中属性的比更
    SerlvetRequestAttributeListener 监听ServletRequest对象中属性的比更
    HttpSessionBindingListener 用于监听JavaBean对象绑定到HttpSession对象和从HttpSession对象解绑的事件
    HttpSessionActivationListener 用于监听HttpSession中对象活化和钝化的过程
  3. 监听域对象的生命周期

    • <1>创建监听器

    • <2>添加监听器信息

      在web.xml文件中添加事件监听器信息。特别需要注意的是在web.xml文件中的元素必须位于所有的元素之前以及所有元素之后,否则Web容器会在启动时提示错误信息。

      <listener>
          <listener-class>
              ImppiementsListener
          </listener-class>
      </listener>
      
  4. 监听域对象的属性变更:其实就是添加,修改,删除域属性。


JSP开发模型

JSP开发模型

  1. JSP Model 1

    • JSP Model1简单轻便,适合小型Web项目的快速开发

    • JSP Model1采用JSP+JavaBean的技术,将页面和业务逻辑分开。其中,JSP实现流程控制和页面显示,JavaBean对象封装数据和业务逻辑。

      Web 总结

    • 图中可以看出,JSP Model1模型将封装数据和处理数据的业务交给了JavaBean组件,JSP只负责接收请求和调用JavaBean组件来响应用户的请求,这种设计实现了数据,业务逻辑和页面显示的分离,在一定程度上实现了程序开发的模块发,降低了程序修改和维护的难度。

  2. JSP Model 2

    • JSP Model2模型是在JSP Model1的基础上提出的,它提供了跟清晰的代码分层,跟适用于多人合作开发的大型Web项目。

    • JSP Model2架构模型采用JSP+Servlet+JavaBean的技术,此技术将原本JSP页面中的流程控制代码提取出来,封装到Servlet中,从而实现了整个程序页面显示,流程控制和业务逻辑的分离。

      Web 总结

    • 实际上,JSP Model2模型就是MVC(模型Model-视图View-控制器Controller)设计模式。其中,控制器由Servlet实现,视图由JSP页面实现,模型由JavaBean实现。


MVC设计模式

  1. 模型(Model)
    • 模组(Model)负责管理应用程序的业务数据,定义访问控制以及修改这些数据的业务规则。当模型的状态发生改变时,他会通知视图发生改变,并未视图提供查询模型状态的方法。
  2. 视图(View)
    • 视图(View)负责与用户进行交互,它从模型中获取数据向用户展示,同时也将用户请求传递给控制器进行处理。当模型的状态发生改变时,视图会对用户界面进行同步更新,从而保持与模型数据的一致性。
  3. 控制器(Controller)
    • 控制器(Controller)负责应用程序中处理用户交互的部分,它负责从视图中读取数据,控制用户输入,并向模型发送数据。

Web 总结

Web 总结

上一篇:HTML特殊符号


下一篇:webpack高级概念,typeScript的打包配置(系列十三)