目录
一、 基本介绍
二、JSP运行原理
三、Page指令
四、JSP常用的三种脚本
1.声明脚本
2.表达式脚本
3.代码脚本
五、EL表达式
1.JSP内置九大对象
2.JSP四大域对象
3.JSP的请求转发标签
六、EL表达式
1.作用
2.基本使用
3.EL的运算操作
七、El的11个隐含对象
八、JSTL标签库
1.作用
2.组成
3.前提准备
4.基本使用
九、总结
一、 基本介绍
jsp全称
Java Server Pages(Java 的服务器页面)
,是一种动态网页开发技术。它使用JSP标签
在HTML网页中插入Java代码。JSP是一种Java servlet
,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。
- JSP 这门技术的最大的特点在于,写 JSP 就像在写 HTML
- 相比 html 而言,html 只能为用户提供静态数据,而 JSP 技术允许在页面中嵌套 java 代码,为用户提供动态数据
- 相比 Servlet 而言,Servlet 很难对数据进行排版,而 jsp 除了可以用 java 代码产 生动态数据的同时,也很容易对数据进行排版
💡 提示:
jsp 页面不能像 HTML 页面, 直接用浏览器运行。只能通过浏览器访问 Tomcat 来访问。因为JSP运行在服务端
。
二、JSP运行原理
第一次访问jsp页面的时候。Tomcat 服务器会把 jsp 页面解析成为一个 java 源文件。并 且 对 它 进 行 编 译 成 为 .class 字 节 码 程 序 。
.class文件地址
使用JSP时候我们需要导入
jsp.jar
和servlet-api.jar
包,它们都在Tomcat安装目录/lib
下。如图:
三、Page指令
<%@ page contentType="text/html;charset=UTF-8" language="java" import="com.jl.MyServlet" pageEncoding="utf-8" %>
- language 表示 jsp 翻译后是什么语言文件, 只支持 java
- contentType 表示 jsp 返回的数据类型,对应源码中 response.setContentType()参数值
- pageEncoding 属性 表示当前 jsp 页面文件本身的字符集
- import 属性 跟 java 源代码中一样。用于导包,导类
四、JSP常用的三种脚本
1.声明脚本
<%! 声明java代码 %>
声明脚本
的作用用于定义 jsp 的需要属性、方法、静态代码块和内部类等。
📝示例:
<%@ page %><%--
Created by IntelliJ IDEA.
User: long
Date: 2022/9/8
Time: 9:31
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%!
private Integer id;
private String name = "老韩同学";
private String job;
private static String company;
private Double sal;
//静态代码块
static{
company = "字节跳动";
}
//声明方法
public String getName() {
return name;
}
%>
</body>
</html>
2.表达式脚本
<%=表达式%>
表达式脚本
的作用是在JSP页面上输出数据。但要注意❗的是表达式脚本中的表达式不能以分号结束
📝示例:·
<%@ page %><%--
Created by IntelliJ IDEA.
User: long
Date: 2022/9/8
Time: 9:31
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%!
String name = "张三";
%>
用户名= <%=name%><br/>
工作是: <%="java 工程师"%><br/>
</body>
</html>
3.代码脚本
<% java 代码%>
.代码脚本
的作用是可以在 jsp 页面中,使用Java语言编写我们需要的功能。而且代码脚本
还可以和表达式脚本
一起组合使用,在 jsp 页面上输出数据
📝示例:
<%@ page import="java.util.ArrayList" %>
<%@ page %><%--
Created by IntelliJ IDEA.
User: long
Date: 2022/9/8
Time: 9:31
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%!
ArrayList<String> arrayList = new ArrayList();
%>
<%
arrayList.add("123");
%>
</body>
</html>
4.JSP其他内容
📝JSP注释
-
第一种:
<%--注释内容--%>
-
第二种:因为JSP可以使用java,所以java的注释也适用(针对java代码)
五、JSP内置对象
1. JSP内置九大对象
对象 | 描述 |
---|---|
request | HttpServletRequest 接口的实例,请求实例 |
response | HttpServletResponse 接口的实例,响应实例 |
out | JspWriter类的实例,用于把结果输出至网页上 |
session | HttpSession类的实例,会话对象 |
application | ServletContext类的实例,与应用上下文有关 |
config | ServletConfig类的实例, |
pageContext | PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问。是一个域对象,可以使用setAttribute(),作用范围是本页面 |
page | 类似于Java类中的this关键字,就是当前JSP页面 |
Exception | Exception类的对象,代表发生错误的JSP页面中对应的异常对象 |
因为是内置对象,所以不用创建,可以直接使用
2. JSP四大域对象
-
pageContext
(域对象,存放的数据只能在当前页面使用)
-
request (域对象,存放的数据在一次 request 请求有效)
- 请求转发可以。但
重定向
因为不是同一次请求,所以获取不到
- session(域对象,存放的数据在一次会话有效)
-
application(域对象,存放的数据在整个 web 应用运行期间有效, 范围更大)
-
域对象是可以像 Map 一样存取数据的对象。四个域对象功能一样。不同的是它们对数
据的存储范围 -
从存储范围(作用域范围看) pageContext < request < session < application
3. JSP的请求转发标签
<jsp:forward page="转发路劲"></jsp:forward>
📝示例:
<%@ page %><%--
Created by IntelliJ IDEA.
User: long
Date: 2022/9/8
Time: 9:31
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<jsp:forward page="/test02"></jsp:forward>
</body>
</html>
六、EL表达式
EL表达式全称:Expression Language(表达式语言)
1.作用
代替 jsp 页面的表达式脚本<%=java代码%>
,以获取某个web域
中的对象
2.基本使用
${key1}
- EL 表达式在输出 null 时,输出的是 “”
- jsp 表达式脚本输出 null 的时,输出的是 “null” 字符串
<%@ page import="com.jl.Person" %>
<%@ page %><%--
Created by IntelliJ IDEA.
User: long
Date: 2022/9/8
Time: 9:31
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%
request.setAttribute("key","123");
Person person = new Person();
person.setName("666");
request.setAttribute("person",person);
%>
${key}
${person.name}
</body>
</html>
3.EL的运算操作
- 关系运算符
关系运算符 | 说明 | 范 例 | 结果 |
---|---|---|---|
== 或 eq | 等于 | $ { 5= = 5 }或${ 5 eq 5 } | true |
! =或 ne | 不等于 | 5 ! = 5 或 { 5 != 5}或 5!=5或{ 5 ne 5 } | false |
< 或 lt | 小于 | $ { 3 <5 }或${ 3 lt 5 } | true |
> 或 gt | 大于 | $ { 3 > 5}或${ 3 gt 5 } | false |
<= 或 le | 小于等于 | $ { 3 <=5}或${ 3 le 5 } | true |
>= 或 ge | 大于等于 | $ { 3 >= 5 }或${ 3 ge 5 } | false |
- 逻辑运算
逻辑运算符 | 说明 | 范例 | 结果 |
---|---|---|---|
&& 或 and | 与运算 | $[12 == 12 &&12<11} 或 ${ 12 == 12 and 12<11} | false |
|| 或 or | 或运算 | ${ 12 == 12ll12<11} 或 ${12 == 12 or 12<11} | true |
! 或 not | 取反运算 | {!true} 或 ${not true } | false |
- 算数运算
算数运算符 | 说明 | 范例 心 | 结果 |
---|---|---|---|
+ | 加法 | ${ 12 +18 } | 30 |
- | 减法 | ${18 - 8 } | 10 |
* | 乘法 | $12 * 12 } | 144 |
/ 或 div | 除法 | ${144/ 12} 或 ${ 144 div 12 } | 12 |
% 或 mod | 取模 | ${ 144 % 10 } 或 ${144 mod 10} | 4 |
- EL的empty运算
// 语法
${empty 值}
// 为空返回true,反之则为false
以下情况,结果为空:
- 值为空串的时
- 值是 Object 类型数组,长度为零
- list 集合,元素个数为零
- map 集合,元素个数为零
七、El的11个隐含对象
变量 | 类型 | 说明 |
---|---|---|
pageContext | PageContextlmpl | 获取jsp中的九大内置对象 |
pageScope | Map<String,Object> | 获取 pageContext域中的数据 |
requestScope | Map<String,Object> | 获取 Request域中的数据 |
sessionScope | Map<String,Object> | 获取Session域中的数据 |
applicationScope | Map<String,Object> | 获取ServletContext域中的数据 |
param | Map<String,String> | 获取请求参数的值 |
paramValues | Map<String,String> | 获取多个值 |
header | Map<String,String> | 获取请求头的信息 |
headerValues | Map<String,String> | 获取请求头的多个信息 |
cookie | Map<String,Cookie> | 获取当前请求的 Cookie信息 |
initParam | Map<String,String> | 获取在web.xml中配置的上下文参数 |
这里要区分EL表达式中的pageContext
和JSP内置的pageContext
EL表达式中的pageContext
可以获取JSP内置的九大对象
JSP内置的pageContext
就是一个域对象
💡EL获取四个特定域中的属性
变量 | 类型 | 说明 |
---|---|---|
pageScope | Map<String,Object> | 获取pageContext域中的数据 |
requestScope | Map<String,Object> | 获取Request域中的数据 |
sessionScope | Map<String,Object> | 获取Session 域中的数据 |
applicationScope | Map<String,Object> | 获取 ServletContext域中的数据 |
八、JSTL标签库
JSTL标签库:JSP Standard Tag Library JSP 标准标签库
1.作用
JSTL 是为了替换代码脚本(<% java代码 %>)
。这样 jsp 页面变得更佳简洁
2.组成
JSTL由五个标签库组成
功能范围 | URI | 前缀 |
---|---|---|
核心标签库(重点) | http://java.sun.com/isp/jstl/core | c |
格式化 | http://java.sun.com/jsp/jstl/fmt | fmt |
函数 | http://java.sun.com/jsp/jstl/functions | fn |
数据库(不使用) | http://java.sun.com/jsp/jstl/sql | sql |
XML(不使用) | http://java.sun.com/jsp/jstl/xml | x |
3.前提准备
使用JSTL前需要导入两个包:taglibs-standard-impl-x.x.x.jar
和taglibs-standard-spec-x.x.x.jar
📥taglibs-standard-spec-1.2.5.jar下载地址
📥taglibs-standard-impl-1.2.5.jar下载地址
4.基本使用
这里演示core核心库
的使用
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page %><%--
Created by IntelliJ IDEA.
User: jinglong
Date: 2022/9/8
Time: 9:31
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<c:set scope="request" var="User" value="666"/>
</body>
</html>
👆<c:set>可以向域中保存数据。它和
域对象.setAttribute(key,value);
等价。
- scope 属性设置保存到哪个域
- page 表示 PageContext 域(默认值)
- var 属性设置 key 的值
- value 属性设置值
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page %><%--
Created by IntelliJ IDEA.
User: long
Date: 2022/9/8
Time: 9:31
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<c:set scope="request" var="User" value="666"/>
<c:if test="${ 10 > 2 }">
<h1>10 > 2 为真</h1>
</c:if>
</body>
</html>
👆
if 标签
用来做 if 判断。 test 属性表示判断的条件(用 EL 表达式输出)
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page %><%--
Created by IntelliJ IDEA.
User: jinglong
Date: 2022/9/8
Time: 9:31
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<c:set scope="request" var="money" value="1000"/>
<c:choose>
<c:when test="${money>=888}">
余额充足
</c:when>
<c:when test="${money<888}">
余额不足
</c:when>
</c:choose>
</body>
</html>
👆
<c:choose><c:when">
标签和Java中的switch
很像
👇JSP遍历数组,集合的方式
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page %><%--
Created by IntelliJ IDEA.
User: long
Date: 2022/9/8
Time: 9:31
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<h1>第1种遍历方式:普通循环</h1>
<%--
1.遍历 1 到 5,
2. 输出 begin 属性设置开始的索引 end 属性设置结束的索引
3. var 属性表示循环的变量(也是当前正在遍历到的数据)
4. 等价 for (int i = 1; i <= 5; i++) {}
5. 在默认情况下, i 每次会递增1。但也可设置步长step
--%>
<c:forEach begin="1" end="5" var="i">
<li>排名=${i}</li>
</c:forEach>
<h1>第2种遍历方式:遍历数组</h1>
<%
request.setAttribute("sports", new String[]{"打篮球", "乒乓球"});
%>
<%--
<c:forEach items="${ requestScope.sports }" var="item"/>
1. items 遍历的集合/数组
2. var 遍历到的数据
3. 等价 for (Object item: arr) {}
--%>
<c:forEach items="${requestScope.sports}" var="sport">
运动名称= ${sport}<br/>
</c:forEach>
<h1>第3种遍历方式:遍历Map</h1>
<%
Map<String, Object> map = new HashMap<>();
map.put("key1", "北京");
map.put("key2", "上海");
map.put("key3", "天津");
request.setAttribute("cities", map);
%>
<%--
1. items 遍历的map集合
2. var 遍历到的数据
3. entry.key 取出key
4. entry.value 取出值
--%>
<c:forEach items="${requestScope.cities}" var="city">
城市信息: ${city.key}
${city.value}<br/>
</c:forEach>
<h1>第4种遍历方式:遍历List</h1>
<%
List<String> person = new ArrayList<>();
person.add("张三");
person.add("李四");
request.setAttribute("person", person);
%>
<%--
items 表示遍历的集合
var 表示遍历到的数据
begin 表示遍历的开始索引值 ,从0开始计算
end 表示结束的索引值
step 属性表示遍历的步长值
varStatus 属性表示当前遍历到的数据的状态,可以得到step,begin,end等属性值
--%>
<c:forEach items="${requestScope.person}" var="person">
${person}
</c:forEach>
</body>
</html>
九、总结
- JSP三大脚本:声明脚本、表达式脚本、代码脚本
- JSP有九大内置对象
- JSP有四大域对象
- EL表达式是为了替代JSP的表达式脚本
- EL拥有11个隐含对象
- JSTL是为了替代JSP的代码脚本
最后希望大家多多关注^_^,你们的关注是我不断前进的动力!!!
感谢感谢~~~🙏🙏🙏