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如果清除掉,购物车中的商品就消失了
- 将购物车中的商品编号放到cookie当中,cookie保存在硬盘文件当中。这样即使关闭浏览器。硬盘上的cookie还在。下一次再打开京东商城的时候,查看购物车的时候,会自动读取本地硬盘中储存的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给服务器。
- 假设现在发送的请求路劲是“http://localhost:8080/servlet08/cookie/gets”生成的cookie,如果cookie没有设置path,默认的path是什么?
-
浏览器发送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服务器没有的。
- tomcat10之后引入的jar包是:
-
第二步:在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>
-
-
-