- 无脚本的 JSP 页面
- EL 表达式
- 认识 EL 表达式
- 使用EL表达式和EL中的运算符
- 使用EL表达式-获取请求参数的值
- 使用EL表达式-获取Cookie的值
- 使用EL表达式-获取四个域对象中的属性值
- 使用EL调用类中静态方法
- 使用 EL 表达式
- EL表达式如何处理Null值和获取上下文参数
- EL表达式练习
无脚本的JSP页面是没有Java脚本元素(代码段、表达式和声明)的页面
无脚本(Scriptless)的代码使JSP页面易于阅读、维护和调试
EL 和 JSTL 可以用来编写无 Java 脚本元素的页面
Expression Language - 表达式语言
提供了一种在JSP页面上编写的语言,以减少代码
Java表达式和EL表达式
Java表达式:<%= 15 * 15%>
EL表达式:${16 * 16}
算数运算符
算术运算符取余:${13 % 3}
算术运算符取余:${13 mod 3}
算术运算符除:${17 / 5}
算术运算符除:${17 div 5}
比较运算符
比较运算符:${1 > 2}
比较运算符:${1 gt 2}
eq: == ne: != gt: > lt: < ge: >= le: <=
逻辑元素符
逻辑运算符-逻辑与:${1 > 2 && 10 > 2 && 3 > 2}
逻辑运算符-逻辑与:${1 > 2 and 10 > 2 and 3 > 2}
逻辑运算符-逻辑或:${1 > 2 || 10 > 2 || 3 > 2}
逻辑运算符-逻辑或:${1 > 2 or 10 > 2 or 3 > 2}
逻辑运算符-逻辑非:${!(2 > 1)}
逻辑运算符-逻辑非:${not(2 > 1)}
三元运算符
三元运算符:${2 > 1 ? 1 : 0}
三元运算符:${2 > 1 ? "Y" : "N"}
Java 表达式
<%@page contentType="text/html" pageEncoding="UTF-8"%>
使用Java表达式获取请求参数的值
使用Java表达式获取请求参数的值
* 本页面中使用java表达式获取请求参数的值,用于和second.jsp对比两种获取请求参数值的方式
<%
String[] hobbies = request.getParameterValues("hobbies");
%>
账户: <%=request.getParameter("username")%>
密码: <%=request.getParameter("password")%>
性别: <%=request.getParameter("gender")%>
国籍: <%=request.getParameter("nationality")%>
爱好: <%=hobbies[0]%>
<%=hobbies[1]%>
<%=hobbies[2]%>
<%=hobbies[3]%>
<%=hobbies[4]%>
EL 表达式
<%@page contentType="text/html" pageEncoding="UTF-8"%>
使用EL表达式获取请求参数的值
使用EL表达式获取请求参数的值
* 本页面中使用EL表达式获取请求参数的值,用于和first.jsp对比两种获取请求参数值的方式
<%--在EL表达式中,可以使用param这个隐式对象获取请求参数的值,语法:${param.请求参数名}--%>
账户: ${param.username}
密码: ${param.password}
性别: ${param.gender}
国籍: ${param.nationality}
<%--如果一个请求参数有多个值,可以使用paramValues隐式对象获取请求参数的值,语法:${paramValues.请求参数名[数组元素索引]},索引从0开始--%>
爱好: ${paramValues.hobbies[0]}
${paramValues.hobbies[1]}
${paramValues.hobbies[2]}
${paramValues.hobbies[3]}
${paramValues.hobbies[4]}
EL表达式提供诸多隐式对象用于获取不同的信息
param:获取请求参数的单个值
paramValues:获取一个请求参数的多个值,如多个checkbox提交的同一个请求参数的值
header:获取请求的标头信息
headerValues:获取一个请求标头的多个值
cookie:获取Cookie值
pageScope:获取页面范围的属性值
requestScope:获取请求范围的属性值
sessionScope:获取会话范围的属性值
applicationScope:获取应用程序范围(上下文范围)的属性值
initParam:获取上下文初始化参数
使用EL表达式-获取Cookie的值
Java 代码段获取 Cookie 值
<%@page contentType="text/html" pageEncoding="UTF-8"%>
在jsp页面中用java表达式获取cookie的值
get_cookie1.jsp页面-在jsp页面中用java表达式获取cookie的值
<%
//获取Cookie
Cookie[] cookies = request.getCookies();
//定义两个变量用于存储读取的两个Cookie的值
String accessTime = "";
String randNum = "";
for (Cookie ck : cookies) {
if ("lastAccessTime".equals(ck.getName())) { //如果cookie名称为lastAccessTime
accessTime = ck.getValue(); //获取其值
} else if ("randomNumber".equals(ck.getName())) { //如果cookie名称为randomNumber
randNum = ck.getValue(); //获取其值
}
}
%>
* 最后一次请求PutCookieServlet的时间:<%=accessTime%>
* PutCookieServlet产生的随机数字:<%=randNum%>
EL 表达式获取 Cookie 的值
<%@page contentType="text/html" pageEncoding="UTF-8"%>
在jsp页面中用EL表达式获取cookie的值
使用EL表达式-获取四个域对象中的属性值
java 表达式获取域对象中的属性值
<%@page contentType="text/html" pageEncoding="UTF-8"%>
在jsp页面中使用java表达式获取域对象中的属性值
get_domain_attribute1.jsp页面
在jsp页面中使用java表达式获取域对象中的属性值
<%
//在JSP页面上可以使用四个域对象在不同范围共享数据
pageContext.setAttribute("number1", 100); //PageContext
request.setAttribute("number2", 200); //HttpServletRequest
session.setAttribute("number3", 300); //HttpSession
application.setAttribute("number4", 400); //ServletContext
int number5=500;
%>
* 页面范围属性值:<%=pageContext.getAttribute("number1")%>
* 请求范围属性值:<%=request.getAttribute("number2")%>
* 会话范围属性值:<%=session.getAttribute("number3")%>
* 应用程序范围属性值:<%=application.getAttribute("number4")%>
* java表达式访问java代码段中的变量number5:<%=number5%>
EL表达式获取域对象中的属性值
<%@page contentType="text/html" pageEncoding="UTF-8"%>
在jsp页面中使用EL表达式获取域对象中的属性值
get_domain_attribute2.jsp页面
在jsp页面中使用EL表达式获取域对象中的属性值
<%
pageContext.setAttribute("number1", 100);
request.setAttribute("number2", 200);
session.setAttribute("number3", 300);
application.setAttribute("number4", 400);
int number5 = 500;
int number6 = 600;
//java代码定义的变量只有作为属性加入域对象才可被EL表达式访问
pageContext.setAttribute("number6", number6);
%>
<%--EL表达式提供四个xxxScope隐式对象,用于获取不同域对象中的属性值,语法:${xxxScope.属性名}或${属性名}--%>
* 页面范围属性值:${pageScope.number1} | ${number1}
* 请求范围属性值:${requestScope.number2} | ${number2}
* 会话范围属性值:${sessionScope.number3} | ${number3}
* 应用程序范围属性值:${applicationScope.number4} | ${number4}
* EL表达式访问java代码段中的变量number5:${number5}
* EL表达式访问java域对象属性number6:${pageScope.number6} | ${number6}
EL表达式获取域对象中的属性值,域对象的属性在Servlet中添加的
<%@page contentType="text/html" pageEncoding="UTF-8"%>
在jsp页面中使用EL表达式获取域对象中的属性值
get_domain_attribute3.jsp页面
在jsp页面中使用EL表达式获取域对象中的属性值,域对象的属性在Servlet中添加的
* 请求范围属性值num1:${requestScope.num1}
* 会话范围属性值num2:${sessionScope.num2}
* 应用程序范围属性值num3:${applicationScope.num3}
* 学生信息:${requestScope.student.sname} | ${requestScope.student.srollno} | ${requestScope.student.sgender} | ${requestScope.student.spassword} | ${requestScope.student.sbatch}
* 狗(毛毛)信息:${sessionScope.dog.name} | ${sessionScope.dog.type} | ${sessionScope.dog.age}
* 列表第一只狗的信息:${requestScope.dogList[0].name} | ${requestScope.dogList[0].type} | ${requestScope.dogList[0].age}
* 字符串数组的各个值:${requestScope.names[0]} | ${requestScope.names[1]} | ${requestScope.names[2]}
* 对象数数组的各个值:${requestScope.info[0]} | ${requestScope.info[1]} | ${requestScope.info[2]}
package com.qdu.servlet;
import com.qdu.entity.Dog;
import com.qdu.entity.Student;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet("/pas")
public class PutAttributeServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//通常是发送请求给servlet,servlet转发请求给jsp
//在Servlet中可以使用请求对象、会话对象、上下文对象这三个域对象用于在不同范围共享数据
//请求对象中的属性只有转发请求才能共享给下个组件(jsp或servlet)
req.setAttribute("num1", 111);
HttpSession session = req.getSession();
session.setAttribute("num2", 222);
ServletContext ctx = getServletContext();
ctx.setAttribute("num3", 333);
Student s = new Student("2020208888", "Anna", "123456", "女", "20软件J01");
Dog d = new Dog("毛毛", "哈士奇", 2);
req.setAttribute("student", s);
session.setAttribute("dog", d);
//假设用一个数组存储了很多个字符串表示的名字
String[] array1 = {"小强", "小明", "小兰", "小花"};
req.setAttribute("names", array1);
//假设用一个数组存储了一个学生的名字、成绩排名和平均分,因为数据类型不同,所以可以考虑使用Object数组
Object[] array2 = {"小明", 2, 97.3};
req.setAttribute("info", array2);
List list=new ArrayList<>();
list.add(new Dog("球球","泰迪",2));
list.add(new Dog("旺财","柴犬",5));
list.add(new Dog("哈利","哈士奇",8));
list.add(new Dog("开心","边牧",10));
req.setAttribute("dogList", list);
req.getRequestDispatcher("/get_domain_attribute3.jsp").forward(req, resp);
}
}
使用EL调用类中静态方法
在类中定义静态方法
package com.qdu.util;
import java.util.Random;
public class NumberUtil {
private static Random ran = new Random();
public static int getRandomNumber() {
return ran.nextInt(100) +1; //1-100
}
public static int square(int x) {
return x * x;
}
public static int sum(int a, int b) { //严格来说,方法名+参数列表叫做方法的签名
return a + b;
}
}
package com.qdu.util;
public class StringUtil {
public static String getMobile(String mobile){
return mobile.substring(0,3)+"****"+mobile.substring(7,11);
}
}
创建TLD(Tag Library Descriptor标记库描述符
1.0 fc http://www.anna.com/func/core rand 获取一个1-100以内的随机整数 com.qdu.util.NumberUtil int getRandomNumber() square 计算一个整数的平方值 com.qdu.util.NumberUtil int square(int) sum 计算两数之和 com.qdu.util.NumberUtil int sum(int, int) getMobile 获取电话号码 com.qdu.util.StringUtil java.lang.String getMobile(java.lang.String)
在jsp页面使用taglib指令引入TLD
<%@taglib uri="http://www.anna.com/func/core" prefix="fc" %>
在EL表达式中调用方法
<%--
使用EL调用类中静态方法
--%>
<%@taglib uri="http://www.anna.com/func/core" prefix="fc" %>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
使用EL调用类中静态方法
使用EL调用类中静态方法
* 使用EL调用类中静态方法的步骤:
1) 在类中定义静态方法
2) 创建TLD(Tag Library Descriptor标记库描述符,一个xml文件,描述如何使用标记或函数)文件,TLD中不仅可以描述标记,还可描述函数,描述如何使用函数(function)
3) 在jsp页面使用taglib指令引入TLD
4) 在EL表达式中调用方法即可,调用语法:${TLD别名:函数名(参数列表)}
* 调用getRandomNumber()方法: ${fc:rand()}
* 调用square()方法: ${fc:square(4)}
* 调用sum()方法: ${fc:sum(2, 4)}
* 调用getMobile()方法: ${fc:getMobile("18706579002")}
使用 EL 表达式
EL表达式如何处理Null值和获取上下文参数
如果只是显示一个空值,EL表达式自动处理空值,什么都不显示
* 属性或变量值:${number}
EL表达式中,使用空值进行算术运算,则空值做0处理
* 求和:${number + 6}
EL表达式中,在比较运算中使用空值,则做false处理
* 逻辑判断:${result ? 1 : 0}
使用EL表达式获取上下文参数(context parameter)
encoding UTF-8 anna@qdu.edu.cn 30
EL表达式提供initParam隐式对象,用于获取上下文参数,语法:${initParam.参数名}
* 上下文参数encoding: ${initParam.endcoding}
EL表达式练习
* 请求参数name的值:${param.name}
* 请求参数address的值:${paramValues.address[0]} | ${paramValues.address[1]}
* 属性number的值:${pageScope.number}
* 属性msg的值:${requestScope.msg}
* 属性username的值:${sessionScope.username}
* 属性onlineCount的值:${applicationScope.onlineCount}
* 员工小明的所有信息:${requestScope.emp1.empId} | ${requestScope.emp1.empName} | ${requestScope.emp1.empGender} | ${requestScope.emp1.empGrade} | ${requestScope.emp1.empDob}
* 员工小花的所有信息:${sessionScope.emp2.empId} | ${sessionScope.emp2.empName} | ${sessionScope.emp2.empGender} | ${sessionScope.emp2.empGrade} | ${sessionScope.emp2.empDob}
* 上下文参数dbusername的值:${initParam.dbusername}
* 上下文参数dbpassword的值:${initParam.dbpassword}
* 属性data的所有元素值:${pageScope.data[0]} | ${pageScope.data[1]} | ${pageScope.data[2]} | ${pageScope.data[3]} | ${pageScope.data[4]}





