JSP-EL表达式


水光潋滟晴方好,山色空蒙雨亦奇。—宋代苏轼《饮湖上初晴后雨二首·其二》


EL表达式

EL(Expression Language) 目的:为了使JSP写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,让Jsp的代码更加简化。

JSP表达式语言(EL)使得访问存储在JavaBean中的数据变得非常简单。JSP EL既可以用来创建算术表达式也可以用来创建逻辑表达式。在JSP EL表达式内可以使用整型数,浮点数,字符串,常量true、false,还有null。

菜鸟教程:http://www.runoob.com/jsp/jsp-expression-language.html

1 EL 的基本语法

${expression}

expression 指定要输出的内容,可以是字符串,也可以是由 EL 运算符组成的表达式

如果在 JSP 页面中显示${,必须写成\${,或者用 ${'${'}表达式输出${符号。

2 禁用 EL

想要停用对EL表达式的评估的话,需要使用page指令将isELIgnored属性值设为true:

<%@ page isELIgnored ="true|false" %>

这样,EL表达式就会被忽略。若设为false,则容器将会计算EL表达式。

3 EL中的基础操作符

EL表达式支持大部分Java所提供的算术和逻辑操作符:

注意优先级

操作符       描述
.           访问一个Bean属性或者一个映射条目
[]          访问一个数组或者链表的元素
( )         组织一个子表达式以改变优先级
+           加
-           减或负
*           乘
/ or div    除
% or mod    取模
== or eq    测试是否相等
!= or ne    测试是否不等
< or lt     测试是否小于
> or gt     测试是否大于
<= or le    测试是否小于等于
>= or ge    测试是否大于等于
&& or and   测试逻辑与
|| or or    测试逻辑或
! or not    测试取反
empty       测试是否空值

4 JSP EL中的函数

JSP EL允许您在表达式中使用函数。这些函数必须被定义在自定义标签库中。函数的使用语法如下:

${ns:func(param1, param2, ...)}

ns指的是命名空间(namespace),func指的是函数的名称,param1指的是第一个参数,param2指的是第二个参数,以此类推。比如,有函数fn:length,在JSTL库中定义,可以像下面这样来获取一个字符串的长度:

${fn:length("Get my length")}

要使用任何标签库中的函数,您需要将这些库安装在服务器中,然后使用标签在JSP文件中包含这些库。

5 EL 保留字

and     eq  gt   true
or      ne  le   false 
mod     no  lt   ge 
null  instanceof  empty  div 

6 通过EL访问数据

6.1 访问 JavaBean 对象Student的属性值。

id="student" class="com.mingrisoft.Student">
.
.
${student.id}
${student.name}
${student["name"]}

属性有特殊字符时只能使用[] ,${Student[name-id]},[]还可以获取数组或 list 集合的数据。

6.2 数组元素的获取

book 和 requestI 都是存放在 request范围中

${book[requestI]}
<%
        String[] arr = { "Java Web开发典型模块大全", "Java Web开发实战宝典", "JSP项目开发全程实录(第二版)" }; //定义一维数组
        request.setAttribute("book", arr); //将数组保存到request对象中
    %>
    <%
        String[] arr1 = (String[]) request.getAttribute("book");//获取保存到request范围内的变量
        //通过循环和EL输出一维数组的内容
        for (int i = 0; i < arr1.length; i++) {
            request.setAttribute("requestI", i); //将循环变量i保存到request范围内的变量中
    %>

    ${requestI}:${book[requestI]}
    <br>
    
    <%
        }
    %>
 0:Java Web开发典型模块大全 
 1:Java Web开发实战宝典 
 2:JSP项目开发全程实录(第二版)

6.3 List 集合元素的获取

<%
        List<String> list = new ArrayList<String>(); //声明一个List集合的对象
        list.add("相框"); //添加第1个元素
        list.add("笔筒"); //添加第2个元素
        list.add("鼠标垫"); //添加第3个元素
        session.setAttribute("goodsList", list); //将List集合保存到session对象中
    %>
    <%
        //获取保存到session范围内的变量
        List<String> list1 = (List<String>) session.getAttribute("goodsList");
        //通过循环和EL输出List集合的内容
        for (int i = 0; i < list1.size(); i++) {
            request.setAttribute("requestI", i); //将循环增量保存到request范围内
    %>

    ${requestI}:${goodsList[requestI]}
    
    <br>    
    <%
        }
    %>
0:相框  
1:笔筒  
2:鼠标垫  

7 EL中的算术运算

EL 中的“+”运算符和 Java 中的“+”预算符不同,它不能实现连个字符串的相连接,如果运算两个不可转换为数组型的字符串时,将抛出异常



    ${10+1 }
    
${10/1 }${10 div 0 }
${10%3 }${10 mod 3 }
 11 
 10.0Infinity 
 11 

8 EL中判断对象是否为空

${empth expression}
<% request.setAttribute("user", "");
   request.setAttribute("user1", null);
%>
${empty user } 
${empty user1 }
true  true 

一个变量或对象为 null 或者为空代表的意义是不同的。null 表示这个变量没有指明任何对象;而空表示这个变量所属的对象其内容为空,例如,空字符串、空的数组或者空的 List 容器。

9 EL 中的逻辑关系运算

9.1 关系运算符

${表达式1 关系运算符 表达式2}

EL关系运算符有以下六个运算符

关系运算符 说 明 范 例 结 果
==或eq 等于 ${5==5}或${5eq5} true
!=或ne 不等于 ${5!=5}或${5ne5} false
<或lt 小于 ${3<5}或${3lt5} true
>或gt 大于 ${3>5}或${3gt5} false
<=或le 小于等于 ${3<=5}或${3le5} true
>=或ge 大于等于 ${3>=5}或${3ge5} false

9.2 逻辑运算符

EL逻辑运算符只有三个

A 为 true
B 为 false

逻辑元算符 说 明 范 例 结 果
&&或and ${A && B}或${A and B} false
||或or ${A || B}或${A or B} true
!或not ${!A}或${not A} false
    <%
        request.setAttribute("userName", "my"); //定义request范围内的变量userName
        request.setAttribute("pwd", "mysoft"); //定义pwd范围内的变量pwd
    %>
    userName=${userName}
    <br>
    
    pwd=${pwd}
    <br>
    
    \${userName!="" and (userName=="明天") }:

    
    ${userName!="" and userName=="明天" }
    <br>
    
    \${userName=="mr" and pwd=="mrsoft" }:
    
    ${userName=="mr" and pwd=="mrsoft" }
    
 userName=my 
 pwd=mysoft 
 ${userName!="" and (userName=="明天") }:  false 
 ${userName=="mr" and pwd=="mrsoft" }:  false 

9.3 条件运算符

${条件表达式 ? 表达式1 : 表达式2 }
${empty cart ? "car 为空" : cart}

10 EL 的隐含对象

为了获得 Web 应用程序中的相关数据,EL 提供了 11 个隐含对象,这些对象类似于 JSP 的内置对象,也是直接通过对象名进行操作。 在这些隐含对象中, pageContext 是 JavaBean 对象,对应于 java.servlet.PageContext 类型,其他的隐含对象都对应于 java.util.Map 类型。这些隐含对象可以分为页面上下文对象、访问作用域范围隐含对象和访问环境信息的隐含对象3种。

10.1 页面的上下文对象

用于访问 JSP 的内置对象。
1 访问request对象

${pageContext.request}
${pageContext.request.serverPort}

不能通过 pageContext 对象获取保存到 request 范围内的变量

2 访问 response 对象

${pageContext.response}
${pageContext.response.contentType}

3 访问 out 对象

${pageContext.out}

4 访问 session 对象

${pageContext.session}

5 访问 exception 对象

${pageContext.exception}

6 访问 page对象

${pageContext.page}

7 访问 servletContext 对象

${pageContext.servletContext }

可以通过该对象获取 servlet 上下文信息。

10.2 访问作用域范围的隐含对象

在 EL 中提供了 4个用于访问作用域范围的隐含对象,即 pageScope、requestScope、sessionScope和 applicationScope。4个隐含的对象只能用来取得指定范围内的属性值,而不能取得其他相关信息。

1.pageScope 隐含对象
返回包含 page(页面)范围内的属性值得集合。返回值为 java.util.Map 对象。

Student.java

//package com.mingrisoft;

public class Student {
    private String name ="";
    private int id = 5 ;    
    ...
}   
 <jsp:useBean id="Student" class="com.mingrisoft.Student" scope="page">
<jsp:setProperty property="name" name="Student" value="无语"/>
jsp:useBean>
<%request.setAttribute("book", "能不能获取"); %>
.
.
一:${Student.name }<br>
二:${Student["name"]}<br>
三:${Student[name]}<br>
四:${Student[id]}<br>
五:${Student.id}<br>
六:${pageScope.Student.name}<br>
七:${pageScope.Student.id}<br>
八:${book}

执行结果:

一:无语
二:无语
三:
四:
五:5
六:无语
七:5
八:能不能获取 

2.requestScope 对象
返回包含 request(请求)范围内的属性值的集合,返回值为 java.util.Map 对象。

<%  request.setAttribute("userName","pp"); %>
${requestScope.userName}

3.sessionScope 隐含对象
返回包含 session(会话)范围呢IDE属性值的集合,返回值为java.util.Map 对象。

<%  session.setAttribute("manager","pp"); %>
${sessionScope.manager}

4.applicationScope 隐含对象

<%  application.setAttribute("message","欢迎您"); %>
${applicationScope.message}

10.3 访问环境信息的隐含对象

6个访问环境信息的隐含对象。
1.param 对象
用于获取请求参数的值,应用在参数值只有一个的情况下,返回的结果是字符串。

"name" type="text">

当表单提交后,获取 name 文本框的值

${param.name}

支持中文 request.setCharacterEncoding(“utf-8”)

2.paramValues 对象
一个请求参数对应多个值时,则需要使用 paramValues ,返回的是数组。

${paramValues.affect[0]} ${paramValues.affect[1]}...

3.header 和 headerValues 对象
获取 HTTP 请求的一个具体的 header 值。

4.initParam 对象
获取 Web 应用初始化参数的值,读出 web.xml 文件

    param>
        <param-name>companyparam-name>
        <param-value>小米科技有限公司param-value>
    param>
${initParam.company}

5.cookie 对象

<% Cookie cookie = new Cookie("user","mrbccd");
   response.addCookie(cookie);
%>
   ${cookie.user.value}

11 使用 EL 函数

1.定义一个 Java 类,编写一个公有静态的方法,实现自定义 EL 函数的具体功能。

<%@ taglib uri="/stringDeal" prefix="wghfn"%>
${wghfn:shiftEnter(param.content)}

StringDeal.java

//package com.wgh;

public class StringDeal {
    public static String shiftEnter(String str) { // 定义公用的静态方法
        String newStr = str.replaceAll("\r\n", "
"
); // 替换回车换行符 newStr = newStr.replaceAll(" ", " ");// 替换空格符 return newStr; } }

2.编写标签库描述文件,对函数进行声明。文件的扩展名为 .tld,保存到 WEB-INF 文件夹下.

stringDeal.tld


<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
    web-jsptaglibrary_2_0.xsd"
    version="2.0">
    <tlib-version>1.0tlib-version>
    <uri>/stringDealuri>
    <function>
        <name>shiftEntername>
        <function-class>com.wgh.StringDealfunction-class>
        <function-signature>java.lang.String shiftEnter(java.lang.String)
        function-signature>
    function>
taglib>

3.在 JSP 页面中引用标签库,并调用定义的 EL 函数。
index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<html>
<head>
<meta charset="utf-8">
<title>定义EL函数处理字符串中的回车换行符和空格符title>
head>
<body>
<form name="form1" method="post" action="deal.jsp">
  <textarea name="content" cols="30" rows="5">textarea>
  <br>
  <input type="submit" name="Button" value="提交" >
form>
body>
html>

deal.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="/stringDeal" prefix="wghfn"%>
<%request.setCharacterEncoding("UTF-8"); %>

<html>
<head>
<meta charset="utf-8">
<title>显示结果title>
head>
<body>
内容为:<br>
${wghfn:shiftEnter(param.content)}
body>
html>

应用 EL 访问 JavaBean 属性

JSP-EL表达式_第1张图片

JSP-EL表达式_第2张图片

UserForm.java

//package com.wgh;

public class UserForm {
    private String username="";     //用户名属性
    private String pwd="";          //密码属性
    private String sex="";          //性别属性
    private String[] affect=null;   //爱好属性
    public void setUsername(String username) {
        this.username = username;
    }
    public String getUsername() {
        return username;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    public String getPwd() {
        return pwd;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public String getSex() {
        return sex;
    }
    public void setAffect(String[] affect) {
        this.affect = affect;
    }
    public String[] getAffect() {

        return affect;
    }
}

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<html>
<head>
<meta charset="utf-8">
<title>应用EL访问JavaBean属性title>
<style>
ul {
    list-style: none;
}

li {
    padding: 5px;
}
style>
head>
<body>
    <form name="form1" method="post" action="deal.jsp">
        <ul>
            <li>用户昵称:<input name="username" type="text" id="username">li>
            <li>密 码:       <input name="pwd" type="password" id="pwd">li>
            <li>确认密码:<input name="repwd" type="password" id="repwd">li>
            <li>性 别:      <input name="sex" type="radio" value="男"checked="checked"><input name="sex" type="radio"value="女">li>
            <li>爱 好:<input name="affect" type="checkbox" id="affect"value="体育"> 体育 
                    <input name="affect" type="checkbox" id="affect" value="美术"> 美术 
                    <input name="affect" type="checkbox" id="affect" value="音乐"> 音乐 
                    <input name="affect" type="checkbox" id="affect" value="旅游"> 旅游
            li>
            <li><input name="Submit" type="submit" value="提交"> 
                <input name="Submit2" type="reset" value="重置">li>
        ul>
    form>
body>
html>

deal.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%request.setCharacterEncoding("UTF-8");%>
<jsp:useBean id="userForm" class="com.wgh.UserForm" scope="page"/>
<jsp:setProperty name="userForm" property="*"/>

<html>
<head>
<meta charset="utf-8">
<title>显示用户填写的注册信息title>
<style>
ul{
    list-style: none;
}
li{
    padding:5px;
}
style>
head>
<body>
<form name="form1" method="post" action="PollServlet">
<ul>
    <li>用户昵称:${userForm.username}li>
    <li>密  码:${userForm.pwd}li>
    <li>性  别:${userForm.sex}li>
    <li>爱  好:${userForm.affect[0]} ${userForm.affect[1]}
     ${userForm.affect[2]} ${userForm.affect[3]}li>
    <li><input name="Button" type="button" class="btn_grey" value="返回" 
            onClick="window.location.href='index.jsp'">li>
ul>
form>
body>
html>

你可能感兴趣的:(jsp,JSP,EL表达式)