【JSP04】EL表达式

El表达式可以获取程序中的数据,尤其是作用域数据,并且将取得的数据直接输出到浏览器上;相比之前提到的JSP打印标签或是Servlet打印流,EL表达式的优点是更加直接、快速;

编写一个Servlet去设置一些数据:

@WebServlet("/dataServlet")
public class DataServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setAttribute("var","StringVarRequest");
        request.getSession().setAttribute("var","StringVarSession");
        this.getServletContext().setAttribute("var","StringVarServletContext");

        request.getRequestDispatcher("show.jsp").forward(request,response);
    }
}

如果不使用EL表达式,则需要按照如下结构书写JSP:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
不使用EL表达式:
<%
    String varRequest = (String) request.getAttribute("var");
%>
<br>
方式一:
<%
    out.write(varRequest);
%>
<br>
方式二:
<%=varRequest%>
</body>
</html>

方式一和方式二都需要一个前提:String varRequest = (String) request.getAttribute("var");,需要先从对应的作用域中将需要的数据取出来;重启服务器,查看结果:

1 获取基础数据类型

基础类型包括Java的八种基本数据类型、String类型以及Date类型;使用EL表达式获取基础数据类型十分简单,直接使用${}即可,{}中填入响应的表达式,例如:

修改原来的Servlet,增加一些类型的数据:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.setAttribute("var","StringVarRequest");
    request.getSession().setAttribute("var","StringVarSession");
    this.getServletContext().setAttribute("var","StringVarServletContext");

    request.setAttribute("date",new Date());
    request.setAttribute("integerVar",10);
    request.setAttribute("doubleVar",3.14);

    request.getRequestDispatcher("show.jsp").forward(request,response);
}

注意,此处的键不能为Java关键字和保留字;

JSP:

使用EL表达式获取基础数据类型:<br>
${var} <br>
${date} <br>
${integerVar} <br>
${doubleVar} <br>

查看结果:

可以观察到,EL表达式可以根据作用域数据中的键直接获取值;

如果{}内的EL表达式如上直接写入键的话,EL表达式会从四个作用域中,从小到大地去依次检索键,检索成功则直接输出并结束检索;这样如果牵扯到不同作用域的同名键就会有如下两个问题:

  • 需要依次地去检索四个作用域,执行效率低;

  • 大作用域中的数据不能输出,例如例子中的session作用域和application作用域;

要解决这些问题,在键之前加入作用域限定修饰来限制检索范围即可:

  • pageScope:page作用域;

  • requestScope:request作用域;

  • sessionScope:session作用域;

  • applicationScope:application作用域;

例如:

使用作用域限定:<br>
${pageScope.var} <br>
${requestScope.var} <br>
${sessionScope.var} <br>
${applicationScope.var} <br>

可以分别展示不同作用域中的var(page作用域中没有var为键的作用域数据,则为空):

 

2 获取对象数据类型

创建一个User类做演示:

public class User {
    private String name;
    private String password;

    Constructor、Getter、Setter......
}

更新Servlet,向request作用域中加入user数据:

User user = new User("user", "12345");
request.setAttribute("user",user);

在JSP中使用EL表达式获取:

使用EL表达式获取对象数据类型:<br>
${requestScope.user}

查看结果:

可以看到,直接写入user打印输出会调用User类的toString方法,此处没有重写,如果重写了toString方法则效果如下:

如果需要获取具体的属性值,则需要进一步在user后面加上对应的属性名:

使用EL表达式获取对象数据类型:<br>
${requestScope.user.name} <br>
${requestScope.user.password} <br>

效果如下:

事实上,EL表达式会去调用对象的Getter和Setter,如果没有写Getter和Setter的话会出错;

3 获取集合类型

集合类型的数据涉及到两个操作:遍历集合以及获取集合中的某个元素,遍历集合需要用到循环,会在JSTL重点介绍,此处仅介绍如何获取集合中的某一个元素;

3.1 List集合

创建一个集合,存储对象:

User user1 = new User("user1", "12345user1");
User user2 = new User("user2", "12345user2");
User user3 = new User("user3", "12345user3");
List<User> users = Arrays.asList(user1, user2, user3);
request.setAttribute("users",users);

JSP获取数据:

使用EL表达式获取集合数据类型--List:<br>
${requestScope.users} <br>
${requestScope.users[0]} <br>
${requestScope.users.get(1)} <br>
${requestScope.users[2].name} <br>

结果:

  • 直接写入List集合数据的话,同样也会调用toString方法;

  • 获取List集合数据中某个具体的元素,可以使用[]或者.get,例如:users[0]users.get(1)

3.2 Map集合

Map的获取和List的获取基本一致,例如以下Map数据:

HashMap<String , User> userMap = new HashMap<>();
userMap.put("userOne",user1);
userMap.put("userTwo",user2);
userMap.put("userThree",user3);
request.setAttribute("userMap",userMap);

使用JSP获取:

使用EL表达式获取集合数据类型--Map:<br>
${requestScope.userMap} <br>
${requestScope.userMap["userOne"]} <br>
${requestScope.userMap.get("userTwo")} <br>
${requestScope.userMap.get("userThree").name} <br>

结果:

4 获取Cookie

设置Cookie数据:

Cookie cookie = new Cookie("cookieName", "cookieValue");
response.addCookie(cookie);

JSP获取:

使用EL表达式获取Cookie:<br>
${cookie.cookieName} <br>
${cookie.cookieName.name} <br>
${cookie.cookieName.value} <br>

展示:

  • 必须加上cookie.限定表示获取的是Cookie对象;

  • 获取Cookie对象的键使用.name;

  • 获取Cookie对象的值使用.value

5 使用运算符

在EL表达式中是可以使用运算符的:

  • 算数运算符:+-*/%

  • 比较运算符:><>=<=!===

  • 逻辑运算符:&&||!

版权声明:
作者:jackqiang
链接:http://www.jackqiang.com/javaweb/server/jsp/2173/jsp_el/
来源:JackQiang's
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录