1. 什么是 EL 表达式?
EL 表达式是两个单词的缩写:Expression Language 表达式语言。
2. EL表达式有什么作用呢?
为了使JSP写起来更加简单
3. EL表达式的基础格式?
${表达式}
位置 web/expression/el01_door.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
EL表达式的快速入门
<%
//这里写的是 Java代码,可以在这里存放域对象数据。
request.setAttribute("name","zhangsan");
%>
<%-- 在页面当中快速展示效果 --%>
<%-- 写法格式一 --%>
<%
out.print(request.getAttribute("name"));
%>
<%-- 写法格式二 --%>
<%= request.getAttribute("name") %>
<%-- 写法格式三:EL表达式 --%>
${name}
发现问题: 采用 el表达式,可以大大的简化了 JSP 的书写
情况一:禁用所有的EL表达式
位置 web/expression/el02_banall.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--
可以增加一个 page 指令isELIgnored=true 表示禁用EL表达式, 默认是 false
--%>
<%@ page isELIgnored="true" %>
禁用所有的EL表达式
<%-- 存放数据 --%>
<%
request.setAttribute("name","zhangsan");
request.setAttribute("age",23);
%>
<%-- 采用EL表达式,展示数据 --%>
${name}
${age}
情况二:禁用单个的EL表达式
位置 web/expression/el02_banonly.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
禁用单个的EL表达式
<%-- 存放数据 --%>
<%
request.setAttribute("name","zhangsan");
request.setAttribute("age",23);
%>
<%-- 采用EL表达式,展示数据 --%>
<%-- 如果想要不展示其中一个EL表达式,只需要添加\ 表示转义字符 --%>
${name}
\${age}
情况一:基本数据的获取
位置 web/expression/el04_data.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
获取基本类型数据
<%-- 往域对象当中存放数据 --%>
<%
pageContext.setAttribute("name","zhangsan");
pageContext.setAttribute("age",23);
pageContext.setAttribute("gender",'男');
pageContext.setAttribute("score",99.9);
pageContext.setAttribute("isStudent",true);
%>
<%-- 采用EL表达式获取数据 --%>
${name}
${age}
${gender}
${score}
${isStudent}
情况二:自定义对象类型的获取
位置 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" %>
获取自定义对象类型数据
<%-- 定义域对象,存放数据 --%>
<%
//准备对象
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}
${student.name}
${student.age}
${student.gender}
${student.birthday}
${student.birthdayMessage}
情况三:数组类型的获取
位置 web/expression/el06_data.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
数组类型数据的获取
<%-- 准备数据,存放到域对象当中 --%>
<%
String[] array = {
"hello",
"world",
"java",
"迪丽热巴",
"古力娜扎"
};
//将数据,存放到域对象当中
pageContext.setAttribute("nameArray",array);
%>
<%-- 采用EL表达式获取到数据 --%>
${nameArray}
${nameArray[0]}
${nameArray[1]}
${nameArray[2]}
${nameArray[3]}
${nameArray[4]}
${nameArray[10]}
情况四:单列集合类型的获取
位置 web/expression/el07_data.jsp
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
单列集合类型的数据获取
<%-- 准备数据,存放到域对象当中 --%>
<%
//准备单列集合数据
ArrayList mList = new ArrayList<>();
mList.add("hello");
mList.add("world");
//将集合存放到域对象当中
pageContext.setAttribute("mlist",mList);
%>
<%--
采用EL表达式去获取到数据
如果采用的是 get(索引) 超过范围的情况下,会出现索引越界异常
如果采用的是 [索引] 超过范围的情况下, 不会出现索引越界异常
--%>
${mlist}
${mlist.get(0)}
${mlist.get(1)}
<%--${mlist.get(5)}
--%>
${mlist[0]}
${mlist[1]}
${mlist[5]}
情况五:双列集合类型的获取
位置 web/expression/el08_data.jsp
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
双列集合的数据获取
<%-- 准备数据,存放到域对象当中 --%>
<%
HashMap map = new HashMap<>();
map.put("name","zhangsan");
map.put("age","23");
map.put("gender","男");
//存放到域对象当中
pageContext.setAttribute("hashmap",map);
%>
<%--
获取到数据
注意事项:在map集合当中,如果不存在的键,获取值也不会报错,不展示而已
--%>
${hashmap}
${hashmap.name}
${hashmap.age}
${hashmap.gender}
${hashmap.xxx}
情况一:算数运算符
位置 web/expression/el09_calc.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
算数运算符
<%-- 直接写算数运算符,+ - * / % --%>
加法操作:
${3+5}
减法操作:
${3-5}
乘法操作:
${3*5}
除法操作
${7/3}
${Math.ceil(7/3)}
${7 div 3}
取余数的操作
${7%3}
${7 mod 3}
情况二:比较运算符
位置 web/expression/el10_calc.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
比较运算符
<%-- 直接写代码 --%>
大于:
${5>3}
${5 gt 3}
小于:
${5<3}
${5 lt 3}
等于:
${5 == 3}
${5 eq 3}
大于等于:
${5 >= 3}
${5 ge 3}
小于等于:
${3 <= 5}
${3 le 5}
不等于:
${ 5 != 5}
${ 5 ne 5}
情况三:逻辑运算符
位置 web/expression/el11_calc.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
逻辑运算符的使用
<%-- 直接使用逻辑运算符 与或非 --%>
逻辑与运算:
${ 5>3 && 9>4 }
${ 5>3 and 9>4 }
逻辑或运算:
${ 5>3 || 4>9 }
${ 5>3 or 4>9 }
逻辑非运算:
${ !true }
${ not true }
${ not not true }
情况四:其他运算符
位置 web/expression/el12_calc.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
其他运算符
<%-- 其他运算符包含两部分: 三元和empty --%>
三元运算符:
${ 5<3?"hello":"world" }
<%--
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}
2、字符串类型的判断empty的语法:
${ empty str1 }
${ empty str2 }
${ empty str3 }
3、容器类型的判断 empty的语法:
${ empty array1 }
${ empty array2 }
${ empty array3 }
说明
在 EL 表达式当中, 没有字符串的+ 操作(拼接操作)
如果想要实现字符串的拼接操作,应该使用 concat() 方法实现
代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
EL表达式的注意事项字符串拼接
<%-- 原始的字符串拼接方式,加法拼接 --%>
<%-- 原始的+ 拼接字符串的操作,会报错的 --%>
${ "hello" }
<%--${ "hello" + "world" }
--%>
<%--
如果我们现在就想要实现字符串的拼接,应该怎么办呢?
很简单,直接采用 concat 进行字符串的拼接
--%>
${ "hello".concat("world") }
${ "川哥".concat("你是").concat("真的").concat("帅") }
内置对的名称 | 内置对象的类型 | 内置对象的说明 |
---|---|---|
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") 方法 |
说明
在这里,我们的 四个域对象:
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" %>
四种域对象的获取值
<%-- 存值的操作 --%>
<%
pageContext.setAttribute("namePage", "页面域");
request.setAttribute("nameRequest", "请求域");
session.setAttribute("nameSession", "会话域");
application.setAttribute("nameApplication", "应用域");
%>
<%-- 采用EL表达式获取数据值--%>
页面域的获取值方式
${ pageScope.namePage }
${ namePage }
请求域的获取值方式
${ requestScope.nameRequest }
${ nameRequest }
会话域获取值的方式
${ sessionScope.nameSession }
${ nameSession }
应用域获取值的方式
${ applicationScope.nameApplication }
${ nameApplication }
情况二:获取值方式,键同名情况
位置 web/expression/el14_scope.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
四种域对象的获取值
<%-- 存值的操作 --%>
<%
pageContext.setAttribute("name", "页面域");
request.setAttribute("name", "请求域");
session.setAttribute("name", "会话域");
application.setAttribute("name", "应用域");
%>
<%-- 采用EL 表达式简化的方式获取值,省略键 --%>
当键的名称相同的情况下,省略键的方式获取值: 依次从页面域开始到应用为止
${ name }
<%-- 采用EL表达式获取数据值--%>
页面域的获取值方式
${ pageScope.name }
请求域的获取值方式
${ requestScope.name }
会话域获取值的方式
${ sessionScope.name }
应用域获取值的方式
${ applicationScope.name }
说明
在我们 表单提交的过程当中,form 的属性 action 需要写虚拟路径 和 servlet 路径,才能完成提交。
一般情况下,我们的虚拟路径在各个设备上面,可能设置方式不统一。
为了统一表单提交当中 action 当中的虚拟路径的写法,就需要采用 el 表达式里面的 PageContext 获取虚拟路径
语法格式:
${pageContext.request.contextPath}
代码
位置 web/expression/el15_form.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
登录页面
超神登录界面
位置 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);
}
}
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页面当中标签的使用
位置: 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" %>
JSTL的快速入门
<%--
准备数据,ArrayList集合,去遍历集合
--%>
<%
ArrayList mList = new ArrayList<>();
mList.add("hello");
mList.add("world");
mList.add("java");
//将数据存放到域对象当中
pageContext.setAttribute("mlist", mList);
%>
<%--
获取到数据
--%>
${str}
位置: 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" %>
if语句的基础用法
<%-- 定义数据,放在域对象 --%>
<%
pageContext.setAttribute("num",5);
%>
<%-- 关于if语句的使用方式 --%>
这个数据是 奇数
<%-- 在if语句当中,没有else,需要在写一次 --%>
这个数据是 偶数
位置: 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" %>
switch语句的使用
<%-- 存放数据到域对象当中 --%>
<%
pageContext.setAttribute("num",8);
%>
<%--
采用switch语句进行分支选择
--%>
星期一 Monday
星期二 Tuesday
星期三 Wednesday
星期四 Thursday
输入的信息有误,嘻嘻
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
for循环的使用
<%
String[] array = {
"hello","world","java"
};
pageContext.setAttribute("array",array);
%>
<%--
需要采用for循环进行操作
begin: 表示从哪里开始
end: 表示到哪里结束
step: 每次递增多少
var: 每个元素的变量名称是什么
items: 表示需要遍历的对象是谁
varStatus: 可以用于表示 循环的对象(获取到个数 count 和下标 index)
--%>
${v} , ${vs.count} , ${vs.index}