第一章 EL表达式
第01节 基础理论
1、概念描述
1. 什么是 EL 表达式? EL 表达式是两个单词的缩写:Expression Language 表达式语言。 2. EL表达式有什么作用呢? 为了使JSP写起来更加简单 3. EL表达式的基础格式? ${表达式}
2、快速入门
位置 web/expression/el01_door.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>EL表达式的快速入门</title>
</head>
<body>
<%
//这里写的是 Java代码,可以在这里存放域对象数据。
request.setAttribute("name","zhangsan");
%>
<%-- 在页面当中快速展示效果 --%>
<%-- 写法格式一 --%>
<%
out.print(request.getAttribute("name"));
%>
<hr>
<%-- 写法格式二 --%>
<%= request.getAttribute("name") %>
<hr>
<%-- 写法格式三:EL表达式 --%>
${name}
</body>
</html>
第02节 基础用法
1、禁用EL表达式
情况一:禁用所有的EL表达式
位置 web/expression/el02_banall.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--
可以增加一个 page 指令isELIgnored=true 表示禁用EL表达式, 默认是 false
--%>
<%@ page isELIgnored="true" %>
<html>
<head>
<title>禁用所有的EL表达式</title>
</head>
<body>
<%-- 存放数据 --%>
<%
request.setAttribute("name","zhangsan");
request.setAttribute("age",23);
%>
<%-- 采用EL表达式,展示数据 --%>
${name} <br> ${age}
</body>
</html>
情况二:禁用单个的EL表达式
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>禁用单个的EL表达式</title>
</head>
<body>
<%-- 存放数据 --%>
<%
request.setAttribute("name","zhangsan");
request.setAttribute("age",23);
%>
<%-- 采用EL表达式,展示数据 --%>
<%-- 如果想要不展示其中一个EL表达式,只需要添加\ 表示转义字符 --%>
${name} <br> \${age}
</body>
</html>
2、五类数据获取
情况一:基本数据的获取
位置 web/expression/el04_data.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>获取基本类型数据</title>
</head>
<body>
<%-- 往域对象当中存放数据 --%>
<%
pageContext.setAttribute("name","zhangsan");
pageContext.setAttribute("age",23);
pageContext.setAttribute("gender",'男');
pageContext.setAttribute("score",99.9);
pageContext.setAttribute("isStudent",true);
%>
<%-- 采用EL表达式获取数据 --%>
${name}
<hr>
${age}
<hr>
${gender}
<hr>
${score}
<hr>
${isStudent}
</body>
</html>
情况二:自定义对象类型的获取
位置 src/blb.chc01.Student
//定义学生类
public class Student {
private String name;
private int age;
private boolean gender;
private Date birthday;
/***
* 定义一个方法,专门用来展示 日期格式的数据
* 将日期格式,进行日期格式化,格式化成为好看的日期格式
*
* 专业词汇: 逻辑视图
* 目的:为了给 JSP页面当中的 EL表达式快速展示
*/
public String getBirthdayMessage(){
//想办法去格式化时间
if (birthday!=null){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String text = sdf.format(birthday);
return text;
}
return null;
}
public Student() {
}
public Student(String name, int age, boolean gender, Date birthday) {
this.name = name;
this.age = age;
this.gender = gender;
this.birthday = birthday;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isGender() {
return gender;
}
public void setGender(boolean gender) {
this.gender = gender;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
位置 web/expression/el05_data.jsp
<%@ page import="blb.chc01.Student" %>
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>获取自定义对象类型数据</title>
</head>
<body>
<%-- 定义域对象,存放数据 --%>
<%
//准备对象
Student stu = new Student();
stu.setName("lisi");
stu.setAge(23);
stu.setGender(true);
stu.setBirthday(new Date());
//存放到域对象
pageContext.setAttribute("student",stu);
%>
<%--
采用EL表达式去获取到数据
注意事项:底层找到的是 getXxx() 方法
但是对于 boolean类型而言,找到是 isXxx() 方法
--%>
${student} <br>
${student.name} <br>
${student.age} <br>
${student.gender} <br>
${student.birthday} <br>
${student.birthdayMessage} <br>
</body>
</html>
情况三:数组类型的获取
位置 web/expression/el06_data.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>数组类型数据的获取</title>
</head>
<body>
<%-- 准备数据,存放到域对象当中 --%>
<%
String[] array = {
"hello",
"world",
"java",
"迪丽热巴",
"古力娜扎"
};
//将数据,存放到域对象当中
pageContext.setAttribute("nameArray",array);
%>
<%-- 采用EL表达式获取到数据 --%>
${nameArray} <br>
${nameArray[0]} <br>
${nameArray[1]} <br>
${nameArray[2]} <br>
${nameArray[3]} <br>
${nameArray[4]} <br>
${nameArray[10]} <br>
</body>
</html>
情况四:单列集合类型的获取
位置 web/expression/el07_data.jsp
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>单列集合类型的数据获取</title>
</head>
<body>
<%-- 准备数据,存放到域对象当中 --%>
<%
//准备单列集合数据
ArrayList<String> mList = new ArrayList<>();
mList.add("hello");
mList.add("world");
//将集合存放到域对象当中
pageContext.setAttribute("mlist",mList);
%>
<%--
采用EL表达式去获取到数据
如果采用的是 get(索引) 超过范围的情况下,会出现索引越界异常
如果采用的是 [索引] 超过范围的情况下, 不会出现索引越界异常
--%>
${mlist} <br>
${mlist.get(0)} <br>
${mlist.get(1)} <br>
<%--${mlist.get(5)} <br>--%>
${mlist[0]} <br>
${mlist[1]} <br>
${mlist[5]} <br>
</body>
</html>
情况五:双列集合类型的获取
位置 web/expression/el08_data.jsp
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>双列集合的数据获取</title>
</head>
<body>
<%-- 准备数据,存放到域对象当中 --%>
<%
HashMap<String,String> map = new HashMap<>();
map.put("name","zhangsan");
map.put("age","23");
map.put("gender","男");
//存放到域对象当中
pageContext.setAttribute("hashmap",map);
%>
<%--
获取到数据
注意事项:在map集合当中,如果不存在的键,获取值也不会报错,不展示而已
--%>
${hashmap} <br>
${hashmap.name} <br>
${hashmap.age} <br>
${hashmap.gender} <br>
${hashmap.xxx} <br>
</body>
</html>
3、常见运算符
情况一:算数运算符
位置 web/expression/el09_calc.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>算数运算符</title>
</head>
<body>
<%-- 直接写算数运算符,+ - * / % --%>
加法操作:
${3+5} <br>
<hr>
减法操作:
${3-5} <br>
<hr>
乘法操作:
${3*5} <br>
<hr>
除法操作
${7/3} <br>
${Math.ceil(7/3)} <br>
${7 div 3} <br>
<hr>
取余数的操作
${7%3} <br>
${7 mod 3} <br>
</body>
</html>
情况二:比较运算符
位置 web/expression/el10_calc.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>比较运算符</title>
</head>
<body>
<%-- 直接写代码 --%>
大于:
${5>3}
${5 gt 3}
<br><hr>
小于:
${5<3}
${5 lt 3}
<br><hr>
等于:
${5 == 3}
${5 eq 3}
<br><hr>
大于等于:
${5 >= 3}
${5 ge 3}
<br><hr>
小于等于:
${3 <= 5}
${3 le 5}
<br><hr>
不等于:
${ 5 != 5}
${ 5 ne 5}
</body>
</html>
情况三:逻辑运算符
位置 web/expression/el11_calc.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>逻辑运算符的使用</title>
</head>
<body>
<%-- 直接使用逻辑运算符 与或非 --%>
逻辑与运算:
${ 5>3 && 9>4 }
${ 5>3 and 9>4 }
<br><hr>
逻辑或运算:
${ 5>3 || 4>9 }
${ 5>3 or 4>9 }
<br><hr>
逻辑非运算:
${ !true }
${ not true }
${ not not true }
</body>
</html>
情况四:其他运算符
位置 web/expression/el12_calc.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>其他运算符</title>
</head>
<body>
<%-- 其他运算符包含两部分: 三元和empty --%>
三元运算符:
${ 5<3?"hello":"world" }
<br>
<hr>
<%--
empty 运算符,用于判断对象是否为空
作用1: 判断对象是否为null
作用2: 判断字符串是否为空字符串
作用3: 判断容器对象是否为null
--%>
<%
Object obj1 = null;
Object obj2 = new Object();
String str1 = null;
String str2 = "";
String str3 = "xixi";
int[] array1 = null;
int[] array2 = new int[0];
int[] array3 = new int[2];
//将数据全部添加到页面域当中
pageContext.setAttribute("obj1",obj1);
pageContext.setAttribute("obj2",obj2);
pageContext.setAttribute("str1",str1);
pageContext.setAttribute("str2",str2);
pageContext.setAttribute("str3",str3);
pageContext.setAttribute("array1",array1);
pageContext.setAttribute("array2",array2);
pageContext.setAttribute("array3",array3);
%>
1、对象类型的判断empty的语法:
${ empty obj1}
${ empty obj2}
<br><hr>
2、字符串类型的判断empty的语法:
${ empty str1 }
${ empty str2 }
${ empty str3 }
<br><hr>
3、容器类型的判断 empty的语法:
${ empty array1 }
${ empty array2 }
${ empty array3 }
</body>
</html>
4、注意事项
说明
在 EL 表达式当中, 没有字符串的+ 操作(拼接操作) 如果想要实现字符串的拼接操作,应该使用 concat() 方法实现
代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>EL表达式的注意事项字符串拼接</title>
</head>
<body>
<%-- 原始的字符串拼接方式,加法拼接 --%>
<%-- 原始的+ 拼接字符串的操作,会报错的 --%>
${ "hello" } <br>
<%--${ "hello" + "world" } <br>--%>
<%--
如果我们现在就想要实现字符串的拼接,应该怎么办呢?
很简单,直接采用 concat 进行字符串的拼接
--%>
${ "hello".concat("world") } <br>
${ "川哥".concat("你是").concat("真的").concat("帅") }
</body>
</html>
第03节 内置对象
1、表格说明
内置对的名称 | 内置对象的类型 | 内置对象的说明 |
---|---|---|
PageContext | javax.servlet.PageContext | 表示的是 JSP 当中的 PageContext 可以获取 JSP的其他八个内置对象 |
pageScope | java.util.Map | 可以获取页面域 PageContext 的数据值 |
requestScope | java.util.Map | 可以获取请求域 Request 的数据值 |
sessionScope | java.util.Map | 可以获取会话域 Session 的数据值 |
applicationScope | java.util.Map | 可以获取应用域 ServletContext 的数据值 |
param | java.util.Map | 相当于是 request.getParameter("xx") 方法 |
paramValues | java.util.Map | 相当于是 request.getParameterValues("xx") 方法 |
header | java.util.Map | 相当于是 request.getHeader("xx") 方法 |
headervalues | java.util.Map | 相当于是 request.getHeaders("xx") 方法,返回的是数组 |
cookie | java.util.Map | 相当于是 request.getCookies() 方法, 返回的是数组 |
initParam | java.util.Map | 相当于是 servletConfig.getInitParameter("xx") 方法 |
2、四个域对象
说明
在这里,我们的 四个域对象: pageScope requestScope sessionScope applicationScope 他们都可以去调用 setAttribute(键,值) 去存放数据,也可以调用 getAttribute(键) 获取数据 当然在我们的 EL 表达式当中, 对于他们来说,写法如下: ${pageScope.键} ${requestScope.键} ${sessionScope.键} ${applicationScope.键} 其中域对象,可以省略不写,获取的范围会依次从 pageScope>requestScope>sessionScope>applicationScope
情况一:获取值方式,键非同名情况
位置:web/expression/el13_scope.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>四种域对象的获取值</title>
</head>
<body>
<%-- 存值的操作 --%>
<%
pageContext.setAttribute("namePage", "页面域");
request.setAttribute("nameRequest", "请求域");
session.setAttribute("nameSession", "会话域");
application.setAttribute("nameApplication", "应用域");
%>
<%-- 采用EL表达式获取数据值--%>
页面域的获取值方式
${ pageScope.namePage }
${ namePage }
<br>
<hr>
请求域的获取值方式
${ requestScope.nameRequest }
${ nameRequest }
<br>
<hr>
会话域获取值的方式
${ sessionScope.nameSession }
${ nameSession }
<br>
<hr>
应用域获取值的方式
${ applicationScope.nameApplication }
${ nameApplication }
</body>
</html>
情况二:获取值方式,键同名情况
位置 web/expression/el14_scope.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>四种域对象的获取值</title>
</head>
<body>
<%-- 存值的操作 --%>
<%
pageContext.setAttribute("namePage", "页面域");
request.setAttribute("nameRequest", "请求域");
session.setAttribute("nameSession", "会话域");
application.setAttribute("nameApplication", "应用域");
%>
<%-- 采用EL表达式获取数据值--%>
页面域的获取值方式
${ pageScope.namePage }
${ namePage }
<br>
<hr>
请求域的获取值方式
${ requestScope.nameRequest }
${ nameRequest }
<br>
<hr>
会话域获取值的方式
${ sessionScope.nameSession }
${ nameSession }
<br>
<hr>
应用域获取值的方式
${ applicationScope.nameApplication }
${ nameApplication }
</body>
</html>
情况二:获取值方式,键同名情况
位置 web/expression/el14_scope.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>四种域对象的获取值</title>
</head>
<body>
<%-- 存值的操作 --%>
<%
pageContext.setAttribute("name", "页面域");
request.setAttribute("name", "请求域");
session.setAttribute("name", "会话域");
application.setAttribute("name", "应用域");
%>
<%-- 采用EL 表达式简化的方式获取值,省略键 --%>
当键的名称相同的情况下,省略键的方式获取值: 依次从页面域开始到应用为止
${ name }
<br>
<hr>
<%-- 采用EL表达式获取数据值--%>
页面域的获取值方式
${ pageScope.name }
<br>
<hr>
请求域的获取值方式
${ requestScope.name }
<br>
<hr>
会话域获取值的方式
${ sessionScope.name }
<br>
<hr>
应用域获取值的方式
${ applicationScope.name }
</body>
</html>
3、虚拟路径获取
说明
在我们 表单提交的过程当中,form 的属性 action 需要写虚拟路径 和 servlet 路径,才能完成提交。 一般情况下,我们的虚拟路径在各个设备上面,可能设置方式不统一。 为了统一表单提交当中 action 当中的虚拟路径的写法,就需要采用 el 表达式里面的 PageContext 获取虚拟路径 语法格式: ${pageContext.request.contextPath}
代码
位置 web/expression/el15_form.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录页面</title>
</head>
<body>
<h1> 超神登录界面 </h1>
<form method="get" action="${pageContext.request.contextPath}/ChaoShenServlet">
<input type="text" name="username" placeholder="请输入账号">
<input type="text" name="password" placeholder="请输入密码">
<input type="submit" value="登录按钮">
</form>
</body>
</html>
位置 src/blb.chc02.ChaoShenServlet
/***
* 超神的Servlet
*/
@WebServlet("/ChaoShenServlet")
public class ChaoShenServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("ChaoShenServlet.doGet");
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("ChaoShenServlet.doPost");
//直接获取到数据
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println("username = " + username);
System.out.println("password = " + password);
}
}
第二章 JSTL标签库
第01节 基础理论
1、概念描述
1. 什么是 JSTL 标签库? 有啥作用呢? 概念: JSTL 是 Java server pages standarded tag library 即JSP标准标签库, 由 Apache 提供的 作用: 利用这些标签取代JSP页面上的Java代码。 例如: if语句、switch语句、for循环遍历 2. 如何使用呢? 操作步骤? 第一步: 导入jar包 javax.servlet.jsp.jstl.jar jstl-impl.jar 第二步: 采用 taglib 引入标签库 第三步: 完成JSP页面当中标签的使用
2、快速入门
位置: web/taglibrary/jstl_01door.jsp
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--
需要使用 taglib 指令,去引入标签库
prefix="c" 表示的是前缀的写法,c是程序员约定的,这里可以随便写,建议写c
uri="http://java.sun.com/jsp/jstl/core" 引入核心库 core 核心
--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>JSTL的快速入门</title>
</head>
<body>
<%--
准备数据,ArrayList集合,去遍历集合
--%>
<%
ArrayList<String> mList = new ArrayList<>();
mList.add("hello");
mList.add("world");
mList.add("java");
//将数据存放到域对象当中
pageContext.setAttribute("mlist", mList);
%>
<%--
获取到数据
--%>
<c:forEach items="${mlist}" var="str">
${str}
</c:forEach>
</body>
</html>
第02节 常用操作
1、if 语句的使用
位置: web/taglibrary/jstl_02if.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>if语句的基础用法</title>
</head>
<body>
<%-- 定义数据,放在域对象 --%>
<%
pageContext.setAttribute("num",5);
%>
<%-- 关于if语句的使用方式 --%>
<c:if test="${ num%2 ne 0 }">
这个数据是 奇数
</c:if>
<%-- 在if语句当中,没有else,需要在写一次 --%>
<c:if test="${ num%2 eq 0 }">
这个数据是 偶数
</c:if>
</body>
</html>
2、switch语句的使用
位置: web/taglibrary/jstl_03switch.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>switch语句的使用</title>
</head>
<body>
<%-- 存放数据到域对象当中 --%>
<%
pageContext.setAttribute("num",8);
%>
<%--
采用switch语句进行分支选择
--%>
<c:choose>
<c:when test="${num eq 1}">
星期一 Monday
</c:when>
<c:when test="${num eq 2}">
星期二 Tuesday
</c:when>
<c:when test="${num eq 3}">
星期三 Wednesday
</c:when>
<c:when test="${num eq 4}">
星期四 Thursday
</c:when>
<c:otherwise>
输入的信息有误,嘻嘻
</c:otherwise>
</c:choose>
</body>
</html>
3、for语句的使用
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>for循环的使用</title>
</head>
<body>
<%
String[] array = {
"hello","world","java"
};
pageContext.setAttribute("array",array);
%>
<%--
需要采用for循环进行操作
begin: 表示从哪里开始
end: 表示到哪里结束
step: 每次递增多少
var: 每个元素的变量名称是什么
items: 表示需要遍历的对象是谁
varStatus: 可以用于表示 循环的对象(获取到个数 count 和下标 index)
--%>
<c:forEach begin="0" end="10" step="1" var="v" items="${array}" varStatus="vs">
${v} , ${vs.count} , ${vs.index}<br>
</c:forEach>
</body>
</html>