0
点赞
收藏
分享

微信扫一扫

javaWeb

愚鱼看书说故事 2022-04-26 阅读 73
java

HTTP协议

  • 什么是http协议?

    http协议:是W3C制定的一种超文本传输协议。(通讯协议:发送消息的模板提前被制定好。)

  • W3C:

    万维网联盟组织

    负责制定标准的:http html4.0 html5.0 XML DOM等规范都是W3C制定的。

  • 什么是超文本?

    超文本说的就是:不是普通文本,比如流媒体:声音、视频、图片等。

    HTTP协议支持:不但可以传送普通字符串,同样支持传递声音、视频、图片等流媒体信息。

  • 这种协议游走在B和S之间。B向S发送数据要遵循HTTP协议。S向B发数据同样也要遵循HTTP协议。这样B和S才能解耦合。

  • 什么是解耦合?

    B不依赖S。

    S不依赖B。

  • B/S表示:B/S结构的系统(浏览器访问WEB服务器的系统)

  • 浏览器 向 WEB服务器发送数据,叫做:请求(request)

  • WEB服务器 向 浏览器发送数据。叫做:响应(response)

  • http协议包括:

    请求协议:

    ​ 浏览器 向 WEB服务器发送数据的时候,这个发送的数据需要遵循一套标准,这套标准中规定了发送的数据具体格式。

    响应协议:

    ​ WEB服务器 向 浏览器发送数据的时候,这个发送的数据需要遵循一套标准,这套标准中规定了发送的数据具体格式。

  • HTTP协议就是提前制定好的一种消息模板。

  • HTTP的请求协议(B---->S)

    http请求协议包括(4部分)

    ​ 请求行

    ​ 请求头

    ​ 空白行

    ​ 请求体

    HTTP GET请求协议的具体报文:

    GET /servlet03/Getservlet?username=%E5%BC%A0%E4%B8%89&password=123 HTTP/1.1
    Host: localhost:8080
    Connection: keep-alive
    sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="99", "Microsoft Edge";v="99"
    sec-ch-ua-mobile: ?0
    sec-ch-ua-platform: "Windows"
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36 Edg/99.0.1150.46
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
    Sec-Fetch-Site: same-origin
    Sec-Fetch-Mode: navigate
    Sec-Fetch-User: ?1
    Sec-Fetch-Dest: document
    Referer: http://localhost:8080/servlet03/
    Accept-Encoding: gzip, deflate, br
    Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
    

    HTTP POST请求协议的具体报文:

    POST /servlet03/postservlet HTTP/1.1														请求行
    Host: localhost:8080																		请求头
    Connection: keep-alive
    Content-Length: 40
    Cache-Control: max-age=0
    sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="99", "Microsoft Edge";v="99"
    sec-ch-ua-mobile: ?0
    sec-ch-ua-platform: "Windows"
    Upgrade-Insecure-Requests: 1
    Origin: http://localhost:8080
    Content-Type: application/x-www-form-urlencoded
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36 Edg/99.0.1150.46
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
    Sec-Fetch-Site: same-origin
    Sec-Fetch-Mode: navigate
    Sec-Fetch-User: ?1
    Sec-Fetch-Dest: document
    Referer: http://localhost:8080/servlet03/
    Accept-Encoding: gzip, deflate, br
    Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
    																							空白行
    username=zhangsan&password=123																	请求体
    
    • 请求行

      包括三部分:

      ​ 第一部分:请求方式:

      ​ get(常用的)

      ​ post(常用的)

      ​ put

      ​ delete

      ​ head

      ​ options

      ​ trace

      ​ 第二部分:URI

      ​ 什么是URI?统一资源标识符。代表网络中某个资源的名字。但是通过URI是无法定位资源的。

      ​ 什么是URL?统一资源定位符。代表网络中某个资源,同时,通过URL是可以定位到该资源的。

      ​ URI和URL什么关系,有什么区别?

      ​ URL包括URI

      ​ http://localhost:8080/serblet03/postservlet这是URL

      ​ /serblet03/postservlet这是URI。

      第三部分:HTTP协议版本号

    • 请求头

      请求的主机

      主机的端口

      浏览器信息

      平台信息

      cookie等信息

    • 空白行

      空白行是用来区分“请求头”和“请求体”的

    • 请求体

      ​ 向服务器发送具体数据

    • http响应协议(S---->B)

      http响应协议包括(4部分)

    ​ 状态行

    ​ 响应头

    ​ 空白行

    ​ 响应体

    HTTP响应协议的具体报文:

    HTTP/1.1 200																		状态行
    Content-Type: text/html;charset=UTF-8												   响应头
    Content-Length: 90
    Date: Sat, 26 Mar 2022 11:13:42 GMT
    Keep-Alive: timeout=20
    Connection: keep-alive
    																					空白行
    <h1>你好牛</h1><h1>你好牛</h1><h1>你好牛</h1><h1>你好牛</h1><h1>你好牛</h1>				 响应体
    
    
  • 状态行三部分组成“

    ​ 第一部分:协议版本号(HTTP/1.1)

    ​ 第二部分:状态码(HTTP协议中规定的响应状态号,不同的响应结果对应不同的号码)

    ​ 200表示请求响应成功,正常结束。

    ​ 404表示访问的资源不存在,通常是因为要么是你路径写错了,要么是路径写对了,但是服务器中对应的资源并没有启动成功,总之404错误是前端错误。

    ​ 405表示前端发送的请求方式与后端请求的处理方式不一致的时候发生。

    ​ 500表示服务器端的程序出现了异常,一般会认为是服务器端的错误导致的。

    ​ 以4开始的,一般是浏览器端的错误导致的

    ​ 以5开始的,一般是服务器端的错误导致的

    ​ 第三部分:状态的描述信息

    ​ ok表示正常成功结束

    ​ not found表示资源找不到

  • 响应头:

    响应的内容类型

    响应的内容长度

    响应的时间

  • 空白行:

    用来分隔“响应头”和“响应体”的。

  • 响应体:

    响应体就是响应的正文,这些内容是一个长的字符串,这个字符串被浏览器渲染,解释并执行,最终展示出效果。

  • 怎么向服务器发送GET请求,怎么向服务器发送POST请求?

    ​ 到目前为止:只有一种情况可以发送post请求:使用form表单,并且form标签中的method属性值为:method=“post”

    其他所有情况都是get请求。

    ​ 在浏览器地址栏上直接输入URL,敲回车,属于get请求

    ​ 使用form表单的时候,form表单中没有写method属性,默认就是get。

  • GET请求和POST请求的区别?

    get请求发送数据的时候,数据会挂在URI的后面,并且在URI后面添加一个?,?后面是数据。这样回到设置发送的数据回显在浏览器的地址栏上。(get请求在请求行上发送数据)

    post请求发送数据的时候,在请求体当中发送。不会回显到浏览器的地址栏上,也就是说post发送的数据,在浏览器地址栏上看不到。(post在“请求行”上发送数据)

    get请求只能发送普通的字符串,并且发送的字符串长度有限制,不同的浏览器限制不同。这个没有明确的规范。

    get请求无法发送大数据量。

    post请求可以发送任何类型的数据,包括普通字符串,流媒体等信息:视频、声音、图片。

    post请求可以发送大数据量,理论上没有长度限制。

    get请求在W3C中是这样说的:get请求比较适合从服务器端获取数据。

    post请求在W3C中是这样说的:post请求比较适合向服务器端传送数据。

    get请求是安全的,get请求是绝对安全的,为什么?因为get请求指示为了从服务器上获取数据。不会对服务器造成威胁。

    post请求是危险的,为什么?因为post请求是倾向服务器提交数据,如果这些数据通过后门的方式进去到服务器中,服务器是很危险的,另外post是为了提交数据,所以一般情况下拦截请求的时候,大部分会选择拦截(监听)post请求。

    GET请求支持缓存,POST请求不支持缓存。

    任何一个get请求最终的“响应结果”都会被浏览器缓存起来,在浏览器缓存单中:一个get请求的路径 对应 一个资源

    实际上:只要发送get请求,浏览器做的第一件是都是先从本地浏览器缓存中找,找不到的时候才会去服务器上获取,这种缓存机制目的是为了提高用户体验。

    post请求不支持缓存。

    ​ post请求之后,服务器“响应的结果”不会被浏览器缓存起来。因为这个缓存没有意义。

    GET请求和POST请求如何选择,什么时候使用GET请求,什么时候使用POST请求?

    ​ 不管你是get请求还是post请求,发送的请求数据格式完全相同的,只不过位置不同,格式都是统一的。

    模板方法设计模式

    • 什么是设计模式?

      某个问题的固定的解决方案(可以被重复使用)

    • 有哪些设计模式?

      GoF设计模式:

      ​ 通常我们所说的23中设计模式。(Gang of Four:4人组提出的设计模式)

      ​ 单例模式

      ​ 工厂模式

      ​ 代理模式

      ​ 门面模式

      ​ 责任链设计模式

      ​ 观察者模式

      ​ 模板方法设计模式

      ​ …

      javaEE设计模式:

      ​ DAO

      ​ DTO

      ​ VO

      ​ PO

      ​ pojo

      • 什么是模板方法设计模式?

        ​ 在模板类的模板方法当中定义核心算法骨架,具体的实现步骤可以延迟到子类当中完成。

      • 模板类通常是一个抽象类,模板类当中的模板方法定义核心算法,这个方法通常是final的(但也可以不是final的)

      • 模板类当中的抽象方法就是不确定实现的方法,这个不确定怎么实现的事儿交给子类去做。

HttpServletRequest接口

  • HttpServletRequest是一个接口,全限定名称:jakarta.servlet.http.HttpServletRequest

  • HttpServletRequest接口是Servlet规范中的一员

  • HttpServletRequest接口的父接口:ServletRequest

    public interface HttpServletRequest extends ServletRequest{}
    
  • HttpServletRequest接口的实现类谁写的?HttpServletRequest对象是谁创建的?

    ​ org.apache.catalina.connector.RequestFacade实现了HttpServletRequest接口

    public class RequestFacade implen=ments HttpServletRequest{}
    
  • 结果:Tomcat服务器实现了HttpServletRequest接口,还是说明了Tomcat服务器实现了Servlet规范。二对于我们javaweb程序员来说,实际上不需要关心这个,我们只需要面向接口编程即可。

  • HttpServletRequest对象中都有什么信息?都包装了什么信息?

    ​ HttpServletRequest对象是Tomcat服务器负责创建的。这个对象中封装了什么信息?封装了HTTP的请求协议。

    ​ 实际上是用户发送请求的时候,遵循了HTTP协议,Tomcat服务器将HTTP协议中的星系以及数据全部解析出来。然后TOMcat服务器把这些信息封装到HttpServletRequest对象当中,传给了我们。

  • request和response对象的生命周期

    ​ request对象和response对象,一个是请求对象,一个是响应对象。这两个对象只在当前请求中有效。

    ​ 一次请求对应一个request

    ​ 两次请求则对应两个request

  • HttpServletRequest有哪些常用的方法?

    ​ 怎么获取前端浏览器用户提交的数据?

    String getParameter(String name)				获取客户端传送给服务器端的有name指定的参数值
    Map<String,String[]> getParameterMap()			这个是获取Map集合中所有的key
    Enumeration<String> getParameterNames()			根据key获取Map集合的value
    String[] getParameterValues(String name)		获取value这个一维数组当中的第一个元素。这个方法最常用。
    //以上四个方法,和获取用户提交的数据有关系
    

    注意:前端表单提交的数据永远是以字符串提交的,后端也是以字符串获取的。session机制

关于B/S结构系统的绘画机制(session机制)

  • 什么是会话?

    • 会话对应的单词:session
    • 用户打开浏览器,进行一系列操作,然后最终将浏览器关闭,这个整个过程叫做:一次会话。会话在服务端也有一个对应的java对象,这个java对象叫做:session。
    • 回顾:什么是一次请求:用户在浏览器上点击一下,然后到页面停下来,可以粗略认为是一次请求。请求对应的服务器端的java对象是:request
    • 一个会话当中包含多次请求。(一次会话对应n次请求)
  • 在java的servlet规范当中,session对应的类名:HttpSession(jarkata.servlet.http.HttpSession)

  • session机制属于B/S结构中的一部分。如果使用php语言开发WEB项目,同样也是有session这种机制的。session机制实际上是一种规范。然后不同的语言对这种会话机制都有实现。

  • session对象最主要的作用是:保留会话状态。(用户登陆成功了,这是一种登陆成功的状态,你怎么把登陆成功的状态一直保持下来呢?使用session对象可以保留会话状态)

  • 为什么需要session对象来保存会话状态呢?

    • 因为HTTP协议是一种无状态协议
    • 什么是无状态:请求的时候,B和S是相连的,但请求结束之后,连接就断了。为什么要这么做?Http协议为什么要设计成这样?因为这样的无状态协议,可以降低服务器的压力,请求的瞬间是连接的,请求结束之后,链接就断开,这样服务器压力小。
  • 为什么不使用request对象保存会话状态?为什么不使用ServletContext对象保存会话状态?

    • request.setAttribute()存,request.getAttribute()取,ServletContext也有这个方法。request请方法。request是请求域。ServletContext是应用域。
    • request是一次请求一个对象。
    • ServletContext对象是服务器启动的时候创建,服务器关闭的时候销毁,这个ServletContext对象只有一个。
    • ServletContext对象的域太大。
  • session的实现原理:

    • JSESSIONID=xxxxx 这个是以Cookie的形式保存在浏览器的内存中的。浏览器只要关闭。这个Cookie就没有了。
    • session列表是一个Map,map的key是sessionid,map的value是session对象。
    • 用户第一次请求,服务器生成session对象,同时生成id,将id发送给浏览器。
    • 用户第二次请求,自动将浏览器内存中的id发送给服务器,服务器根据id查找session、对象
    • 关闭浏览器,内存消失,cookie消失,sessionis消失,会话等同于结束。
  • Cookie禁用了,session还能找到吗?

    • cookie禁用是什么意思?服务器正常发送cookie给浏览器,但是浏览器不要了。拒收了。并不是服务器不发了。
    • 找不到了。每一次请求都会获取到新的session对象。
    • cookie禁用了,session机制还能实现吗?
      • 可以。需要使用URL重写机制。
      • http://localhost:8080/servlet07/test;jsessionid=JSESSIONID=CCC4AB35AA061072895344700EEA1BB5
      • URL重写机制会提高开发者的成本。开发人员在编写任何请求路劲的时候,后面都要添加一个sessionid,给开发带来了很大的难度,很大的成本。所以大部分的网站都是这样设计的:你要是禁用cookie,你就别用。
  • 总结:

    ​ 1.session对象是储存在服务器端的。

    ​ 2.一个session对象对应一个会话。

    ​ 3.一次会话中包括多次请求。

    ​ 4.session怎么获取?

    ​ HttpSession session = request.getSession();

    ​ 从服务器中获取当前的session对象。

    ​ 如果没有获取到任何session对象,则新建。

    ​ HttpSession session = request.getSession(false);

    ​ 从服务器中获取当前session对象,

    ​ 如果获取不到session,则不会新建,返回一个null

    ​ 5.session的实现原理:

    ​ 在web服务器中有一个session列表。类似于map集合。

    ​ 这个map集合的key存储的是sessionID

    ​ 这个map集合的value存储的是对应的session对象

    ​ 用户发送第一次请求的时候:服务器会创建一个新的session对象,同时给session对象生成一个id,然后web服务器会将session的id发送给浏览器,浏览器将session的id保存在浏览器的缓存当中。

    ​ 用户发送第二次请求的时候:会自动将浏览器缓存中的sessionID自动发送给服务器,服务器回去到sessionID,然后从session列表中查找到对应的session对象。

    ​ 6.为什么关闭浏览器,会话结束?

    ​ 关闭浏览器之后,浏览器中保存的sessionID消失,下次重新打开浏览器之后,浏览器缓存中没有这个sessionID,自然找不到服务器中对应的session对象。session对象找不到等同于会话结束。

    ​ 7.session对象什么时候被销毁?

    ​ 一种销毁:是超时销毁

    ​ 一种销毁:是手动销毁

    ​ 手动销毁:session对象.invalidate();

cookie

  • session的实现原理中,每一个session对象都会关联一个cookie,例如:

    • JSESSIONID=BFF79512A34C46009267B6659C9427DE
    • 以上的这个键值对数据其实就是cookie对象。
    • 对于session关联的cookie来说,这个cookie是被保存在浏览器的“运行内存”当中
    • 只要浏览器不关闭,用户再次发送请求的时候,会自动将运行内存中的cookie发送给服务器。
    • 例如:这个Cookie: JSESSIONID=BFF79512A34C46009267B6659C9427DE就会再次发送给服务器。
    • 服务器就是根据BFF79512A34C46009267B6659C9427DE这个值来找到对应的session对象的。
  • cookie怎么生成?cookie保存在什么地方?cookie有啥用?浏览器什么时候会发送cookie,发送那些cookie给服务器?

  • cookie最终是保存在浏览器客户端上的。

    • 可以保存在运行内存当中。(浏览器只要关闭cookie就消失了。)
    • 也可以保存在硬盘文件中。(永久保存。)
  • cookie有啥用?

    • cookie和session机制其实都是为了保存会话状态。
    • cookie是将会话的状态保存在浏览器客户端上。(cookie数据存储在浏览器客户端上的)
    • session是将会话的状态保存在服务器端上。(session对象是储存在服务器上)
    • 为什么要有cookie和session机制呢?因为HTTOP协议是无状态的,无连接协议。
  • cookie经典案例

    • 京东商城,在未登录的情况下,向购物车中放几件商品。然后关闭商城,再次打开浏览器,访问京东商城的时候,购物车中的商品还在,这是怎么做的?我没有登录,为什么还能加商品呢?
      • 将购物车中的商品编号放到cookie当中,cookie保存在硬盘文件当中。这样即使关闭浏览器。硬盘上的cookie还在。下一次再打开京东商城的时候,查看购物车的时候,会自动读取本地硬盘中储存的cookie,拿到商品编号,动态展示购物车中的商品。
        • 京东存储购物车中商品的cookie可能是这样的:productids=xxx,yyy,ggg,kkk
        • 注意:cookie如果清除掉,购物车中的商品就消失了
    • 126邮箱中有一个功能:十天内免登录
      • 这个功能也是需要cookie来实现的。
      • 怎么实现的呢?
        • 用户输入正确的用户名和密码,并且同时选择十天内免登录。登陆成功后。浏览器客户端会保存一个cookie,这个cookie中保存了用户名和密码等信息,这个cookie是保存在硬盘文件当中的,十天内有效。在十天内用户再次访问126的时候,浏览器自动提交126的关联的cookie给服务器,服务器接收到cookie之后,获取用户名和密码,验证通过之后,自动登陆成功。
        • 怎么让cookie失效?
          • 十天过后自动失效
          • 改密码
          • 在客户端浏览器上清除cookie。
  • cookie机制和session机制其实都不从属于java中的机制,实际上cookie机制和session机制都是HTTP协议的一部分。php开发中也有cookie和session机制,只要你是做web开发,不管是什么编程语言,cookie和session机制都是需要的。

  • HTTP协议中规定:任何一个cookie都是由name和value组成的。name和value都是字符串类型的。

  • 在java的servlet中,对cookie提供了哪些支持呢?

    • 提供了cookie类来专门表示cookie数据。jakarta.servlet.http.Cookie;
    • java程序怎么把cookie书发送给浏览器呢?response.add(cookie);
  • 在HTTP协议中是这样规定的:当浏览器发送请求的时候,会自动携带path下的cookie数据给服务器。

  • 关于cookie的有效时间

    • 怎么用java设置cookie的有效时间

      • cookie.setMaxAge(60*60);设置cookie在一小时之后失效
    • 没有设置有效时间:默认保存在浏览器的运行内存中,浏览器关闭则cookie小时。

    • 只要设置cookie的有效时间>0,这个cookie一定会储存到硬盘文件当中。

    • 设置cookie的有效时间 = 0 呢?

      • cookie被删除,同名cookie被删除
    • 0设置cookie的有效时间 < 0 呢?

      • 保存在运行内存中。和不设置一样。
    • 关于cookie的path,cookie关联的路劲:

      • 假设现在发送的请求路劲是“http://localhost:8080/servlet08/cookie/gets”生成的cookie,如果cookie没有设置path,默认的path是什么?
        • 默认的path是:http://localhost:8080/servlet08/cookie以及它的子路径。
        • 也就是说,以后只要浏览器的请求路径是http://localhost:8080/servlet08/cookie这个路径以及这个路径下的子路径,cookie都会被发送到服务器。
      • 手动设置cookie的path
        • cookie.serPath(“/servlet08”);表示只要是这个servlet08项目的请求路径,都会提交这个cookie给服务器。
    • 浏览器发送cookie给服务器了,服务器中的java怎么接收?

      • Cookie[] cookies = request.getCookies();//这个方法可能会返回null;
        if(cookies != null){
        	for(Cookie cookie = cookise){
        		String name = cookie.getName();
        		String value = cookie.getValue();
        	}
        }
        

jsp

  • 指令的作用:直到jsp的翻译引擎如何工作(指导当前的翻译引擎如何翻译jsp文件)

  • 指令包括那些呢?

    • include指令:包含指令,在jsp中完成静态包含,很少用。
    • taglib指令:引入标签库的指令。这个到jstl标签库的时候再学习。现在先不管。
    • page指令:目前重点学习一个page指令。
  • 指令的适用语法是什么?

    <%@page session="true|false"%>
    true表示启用jsp的内置对象session,表示一定启动session对象。没有session对象会创建。
    如果没有设置,默认值就是session="true"
    session="false"表示不启动内置对象session。当前jsp页面中无法使用内置对象session。
    
    <%@page contentType="text/json"%>
    contentType属性用来设置响应的内用类型
    但同时也可以设置字符集
    <%@page contentType="text/json;charset=UTF-8"%>
    
    <%@page pageEncoding="UTF-8"%>
    pageEncoding="UTF-8"表示设置响应时采用的字符集。
    
    <%@page import="java.util.list, java.uitl.Date, java.uitl.ArrayList"%>
    <%@page import="java.uitl.*"%>
    import语句,导包
    
    <%@page errorPage="/error.jsp"%>
    当前页面出现异常之后,跳转到error.jsp页面。
    errorPage属性用来制定出错之后的跳转页面。
    
    <%@page isErrorPage="true"%>
    表示启用jsp九大内置对象之一:exception
    默认值是false
    
  • jsp的九大内置对象

    • jakarta.servlet.jsp.PageContext pageContext; 页面作用域
    • jakarta.servlet.http.HttpServletRequest request 请求作用域
    • jakarta.servlet.http.HttpSession session; 会话作用域
    • jakarta.servlet.ServletContext application; 应用作用域
      • pageContext<request<session<application
      • 以上四个作用域都有:setAttribute、getAttribute、removeAttribute方法
      • 以上作用域的使用原则:尽可能使用小的域。
    • java.lang.Throwable exception
    • jakarta.servlet.ServletConfig config;
    • java.lang.Object page (其实是this,当前的servlet对象)
    • jakarta.servlet.jsp.JspWriter out;(负责输出)
    • jakarta.servlet.http.HttpServletResponse(负责响应)

EL表达式

  • EL表达式是干什么的?

    • Expression Language(表达式语言)
    • EL表达式可以代替JSP中的java、代码,让jsp闻不见中的程序看起来更加整洁,美观。
    • jsp中夹杂着各种java代码,例如<%java代码%>、<%=%>等,导致jsp文件很混乱,不好看,不好维护。所以才有了后期的EL表达式。
    • EL表达式可以算是jsp语法的一部分。EL表达式归属于jsp。
  • EL表达式出现在jsp中主要是:

    • 从某个作用域中取数据,然后将其转换成字符串,然后将其输出到浏览器。这就是EL表达式的功效。三大功效:

      • 第一个功效:从某个域中取数据
        • 四个域
          • request
          • pageContext
          • session
          • application
      • 第二个功效:将取出的数据转换成字符串。
        • 如果是一个java对象,也会自动调用Java对象的toString方法将其转换成字符串。
      • 第三个功效:将字符串输出到浏览器。
        • 和这个一样:<%=%>,将其输出到浏览器上。
    • EL表达式很好用,基本语法格式:

      • ${表达式}
    • EL表达式的使用

    • <%
          bean be = new bean();
          be.setName("张三");
          be.setAge(20);
          be.setSex("男");
          //将对象存储到某个域当中。一定要存,因为EL表达式只能从某个范围中取数据。数据必须存储到四大范围之一。
          request.setAttribute("user",be);
      %>
      <%--EL表达式取--%>
      ${user}
      <%等同于java代码:request.getAttribute(user)%>
      
      ${user}的底层是怎么做的:先从域中取数据,取出bean对象,然后调用bean对象的toString方法,然后输出到浏览器。
      

      面试题:

      a b c 和 {abc}和 abc{“abc”}的区别是什么?

      ​ ${abc}表示从某个域中取出数据,并且被取的这个数据的name是"abc",之前一定又这样的代码:域.setAttribute(“abc”,对象);

      ​ ${“abc”}表示直接将abc当作普通字符串输出到浏览器。不会从某个域中取数据。

    • EL表达式优先从小范围中读取数据

      • pageContext < request < session < application
    • EL表达式中有四个隐含的隐式的范围:

      • pageScope 对应的是pageContext范围。
      • requestScope 对应的是request范围。
      • sessionScope 对应的是session范围。
      • applicationScope 对应的是 application范围。
    • 表达式对null进行了预处理。如果是null,则向浏览器输出一个空字符串

    • EL表达式取数据的时候有两种方式

      • 第一种:. (大部分使用这个方式)

      • 第二种:[ ](如果存储到域的时候,这个name中有特殊字符,可以使用特殊符号)

        request.setAttribute("abc.abc","skdlfja00");
        ${requestScope.abc.abc}//取不出数据
        ${requestSScope["abc.abc"]}//可以取出数据
        
    • 掌握使用EL表达式,怎么从Map集合中取数据

      • ${map.key}
    • 使用EL表达式怎么从数组中取数据

      • ${数组[0]}
      • ${数组[1]}
      • ${数组[2]}
    • page指令当中,有一个属性,可以忽略EL表达式

      • <%@page contentType="text/html;charset=UTF-8" isELIgnored="true"%>
        isELIgnored="true" 表示忽略EL表达式
        isELIgnored="false" 表示不忽略EL表达式。(这是默认值)
        
        
        isELIgnored="true"这个是全局控制
        可以使用反斜杠进行局部控制:\${username}这样也可以忽略EL表达式
        
    • 通过EL表达式获取应用的根:

      • ${pageContext.request.contextPath}
    • EL表达式中其他的隐式对象:

      • param
      • paramValues
      • initParam
    • EL表达式的运算符

      • 算数运算符
        + - * / %
        关系运算符
        == != > >= < <= eq(注意:!和not都是取反)
        逻辑运算符
        && || ! and or not
        条件运算符
        ? :
        取值运算符
        [] .
        empty运算符
        

JSTL标签库

  • 什么是JSTL标签库?

    • java Standard Tag Lib(java标准的标签库)
    • JSTL婊气哭通常结合EL表达式一起使用。目的是让JSP中的java代码消失。
    • 标签是写在JSP当中的,但实际上最终还是要执行对应的java程序。(java程序在jar包当中。)
  • 使用JSTL标签库的步骤:

    • 第一步:引入JSTL标签库对应的jar包。

      • tomcat10之后引入的jar包是:
        • jakarta.servlet.jsp.jstl-2.0.0.jar
        • jakarta.servlet.jsp.jstl-api-2.0.0.jar
      • 在IDEA中怎么引入?
        • 在WEB-INF下新建lib目录,然后将jar包拷贝到lib当中。然后将其“Add Lib…"
        • 一定是要和mysql的数据库驱动一样,都是放在WEB-INF/lib目录下的。
        • 什么时候需要将jar包放到WEB-INF/lib目录下?如果这个jar是tomcat服务器没有的。
    • 第二步:在jsp中引入要使用的标签库。(使用taglib指令引入标签库)

      • JSTL提供了很多种标签,你要引入哪个标签??重点掌握核心标签库。

      • <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
        prefix="" 这里随便起名就行了,核心标签库,这里大家通常起名:c
        
    • 第三步:在需要使用标签的位置使用标签即可。(表面上是使用标签,底层实际上还是java代码)

    • JSTL标签的原理:

      • <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
        以上uri后面的路劲实际上指向了一个xxx.tld文件。
        tld文件实际上是一个xml配置文件。
        在tld文件中描述了“标签”和“java类”之间的关系。
        以上核心标签库对应的tld文件时:c.tld文件。他在哪里。
        在jakarta.servlet.jsp.jstl-2.0.0.jar里面META-INF目录下,有一个c.tld文件。
        
      • 源码解析

         <tag>
            <description>
               对标签的描述
            </description>
            <name>标签的名字</name>
            <tag-class>底层标签执行的java程序</tag-class>
            <body-content>JSP</body-content>在标签体中是否支持jsp
            <attribute>
                <description>
                对这个属性的描述
                </description>
                <name>var</name>属性的名字
                <required>false</required>false表示属性不是必须的,true表示属性是必须的
                <rtexprvalue>false</rtexprvalue>这个描述说明了这个属性是否支持EL表达式,false不支持,true支持
            </attribute>
          </tag>
        
    • jstl中的核心标签库core当中有哪些常用的标签

      • c:if

        • <c:if test=“boolean类型,支持EL表达式”></c: if>
      • c:forEach

        • <c:forEach items=“集合,支持EL表达式” var=“集合中的元素” varStatus=“var的状态对象”> ${状态对象.count}</c: forEach>
        • <c:forEach var=“i” begin=“1” emd=“10” step=“2”> ${i} </c: forEach>
      • c:choose,c:when,c:otherwise

        • <c:choose>
              <c:when test="${param.age<14}">
                  少年
              </c:when>
              <c:when test="${param.age<18}">
                  青少年
              </c:when>
              <c:when test="${param.age<30}">
                  青年
              </c:when>
              <c:when test="${param.age<50}">
                  中年
              </c:when>
              <c:otherwise>老年</c:otherwise>
          </c:choose>
          
举报

相关推荐

Javaweb

javaweb

JavaWeb(四)

Javaweb (AJAX)

javaWeb(ajax)

javaWeb(分页)

Javaweb,session

0 条评论