JavaWeb(超级无敌认真好用,万字收藏篇!!!!)

1.JavaWeb

​ JavaWeb开发它是一个结合,将前期学的所有内容结合到一起,JavaWeb新内容不是特别多
但JavaWeb开发的思想咱们要在这个阶段形成,在现在开发中JavaWeb的相关技术不在直接使用,甚至有些技术不在使用,但是Web开发的模式及思想需要咱们形成
前期的所有内容不能称为软件,视图和底层处理并没有真正的结合,JavaWeb开始,我们可以看到视图(界面)+服务端处理+数据库交互,来形成一个完整项目。

1.1 开发模式

(1)C/S:Client/Server(客户端/服务器)

指要在自己电脑上安装专属客户端,使用该客户端与服务端进行交互

​ 类似于:QQ/微信/大型网游/多媒体教学软件
​ 优点:
1. 便于留存( 可以有效的利用带宽,在网络传输中只需传输变动数据,提高软件的留存率)
2. 易于大型软件使用
​ 缺点:
1. 开发成本高
2. 维护成本高

(2)B/S:Blag/Server(浏览器/服务器)

B/S结构指用户通过浏览器可以直接访问,这种方式是目前使用比较广的方式

​ 优点:

  1. 开发成本低
  2. 维护成本低
  3. 便于直接开发
    ​ 缺点 :
    1. 不便于留存(需要用户记住网址)[企业内部使用]
    ​ 2. 目前不适合大型数据传输

1.1.1 B/S结构的相关技术

​ (1)服务端:JavaSE\数据库\Setvlet/JavaEE框架技术
​ (2)客户端:HTML\avaScript\JQuery\Ajax\其他前端框架

1.1.2 B/S操作模式

在这里插入图片描述

  • IP地址是每台电脑在网络上的地址
  • 我们是用的IP地址是动态的

在web应用都是使用请求——响应这种模式进行的;
在B/S结构是不存在没有请求直接由服务端主动向客户端推送数据的;

1.2 JavaWeb中的服务器–tomcat

1.2.1服务器

​ (1)硬件服务器:一台电脑、云服务器
​ (2)软件服务器:软件服务器又叫应用服务器,它是运行在电脑上的一个软件
在该软件上可以部署运行其他应用,此时这个软件我们就叫服务器。

1.2.2 tomcat服务器

Tomcat是一个 JavaEE的应用服务器,我们编写的 Web应用发布到tomcat服务器后,启动服务器就可以被用户访问(通过浏览器及网址直接访问)
应用服务器用于编译、解析、发布我们的程序

1.2.3 tomcat的安装

点击进入官网下载

在这里插入图片描述
在这里插入图片描述

  1. Tomcat目录结构

在这里插入图片描述

  1. 配置环境变量
  • 添加系统变量:CATALINA_HOME

在这里插入图片描述

  • 在系统变量的path里添加 %CATALINA_HOME%in%CATALINA_HOME%lib

在这里插入图片描述

  1. 测试运行

​ 以管理员身份打开cmd,然后进入 tomcat 的 bin 目录,输入 service.bat install

​ 打开bin目录双击startup.bat文件。

在这里插入图片描述

浏览器里输入:http://localhost:8080/成功打开则说明下载及配置成功

1.2.4 IDEA创建一个javaweb项目

​ 参考这篇文章:https://zhuanlan.zhihu.com/p/100092323

1.3 JSP

1.3.1 Jsp的介绍

​ JSP全称:Java Server Page(Java服务器页面)
​ JSP是在HTML文件中嵌入Java代码,在页面中可以使用Java代码执行动态内容,使用 HTML代码执行静态内容
​ Java代码负责功能处理并动态生成结果,HTML对页面及Java生成的结果进行美化及展示
​ 常用编码:
​ ISO-8859-1:西方编码不支持中文
​ GB 2312:支持中文,只支持简体中文
​ GBK:支持中文,支持简体中文和繁体中文
​ UTF-8:支持全球所有国家的语言

1.3.2 JSP页面内容组成

​ 1. 静态内容:HTML/CSS/JavaScript

​ 2. 指令<%@ 指令名%>: 指令名一般用于设置页面

​ 3.小脚本<%java代码%>:用于编写java代码,除了不能定义方法和属性可以写任意java代码

​ 4.表达式<%=表达式%>:用于向页面输出java内容

​ 5.声明<%!声明内容%>:用于在页面中声明方法

​ 6.注释<%–JSP–%>:JSP注释

​ 7.标准动作< jsp:动作名/>:用于在JSP页面中执行一个功能

1.3.3 JSP的执行过程

.isp转义>.java编译>.class执行>JVM
JSP页面在第一次执行时,效率低;因为第一次执行需要先转义在编译在执行
而从第二次开始则不再进行转义和编译直接执行class文件
JSP页面的执行分两部分:
1.首先由服务端执行Java代码,执行后将执行的结果以 html的形式响应到客户端
2.由客户端对响应来的HTML代码进行解释执行

1.3.4使用request和response对象实现用户注册和登陆功能[简易用户管理项目]

源码在这,需要自取

  1. JSP的处理流程

在这里插入图片描述

  1. request对象

    请求对象,客户端向服务端发送称为请求对象

    request. getParameter( “paramName”):根据客户端提交参数的参数名获得对应的参数值(表单)
    request.setCharacterEncoding(“UTF-8”):设置请求对象的编码集
    request.setAttribute( “key” , “value”):向request对象的作用域中存储了一个属性(可以存储多个属性)
    request.getAttribute(“key”):根据属性名获得request对象中存储的属性值
    request.getRequestDispatcher(url).forward(request, response):请求转发

  2. response对象
    响应对象,服务端向客户端发送的称为响应对象
    response.sendRedirect(“ur1”):重定向,用于实现页面跳转(类似于超链接,但重定向不需要点击自动跳转)
    使用重定向可以实现页面跳转,但不能向目标页面传递"请求对象"

  3. 请求转发和重定向的区别?(面试必问题)
    共同点:都可以实现页面跳转
    不同点:
    (1)浏览器显示地址栏显示地址不同

    • 重定向在实现跳转时浏览器地址栏显示的地址为目标地址

    • 请求转发在实现跳转时浏览器地址栏显示的地址是源地址(转发源)

    (2)传递数据不同

    • 重定向在实现跳转可以使用"url传参"的形式项目地址传递数据
    • 请求转发在实现跳转可以使用"url传参"的形式项目地址传递数据,还可以将"请求对象"传递到目标地址

    (3)处理机机制不同

    • 重定向在实现跳转时等同于向服务器又发送了一次请求
    • 请求转发实现跳转属于服务端内部跳转,直接在服务器内部进行跳转处理,不会再次发送请求,所以使用请求转发时可以将原请求对象转发到目标位置,已达到请求延长的效果
  4. 请求转发和重定向的选择问题?
    一般情况下,如果要跳转到页面而且不需要传递请求数据,此时我们使用重定向跳转
    如果是服务器内部的处理程序之间进行跳转或向要将请求对象传递给页面,则此时建议使用请求转发

1.4 JSP内置对象

1.4.1 什么是内置对象

内置对象不是由开发者创建的,而是由"应用服务器创建的(tomcat)",在JSP页面里可以直接使用这些对象

1.4.2 JSP九大内置对象(隐式对象)

  • request:(请求对象)

    他是一个作用域对象,表示客户端向服务端发送的一次请求

    • request的生命周期:仅限一次请求,当客户端向服务端发送请求后,服务端用完将请求直接丢弃
      • 默认情况下,request对象生命周期仅限于一次请求,生命较为短暂
      • 延长request对象生命周期,通过“请求转发”的方式,将request对象传递给其他JSP页面或Servlet,让请求对象延长
    • request对象中的数据:
      • 当发送请求时,客户端会将客户端的相关数据"以字节码的形式""发送到服务端,服务端会将这些请求的字节码进行解码,封装到request对象中

      • 客户端发送的数据:

        • 客户端主机信息
        • 客户端浏览器信息
        • 请求头附加信息
        • 请求参数(表单数据/url数据)
  • 请求对象还可以存放属性,这些属性不是客户端传入的,而是服务端为了"传递数据"主动向request存放的数据

    • JavaWeb中的作用域对象可以添加属性,通过这些属性可以传递数据
      • request内部通过Map集合来存放属性,key是String类型的,Value是Object类型的
    • request.setAttribute( “key” , “value”):向request对象的作用域中存储了一个属性
      request.getAttribute(“key”):根据属性名获得request对象中存储的属性值
    • remove.getAttribute
  • 常用方法:

    (1) request.setCharacterEncoding("utf-8"):设置request对象的编码集
    (2) request.getParameter("paramName"):根据参数名获得对应的参数值
    (3) request.getParameterValues("paramName"):根据参数名获得一组同名的参数值,返回字符串数组
    (4) request.setAttribute(attrName,attrValue):向request作用域中设置一个属性
    (5) request.getAttribute(attrName);从request作用域中获取一个属性的值,默认为Object类型
    (6) request.getRequestDispatch(url).forward(request,response);请求转发
    
  • response:响应对象,服务端对客户端的回应

    • 服务端向客户端响应也可以传递数据,传递的是字符串

      • 响应对象向客户端传递数据的方式有以下三种:

        • 通过url传参传递

        • 通过Cookie传递

          //创建Cookie对象
       Cookie cookie = new Cookie("phone","110");
         //将cookie对象添加到response对象中
         response.addCookie(cookie);
         response.sendRedirect("demo2.jsp");
      
      • 通过I/O流传递(前后端分离后面常用)
         PrintWriter writer = response.getWrite();
                         out.println("hello");
      
    • 响应对象的常用方法:

         response.sendRedirect(url) //重定向,用于实现页面跳转
         response.setContentType("text/html;charset=utf-8") //设置响应的内容类型及编码集
         response.addCookie(cookie)  //向请求对象中添加Cookie对象,此时response对象就会将cookie发送到客户端由浏览器保存cookie
         response.getWrite();获得一个输出流,通过该输出流可以向客户端直接输出内容,如果需要输出中文则需要设置"内容类型"
      
  • session:会话对象

    表示一个会话,什么是会话?

    • 会话指请求响应的集合
    • 会话指客户端第一次向服务端发送请求开始,直到客户端浏览器关闭或服务端关闭或超时或手动销毁终止
    • 会话期间所有“请求和响应”都处于同一会话中

    JavaWeb为什么会存在session的概念?

    • 理解Http协议:Http协议是一个无状态的协议,无状态指该协议下客户端和服务端的连接状态不会保持
    • 由于我们是用Http协议,所以服务端无法确定请求之前是否请求过,但通过session确可以维护当前客户端和服务端的状态
    • web开发中可以通过session来维持客户端和服务端的关系

    web应用中如何利用session来维持客户端和服务端的关系?

    • 通过sessionId维持
      在这里插入图片描述

      1. 当客户端第一次访问服务端,服务端是否存在对应sessionId,若不存在则是第一次访问

      2. 服务端创建一个session对象生成一个唯一的sessionId,将该sessionId保存到服务端并响应到客户端

      3. 客户端浏览器接受到该sessionId,会自动将该sessionId保存下来(临时存储)

      4. 客户端每次向服务端发送请求时都会将sessionId自动发送到服务端

      5. 服务端接收到sessionId检测该sessionId是否有效,同时可以从session对象中获取数据

    • session依赖于浏览器,不同的浏览器产生不同的sessionId

      session开始和销毁条件

      • 开始:客户端第一次访问服务端
    • 销毁有以下几种方式:

      1. 关闭浏览器

      2. 服务端手动销毁,使用session.invalidate();销毁

      3. 超时,当客户端在一定时间内未向服务端发送任何请求,服务端会认为该session失效自动销毁(tomcat的默认超时时间为30分钟)

      4. 服务器关闭或重启

      • session也属于作用域对象,其作用域为第一次请求开始到session销毁结束,在作用域内的数据对同一个session是共享的
    • session常用方法

      session.getId():获得sessionId
      session.invalidate():销毁session
      session.setAttribute(attrName,attrValue):向session作用域中存放一个属性
      session.getAttribute(attrName):从session中获取一个属性值
      
  • application:应用服务器对象

    • 该对象表示当前应用服务器

    • 该对象也属于作用域对象,其中可以存放数据,但该对象作用域于整个服务器,该对象在任何位置任何人都可以获取

      因此在因此在application对象存放的数据为整个服务器的共享数据,关于用户的数据不允许在该对象存放

  • out:输出对象(向页面输出内容对象,该对象不在使用)

  • page:表示当前对象(当前页面对象,等同于this关键字)

  • pageContext:页面上下文对象(当前页面上下文对象,该对象不使用)

  • config:配置对象(配置对象,在页面中可以获取配置信息,不使用)

  • exception:异常对象(处理JSP页面异常,不再使用)

1.5 Servelt(重点)

1.5.1 Servelt的基本使用

  1. 什么是servelt?(面试问)

答:servelt类是运行在服务端的一个Java类,该类有respect(请求对象),response(访问对象),和访问地址

  1. servelt的作用

用于获取客户端请求并向客户端响应

  • 主要负责请求和响应,不做具体功能处理,调用底层功能处理的类和方法
  1. Servelt的使用
  • (1)创建一个类继承HttpServlet类,当一个类继承了HttpServlet类这个类就是Servlet类.

  • (2)重写HttpServlet类的doGet和doPost方法(重写其中一个或者其中两个)

    doGet方法:用于处理客户端提交的get请求

    doPost方法:用于处理客户端提交的Post请求

    Get和Post请求区别(面试重点)

    1. get请求一般是去取获取数据(其实也可以提交,但常见的是获取数据);
      post请求一般是去提交数据。

    2. get因为参数会放在url中,所以隐私性,安全性较差,请求的数据长度是有限制的,
      不同的浏览器和服务器不同,一般限制在 2~8K 之间,更加常见的是 1k 以内;
      post请求是没有的长度限制,请求数据是放在body中;

    3. get请求刷新服务器或者回退没有影响,post请求回退时会重新提交数据请求。

    4. get请求可以被缓存,post请求不会被缓存。

    5. get请求会被保存在浏览器历史记录当中,post不会。
      get请求可以被收藏为书签,因为参数就是url中,但post不能。它的参数不在url中。

    6. get请求只能进行url编码(appliacation-x-www-form-urlencoded),
      post请求支持多种(multipart/form-data)等。

  • (3)对Servlet进行配置,对Servlet进行配置方式有两种:

    Servlet类的实例不是由开发者自己创建的,而是由应用服务器自己创建的,
    Servlet类一旦创建成功就保存在了服务端内存中

    Servlet一旦创建就保存在服务端内存中,可以通过该Servlet对象的“映射地址”来访问Servlet对象

    Servlet访问流

    ​ (1)客户端直接访问url-pattern,服务器会根据url-pattern查找当前映射路径所对应的servlet对象

    ​ (2)根据servlet对象名来查找当前对象所对应的对象名

    ​ (3)根据请求类型执行对象中对应的方法

    • (1)在web.xml文件中配置
    <!--  servlet配置
               servlet-name:指定对象的对象名
               servlet-class:
    -->
      <servlet>
        <servlet-name>demoServlet</servlet-name>
        <servlet-class>com.jiazhong.registeAndLogin.servlet.ServletDemo</servlet-class>
      </servlet>
      <!--servlet映射配置
            servlet-name:Servlet对象名,与servlet配置的对象名一致
            url-pattern:配置当前Servlet映射地址,地址名可以任意
      -->
      <servlet-mapping>
        <servlet-name>demoServlet</servlet-name>
        <url-pattern>/demo.do</url-pattern>
      </servlet-mapping>
    
    • (2)用注解进行配置

      • 在Servlet类上面使用@WebServlet(当前Servlet访问路径)注解进行配置即可

        • 默认情况Servlet对象名为类名首字母小写
        • 完整配置@WebServlet(name=“name指定对象名” urlPatterns="指定路径名"当前Servlet访问路径)

1.5.2 Servlet修改注册和登陆功能[简易用户管理项目]

源码在这,需要自取

1.5.3 Servlet生命周期管理

Servelt的生命周期

Servelt从创建到消亡的过程

  • 第一次请求与Servlet:先执行无参数的构造方法创建Servlet对象,然后执行init方法,执行doGet方法

  • 从第二次请求开始,不在创建Servlet对象,而是直接访问doGet方法(服务方法)

    (1)Servlet的生命周期包含以下几个阶段:

    • 实例化:调用无参构造方法创建Servlet对象(由Web服务器创建)
      ​ 当第一次请求Servlet时,Web服务器会对该Servlet进行实例化创建Servlet类对象
      ​ 在第一次访问时创建,对象创建就常驻内存,其后每次访问时从内存中获取该对象直接使用
    • 初始化:当一个Servlet对象创建后,会自动调用初始化方法,进行初始化操作,该方法只会被调用一次 ​
    • 服务:服务指的是doGet|doPost|doDelect|doPut|Servcie…这些都是服务方法
      ​ 每次请求一个Servlet是就会执行某个服务方法,根据请求的类型不同执行的服务方法不同
    • 销毁:放服务器关闭会自动调用destory方法,来清理当前Servlet所占用的资源

    Servlet的创建时机
    1. 默认情况下,用户第一次访问Servlet时,服务器会创建Servlet对象(懒加载机制)
    2. 我们可以在注解中加入"loadOnStartup=0"或者在web.xml<servlet>加入标签<lodad-on-startup>来修改Servlet创建的创建优先级,当值为0时表示服务器启动时会自动创建Servlet对象

1.5.4 Servlet的类结构及执行过程

  • 自定义的Servlet继承HttpServlet
  • HttpServlet继承GenericServlet
  • GenericServlet实现Servlet接口
  • 我们现在的项目为web项目,web项目都是基于Http协议,HttpServlet它是基于Http协议实现的Servlet
  • 客户端请求发送给Servlet中的doGet或doPost请求
  • 客户端发送请求直接提交给HttpServlet类中的service方法(服务方法),然后service方法中判断请求的方式,根据不同的请求方式委派为doGet或doPost或其他方法执行
  • 我们的实现,在自定义Servlet中重写service方法,在service方法中直接处理功能,不在将请求委派为doGet或doPost方法…

1.5.5 使用请求转发和重定向实现功能[简易用户管理项目]

源码在这,需要自取

  • 管理员登陆功能
    • 客户端输入管理员账号和密码,定义一个loginServlet从客户端获取数据,传入底层adminLogin方法,获得respnse响应
      • 使用request获取数据
      • 将获取数据传入底层功能实现
      • response重定向到成功页面和请求转发到失败页面
  • 用户查询功能
    • 要从数据库查出用户信息
    • 定义一个queryuserServlet,来从服务端获取用户数据在JSP页面中显示
    • 将服务端的数据传递给JSP页面,页面显示
  • 用户删除功能
    • 将用户编号传入到服务端
    • 服务端获取用户编号,向数据库发送删除SQL语句并删除指定数据
    • 删除成功后成功后跳转到用户列表
  • 用户修改功能
    • 将请求发送到根据用户编号获得用户信息的Servlet
    • 调用底层功能实现
    • 底层返回查询结果
    • 将用户信息提交到修改页面显示
    • 提交修改到“修改Servlet”,Servlet进行调用底层功能
    • 返回修改后的数据到“修改Servlet”
    • 从“修改Servlet”跳转到用户列表页面显示

1.6 JSP 标签库与 EL 表达式

​ JSP页面中会存在大量JAVA代码

  • 存在问题:
    1. JSP页面凌乱
    2. 不适合前端人员开发前端代码
  • 如果我们在开发中还使用JSP页面,要实现无脚本页面
  • 在开发中使用JSTL和EL表达式来实现无脚本页面
  • JSTL和EL可以单独使用,一般搭配使用

1.6.1 JSTL的基本使用

  1. 什么是JSTL页面

    JSTL全称JSP标准标签库,使用JSTL可以在JSP页面上通过一些标签实现逻辑处理能力

    虽然JSTL是页面标签,但是每个标签后面都有一个Java类继承

  2. JSTL包含一下标签

    1. 核心标签:该标签主要用于处理页面逻辑程序如:if|for…
    2. 格式化标签:该标签主要用于处理时间和数字格式
    3. SQL标签:该签允许JSP页面使用SQL语句,现在开发不允许这样做(不使用)
    4. XML标签:该标签允许在JSP页面进行XML文件的解析和处理(不适用)
    5. I18N标签:(internationalization):国际化标签,主要用于处理多语言系统
    6. fn函数:fn函数提供了一些用于处理的方法,如获得集合的大小、字符串的常用方法
  3. JSTL的使用

    ①在Maven中引入JSTL依赖包

    <dependency>
              <groupId>org.apache.taglibs</groupId>
              <artifactId>taglibs-standard-compat</artifactId>
              <version>1.2.5</version>
          </dependency>
    

    ②JSP页面引入JSTL核心标签库

    <%--
        taglib:引入JSTL标签库
        prefix:设置标签的前缀,核心标签一般为c
        url:指定标签库位置
    --%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    

    ③在页面中使用

  4. JSTL核心标签的常用标签

    ①out标签:<c:out>,out标签主要用于向页面输出内容

    <c:out value="${name}" default="自定义内容" escapeXml="false"/>
    <!--
        value:表示输出的值,如果输出的值为EL表达式,则表示为某个作用域的值
        default:默认值,若value没有值则输出 dafault的值
        escapexml:是否对xml/html解释执行
    --!>
    

    ②set标签:<c:set>,用与向某个作用域设置属性,用来替换setAttribute();

    <c:set value="20" var="age" scope="request"></c:set>
    <!--
        向requst作用域设置一个age=20的属性	
    -->
    

    ③remove标签:<c:remove>,主要用于从某个作用域中移除某个属性

    <c:remove var="age" scope="request"></c:remove>
    <!--
       删除request中属性名为age的属性
    -->
    

    ④if标签:<c:if>单分支语句标签

    <c:if test="${判断语句}">
        输出内容
    </c:if>
    <!--
    判断test属性的值,如果为true则执行标签体内容,如果为false则不执行
    *JSTL中只有if标签没有else标签,JSTL没有if-else标签,JSTL可以使用choose标签来替代
    -->
    

    ⑤choose标签:<c:choose>等同于java中的Switch语句,该标签不能单独使用,必须搭配when标签 已经otherwise标签 搭配使用

    <c:choose>
        <c:when test="判断语句">输出内容</c:when>
        <c:when test="判断语句">输出内容</c:when>
        <c:otherwise>其他内容</c:otherwise>
    </c:choose>
    <!--
       判断 第一个when标签的test属性,若true则执行,反正向后继续执行,
       若when标签test属性都为false
        则返回 otherwise标签  
    -->
    

    ⑥forEach标签:<c:forEach>等同于java中的for循环

    <%
        List<String> strList =new ArrayList<>();
        strList.add("1");
        strList.add("2");
        strList.add("3");
        request.setAttribute("strList",strList);
    %>
    <c:set var="str" value="${strList}" scope="request"></c:set>
    <c:forEach var="str1" items="${str}" varStatus="status">
           ${str1}--->${status.index}---->${status.count}<br>
    </c:forEach>
    
    <!--
        items:用于执行遍历的集合
        str:每次遍历的值会赋给该遍历
        varStatus:循环的状态
              循环下标:status.index 循环次数:status.count
    -->
    
    <c:forEach begin="1" end="9" step="1" varStatus="status">
        ${status.index}-------->你好《=<br>
    </c:forEach>
    <!--
           begin:从某值开始循环,起始大小
           end:表示结束大小
           step:表示步长,相当于 i++,i+2....
    --!>
    
  5. 格式化标签的使用

    • 引入格式化标签

      <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
      
    • 格式化时间:

      <fmt:formatDate value="${nowTime}" pattern="yyyy年MM月dd日 HH:mm:ss"/>
      
    • 格式化数字

      <fmt:formatNumber value="1234567895.646" pattern="###,###,###.##"></fmt:formatNumber>
      

1.6.2 EL表达式的使用

用于替换JSP中<%=Java代码%>

EL表达式语法简介,功能强大,在JSP页面会大量的使用EL表达式而不再使用传统的脚本

EL表达式的主要用于向从作用域中获得属性的值并向页面输出的

  1. EL表达式基本功能

    计算机向页面输出内容

    --------------------------分隔符---------------------------------------

    EL表达式目前默认是被禁用的,使用的话需要配置,在JSP页面里设置isELIgnored="false" 表示关闭忽略EL表达式,或者在Web.xml文件里配置,创建项目生成的web.xml文件不是标准的配置文件,可删掉

    • 在服务器里的config文件夹里的web.xml文件与我们的项目共享,里面配置了EL表达式可以正常使用
    <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
    
    • 计算并输出内容

      ${
              
              "hello,word"} 
      ${
              
              2+2}
      
    • 从作用域中获取对象

      JSP作用域对象包括,request,session,application,这三个对象都可以存储属性,通过EL表达式可以很便捷的从这三个作用域中获取属性的值

      <c:set value="1" var="sex" scope="request"/>${sex==1?"男":"女"}
      <!--传统方式-->
      <br><hr>
      <%
          Integer i=Integer.valueOf((String) request.getAttribute("sex"));
      %>
      <%=i+10%>
      <!--使用EL表达式-->
      ${sex+11}
      
      • 使用传统方式需将Object类型转换,而使用EL表达式自动转换

      EL表达式从作用域中获取的值默认是有顺序的:按作用域范围从小到大取值

      • page---->request------->session------>application

      由于EL表达式默认从作用域最小的作用域对象中查找数据,除非属性在page作用域否则会查找其他作用域,效率不高

      一般我们会避免EL表达式从作用域中自动搜索,我们从指定作用域搜索

            <c:set var="name" value="sessionName" scope="session"/>
            <c:set var="name" value="application" scope="application"/>
            <c:set var="name" value="requestName" scope="request"/>
      ${sessionScope.name}------->session作用域取值<br>
      ${requestScope.name}-------->request作用域取值<br/>
      ${applicationScope.name}------->application取值<br/>
      
    • 获取对象中的属性值

      • EL表达式从实体对象获取属性的值时使用的名字与属性名无关${requestScope.student.stuName}

      • EL表达式内部将字符串"stuName"的首字母转换为大写并在前面拼接上"get"字符串,形成get方法的方法名字符串

      • 然后使用反射技术根据get方法的方法名获得get方法的方法对象并调用该方法

      • 简单理解EL根据获取实体对象属性值是根据get方法获取

1.6.3 利用JSTL和EL表达式来修改[简易用户管理项目]

源码在这,需要自取

1.7过滤器Filter

1.7.1 什么是过滤器?

  • 用于拦截向系统发送的请求及响应(不同的过滤器所拦截的请求由不同的配置决定)
  • 过滤器是特殊的Servlet,过滤器配置路径后无需调用,当前请求这些配置的路径时,过滤器自动调用
  • 当请求访问系统时,首先过滤器收到请求并进行处理,处理结束后,该请求传递到下一个过滤器或Servlet

1.7.2 使用过滤器

  • 创建一个类实现package javax.servlet.Filter接口

  • 实现接口的doFilter方法(该方法用于实现过滤逻辑)

    • doFilter中要有结果处理(将请求放行或转到其他地方),否则请求会停留在过滤器中

      filterChain.doFilter(servletRequest,servletResponse);//放行继续访问该位置

      • 该段代码之前为请求期代码,之后是响应期代码
  • 配置过滤器

    • 基于Web.xml配置文件配置
       <!--
             配置过滤器对象,配置后tomcat会自动创建过滤器对象
              <filter-name>:指定过滤器对象名
              <filter-class>:指定要配置过滤器的类
       -->
        <filter>
            <filter-name>demoFilter</filter-name>
            <filter-class>com.jiazhong.filters.demoFilter</filter-class>
        </filter>
        <!--
           配置过滤器映射,配置后当浏览器访问该映射路径时对应过滤器会自动执行
           <filter-name>:要执行的过滤器对象
           <url-pattern>: 过滤器映射路经,配置后,只要访问该路径下资源过滤器自动执行
        -->
        <filter-mapping>
            <filter-name>demoFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    
    • 基于@WebFilter()注解配置

1.7.3 过滤器的生命周期?

① 当服务器启动时 Filter 对象被创建并自动执行 init 方法

② 当每次访问被过滤器拦截的 web 资源时执行 Filter 中的 doFilter 方法实现过 滤功能

③ 当服务器关闭时执行 Filter 的 destroy 方法销毁相关资源

1.7.4 什么是过滤器链

  • 由多个过滤器组成一个执行链,这个执行链就是过滤器链
  • 当系统访问多个过滤器时,请求访问根据每个过滤器的拦截路径配置选择执行哪些过滤器

1.7.5 过滤器执行顺序

  • 基于注解配置时,根据类名的字母排序,会使用字符串中的比较器来排序
  • 如果基于xml配置,则根据配置映射路径顺序执行

1.7.6 使用过滤器完成简单的过滤功能并改进[简易用户管理项目]

源码在这,需要自取


  • 学习来自于西安加中实训

猜你喜欢

转载自blog.csdn.net/woschengxuyuan/article/details/126957659
今日推荐