JSP
少年没有乌托邦,
心想远方自明郎
少年心怀乌托邦,
心向朝阳肆生长
JSP
我们这里只介绍JSP的基本使用,不会深入
使用JSP需要导入jsp.jar
和servlet-api.jar
包,它们都在Tomcat安装目录/lib
下
基本介绍
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文件地址
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常用的三种脚本
声明脚本
<%! 声明java代码 %>
定义 jsp 的需要属性、方法、静态代码块和内部类等
<%@ 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>
<%!
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>
表达式脚本
<%=表达式%>
在JSP页面上输出数据
注意:表达式脚本中的表达式不能以分号结束
<%@ 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>
<%!
String name = "张三";
%>
用户名= <%=name%><br/>
工作是: <%="java 工程师"%><br/>
</body>
</html>
代码脚本
<% java 代码%>
可以在 jsp 页面中,使用Java语言编写我们需要的功能 代码脚本还可以和表达式脚本一起组合使用,在 jsp 页面上输出数据
<%@ page import="java.util.ArrayList" %>
<%@ 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>
<%!
ArrayList<String> arrayList = new ArrayList();
%>
<%
arrayList.add("123");
%>
</body>
</html>
JSP注释
第一种:
<%--注释内容--%>
第二种:因为JSP可以使用java,所以java的注释也适用(针对java代码)
JSP内置对象
jsp
内置了九大对象
对象 | 描述 |
---|---|
request | HttpServletRequest 接口的实例,请求实例 |
response | HttpServletResponse 接口的实例,响应实例 |
out | JspWriter类的实例,用于把结果输出至网页上 |
session | HttpSession类的实例,会话对象 |
application | ServletContext类的实例,与应用上下文有关 |
config | ServletConfig类的实例, |
pageContext | PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问。是一个域对象,可以使用setAttribute(),作用范围是本页面 |
page | 类似于Java类中的this关键字,就是当前JSP页面 |
Exception | Exception类的对象,代表发生错误的JSP页面中对应的异常对象 |
因为是内置对象,所以不用创建,可以直接使用
JSP四大域对象
pageContext
(域对象,存放的数据只能在当前页面使用)
- request (域对象,存放的数据在一次 request 请求有效)
- 请求转发可以。但
重定向
因为不是同一次请求,所以获取不到
- session(域对象,存放的数据在一次会话有效)
- application(域对象,存放的数据在整个 web 应用运行期间有效, 范围更大)
域对象是可以像 Map 一样存取数据的对象。四个域对象功能一样。不同的是它们对数 据的存储范围
从存储范围(作用域范围看) pageContext < request < session < application
JSP的请求转发标签
<jsp:forward page="转发路劲"></jsp:forward>
<%@ 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>
<jsp:forward page="/test02"></jsp:forward>
</body>
</html>
EL表达式
EL表达式全称:Expression Language(表达式语言)
作用
代替 jsp
页面的表达式脚本<%=java代码%>
,以获取某个web域
中的对象
基本使用
${key1}
- EL 表达式在输出 null 时,输出的是 ""
- jsp 表达式脚本输出 null 的时,输出的是 "null" 字符串
<%@ page import="com.jl.Person" %>
<%@ 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>
<%
request.setAttribute("key","123");
Person person = new Person();
person.setName("666");
request.setAttribute("person",person);
%>
${key}
${person.name}
</body>
</html>
EL的运算操作
- 关系运算符
关系运算符 | 说明 | 范 例 | 结果 |
---|---|---|---|
== 或 eq | 等于 | $ { 5= = 5 }或${ 5 eq 5 } | true |
! =或 ne | 不等于 | \({ 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 标准标签库
作用
JSTL 是为了替换代码脚本(<% java代码 %>)
。这样 jsp
页面变得更佳简洁
组成
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 |
前提准备
使用JSTL前需要导入两个包:taglibs-standard-impl-x.x.x.jar
和taglibs-standard-spec-x.x.x.jar
基本使用
这里演示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: 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"/>
<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>
- 和
switch...case...default很像
<%@ 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: 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>
<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的代码脚本