前言
本章学习JSP的EL表达式的相关知识
方法
1.概念
EL(Expression Language) 是为了使JSP写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,让Jsp的代码更加简化。
我们知道,通过servlet处理后的数据需要返回到JSP进行展示的时候,我们通常的做法是用以前的脚本段语句,也就是<%=%>
让我们来分析以下它的缺点你就会幡然醒悟为什么不用这种方式转而去使用EL表达式了!
1)使用传统的方式获取servlet传递给JSP的数据
实例:使用servlet传递参数给JSP
UserServlet.java
package com.jwang.student.servlet;
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 java.io.IOException;
@WebServlet("/login.do")
public class UserServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
String username = request.getParameter("username");
String password = request.getParameter("password");
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
request.setAttribute("testData","我是传递给JSP的字符串!");
request.getRequestDispatcher("/success.jsp").forward(request, response);
/*UserService userService = new UserServiceImpl();
User user = new User("01", username, password);
if (userService.login(user)) {
request.getRequestDispatcher("/success.jsp").forward(request, response);
} else {
request.getRequestDispatcher("/login.jsp").forward(request, response);
}*/
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>用户登录</title>
</head>
<body>
<h1>登录成功</h1>
<h4><%=request.getAttribute("testData")%></h4>
</body>
</html>
让我们来访问一下login.do看一下效果!
我们可以看到,传统的方式也实现了相关功能,为什么要换其他方式呢?别急,我们看下面
实例:使用传统方式获取Servlet传递给JSP的List集合
代码我就不重新贴了,只是把UserServlet.java中的一段代码改成如下方式:
其中的User对象阅读我博客的人也不陌生!
List<User> result = new ArrayList<>();
User user = new User("01", "admin", "admin");
result.add(user);
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
request.setAttribute("testData",result);
那么,我们直接运行以下login.do看一下效果!
我们对sucess.jsp进行调整让它显示用户名,也就是userName的值:
<%@ page import="com.jwang.student.bo.User" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>用户登录</title>
</head>
<body>
<h1>登录成功</h1>
<%
List<User> result = (List<User>)request.getAttribute("testData");
for(User user : result){
%>
<h4><%=user.getUserName()%></h4>
<%
}
%>
</body>
</html>
我们上面使用page指令引入了两个包,使用强制转换,使用了Java的foreach,最后使用脚本段勉强把userName给输出了出来,看效果:
可是你有没有想过,逻辑再复杂点,还能撑得住吗?我们之前的原则是什么?JSP做页面展示,Servlet做逻辑处理
2)使用EL表达式获取servlet传递给JSP的数据
话不多说,直接上代码:
success.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>用户登录</title>
</head>
<body>
<h1>登录成功</h1>
<h4>${testData[0].userName}</h4>
</body>
</html>
让我们来访问login.do看一下效果:
简短的代码实现了相同的功能,你找不到任何Java代码的痕迹,实现了之前说的原则。
2.使用EL表达式
通过上面的对比我们不难看出,在JSP上返回一个Servlet的数据还是EL表达式来的爽,下面让我们学习一下它的基本语法
1)基本语法
作用:获取作用域对象中的数据。
注意:获取的是pageContext、request、session、application四个对象中的数据,其他数据一概不理会。
找到了则获取返回,找不到则什么都不做,也不报错。
语法:
${表达式}
表达式:
获取请求数据
request对象存储了请求数据--->param.键名 返回值
request对象存储了请求数据--->paramvalues.键名 返回的是数组
通过setAttribute方法存储到作用域对象中的数据
${键名} 返回键名所对应的值。
注意:
如果存储的是普通字符串则直接返回
如果存储的是对象,则返回的是对象
获取对象中的数据:
普通对象
${键名.属性名.属性名....}
集合对象
list集合--->${键名[角标]}
map集合--->${键名.map集合存储的键名}
作用域查找顺序:
默认查找顺序:
pageConext-->request--->session--->application
注意:
每次查找都是从小到大进行查找,找到了则获取,不再继续找了。
指定查找:
${pageScope.键名}---${requestScope.键名}--${sessionScope.键名}--${applicationScope.键名}
2)EL表达式的逻辑运算:
${逻辑表达式}:&& || !
${算术表达式}:+,-,*,/
${关系表达式}:>,<,>=,==,!=,%
特殊:
三目运算
注意:
+表示加法运算,不表示字符链接。使用EL表达式进行字符链接会报错。
3)EL的空值判断:
${empty 键名}
作用:
判断键名对象的值是否存有数据。
4)EL获取请求头数据和Cookie数据:
请求头数据:
${header}-->返回所有的请求头数据
${header["键名"]}--->返回指定的键名的请求头数据
${hedaerValues["键名"]}--->返回指定的键名(同键不同值)的值的数组。
获取Cookie数据:
${cookie}--->返回存储了所有的cookie对象的map集合
${cookie.键名}---->返回指定的cookie对象
${cookie.键名.name}--->返回指定的cookie对象存储的数据的键名。
${cookie.键名.value}--->返回指定的cookie对象存储的数据的值。