前言

  • JSP、Filter都是 Servlet 的进化版,JSP负责视图展示,Filter负责过滤
  • Servlet规范中三大技术:Servlet、Filter、Listener

Filter 过滤器(单例)

  • 作用
拦截请求响应
  • 应用场景
权限控制、敏感词汇过滤、压缩加密响应信息等
  • 使用步骤
1、创建一个Filter类,实现Filter接口
2、重写接口方法
3、web.xml配置Filter
  • 配置Filter(在web.xml中)
    <filter>
        <filter-name>userFilter</filter-name>
        <filter-class>com.tuobida.filter.UserFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>userFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
  • 初始化时机
Filter其实是加了load-on-startup的servlet,换句话说:Tomcat启动时,Filter就已经加载创建并初始化好了,所以一个应用每种过滤器只有一个
  • 多个Filter拦截顺序问题(过滤链)
//放行请求
chain.doFilter(req, resp);   //如果没有调用,则拦截
执行顺序取决于<filter-mapping>在web.xml中的位置,越靠前越优先
  • FilterConfig对象的作用
1、获取FilterConfig名称
2、获取FilterConfig初始化参数
3、获取ServletContext对象
  • Filter映射规则配置
1、精确匹配,以‘/’开头
/user
2、匹配所有
/*
3、扩展名匹配
*.jsp
要想单独拦截某个Servlet该如何做呢?(2种方法)
1、配置 <filter-mapping> 的<url-pattern>值 = <servlet-mapping> 的<url-pattern>值
2、配置 <filter-mapping> 的<servlet-name>值

Listener 监听器

  • 作用
监听 ServletContext、HttpSession、ServletRequest 三个对象的生命周期和属性变化事件

**ServletContext代表应用,一个应用对应一个ServletContext对象
**HttpSession代表Session,一个Session代表一个会话,一个浏览器对应一个会话
**ServletRequest代表请求,一个请求就会产生一个ServletRequest对象

按数量来分:ServletRequest > HttpSession > ServletContext
  • 分类
监听生命周期
ServletContextListener
ServletRequestListener
HttpSessionListener

监听属性变化事件
ServletContextAttributeListener
HttpSessionAttributeListener
ServletRequestAttributeListener
  • (多个监听器)执行顺序
按照监听器在web.xml中注册顺序执行
  • 监听器加载时机
在Tomcat启动时加载,ServletContext是Tomcat启动时为每一个应用创建的,HttpSession是浏览器第一次访问服务器时创建,ServletRequest是每次请求都会创建并销毁

Servlet 小程序 (单例)

  • 作用
作为web应用程序入口接受请求并处理,一般MVC中,用作 控制器Controller
  • 使用步骤
1、创建一个Servlet类,实现 HttpServlet接口 或 Servlet接口
2、重写接口方法
3、web.xml配置Servlet
  • 执行过程
启动Tomcat的执行过程:加载每个项目的web.xml配置文件

当浏览器使用URL访问Tomcat时,
1、先查找是否有Tomcat服务器
2、再查找Tomcat中对应的web项目
3、再匹配查找对应Servlet
  • 生命周期
1、出生(初始化)
2、服务
3、死亡(Tomcat停止了)

JSP

JSP 实际上就是 Servlet,只是JSP与html更像作为视图模板
  • 基础语法
1、写Java代码   <%  %>   (代码都是在方法中执行,所以声明的变量都是局部的)
2、输出表达式   <%=  %>  (等同于out.print())
3、声明变量     <%!  %>  (全局声明,成员变量与成员方法)
  • 内置对象(九大内置对象)与 四种作用域对象
  • EL表达式
作用:简化获取数据(获取四大作用域的数据)
${user.username}  ==  作用域对象.getAttribute("user").getUsername()
  • JSTL 标准标签库
作用:实现JSP页面的逻辑处理和流程控制
导入jar包
引入:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<c:set var="name" value="120"></c:set>               // 存数据到作用域对象中
<c:out value="${name}" default="0"></c:out>          // 输出
<c:remove var="name"></c:remove>
  • 三种 JSP指令
1、page   
语法:<%@ page ... %>
主要属性:
import 导包
errorPage
pageEncoding
contentType

2、include
语法:<%@ include ... %>
主要属性:
file 

3、taglib
语法:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
  • 七种 JSP动作
<jsp:include page="date.jsp" />
<jsp:forward page="相对 URL 地址" />
<jsp:param name="fontcolor" value="red" />
<jsp:useBean id="name" class="package.class" />
<jsp:setProperty name="myName" property="someProperty" .../>
<jsp:getProperty name="myName" property="someProperty" .../>
  • 疑问
<%@ page contentType="text/html; charset=UTF-8" %>有什么用?

答:服务器响应浏览器时,response响应头会有这样一个数据:Content-Type:text/html; charset=UTF-8
(有点与<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />作用一样)

包含文件有2种形式,到底有什么区别?
静态包含(先包含,后编译):<%@ include file="/commons/taglibs.jsp"%>
动态包含(先运行,后包含):<jsp:include page="/commons/taglibs.jsp"/>

静态包含:在.jsp转化成.java时,2个.jsp文件转成1个.java文件,速度快
动态包含:在.jsp转化成.java时,2个.jsp文件转成2个.java文件,速度慢
使用原则:能用静态就不要使用动态,一般只使用静态包含

JAVAWEB 项目架构发展历程

  • 第一级:JSP

clipboard.png

  • 第二级:JSP+JavaBean

clipboard.png

  • 第三级:JSP+Servlet+JavaBean (经典MVC)

clipboard.png

Javeweb 执行流程(请求->响应)

执行流程

注意:一般框架都会在web.xml文件中,重新定义默认Servlet或filter用于拦截分发所有请求到自己的架构里进行处理

如果请求URL无法匹配当前Servlet,就会使用默认Servlet来处理先判断URL是文件还是目录,如果是文件就转发,如果是目录就查询welcome-file-list配置

104828720
1.4k 声望222 粉丝

编程其实很枯燥,所以一定要有追求。