JSP 笔记 —— EL 表达式语言

一、EL 概览

Expression Language(EL),它提供了一个让Web 页面和Bean 管理进行通信的重要机制,被应用在JSF (一个开发JavaWeb的标准框架,很少用)和JSP 技术中。简言之,EL 在页面既能获取 Bean 的属性,又能获取JSP 内置对象的属性,仅仅是获取来使用,并不能设置与修改!

1、基础语法与特点

语法:${expression}

特点:

可与JSTL 及JavaScript 语句结合使用;

对两个数值型字符串的相加,自动执行类型转换(EL 不能实现字符串相加功能);

不仅可以访问一般变量,而且可以访问javabean 中的属性、嵌套属性和集合对象;

可以执行算术、逻辑、条件、关系运算;

可以获得命名空间(pageContext 对象);

可以访问JSP 的四个作用域;

执行除法运算时,除数为0返回Infinity,对于不存在的属性,不显示为null,而是显示空字符串等;

EL 函数可与Java 类的静态方法进行映射。


2、EL 禁用

只要安装的Web 服务器能够支持Servlet 2.4/JSP 2.0,即可在JSP 页面中直接使用EL 。低于JPS 2.0的版本中,需要对其进行禁用。(应该是指从高版本迁移到低版本的服务器环境,所以需要禁用EL ,不然就不使用EL 好了。EL 只是用来显示信息的,所以禁用后对业务整个应用功能不会造成影响,只是客户端显示可能出现问题。)

JSP 中三种方式禁用EL :

1)、使用转义字符"\",一般不这么做,麻烦。如:\${request.userName}

2)、使用page 指令的isELIgnored 属性,取值true或false

3)、web.xml中在jsp-config 元素中配置,如:

<jsp-config>
	  <jsp-property-group>
	  	<url-pattern>*.jsp</url-pattern>
	  	<el-ignored>true</el-ignored>
	  </jsp-property-group>
</jsp-config>
注:新了解了在web.xml 中对jsp页面进行配置的标签,jsp-config包含两个大的子标签,具体功能暂不详细了解:

<jsp-config>
	 <taglib>
	 
	 </taglib>
	 <jsp-property-group>
	 
	 </jsp-property-group>
</jsp-config>
技巧:eclipse中在某标签内容处ctrl+/ 提示信息,关键在于提示的标签中将当前可选与不可选的标签都列出了,其中可选的标签,其前面的"<>"是黑色的,不可选的呈灰色。

3、EL 中保留关键字

共16个,在此简单分类:

逻辑:or、and、not

比较:gt、eq、lt、ge、le

判断:instanceof、empty、null、true、false

除法:mod、div


4、EL 运算符及其优先级 

算术型:+、-(二元)、*、/、div、%、mod、-(一元)
逻辑型:and、&&、or、||、!、not
关系型:==、eq、!=、ne、、gt、<=、le、>=、ge。可以与其他值进行比较,或与布尔型、字符串型、整型或浮点型文字进行比较。
空:空操作符是前缀操作,可用于确定值是否为空。
条件型: A ?B :C。根据 A 赋值的结果来赋值 B 或 C。  

注:此外,还应该注意[]与点的访问数据的作用,对于有"-"号命名的属性,只能通过[]访问,如:${request["user-name"]},而非${request.user-name}


5、EL 访问应用数据的隐含对象

EL 提供了11个隐含对象,对应于JSP 的内置对象,直接通过对象名操作。这些隐含对象中,除pageContext 是JavaBean 对象,对应于javax.servlet.jsp.PageContext 类型,其它的对象均对应于java .util.Map 类型,里面存储了与JSP 内置对象的数据。在此简单分类:

(1)、pageContext 隐含对象。可以获取JSP 中9个内置对象中application、config、pageContext 除外的内置对象的相应隐含对象,及servletContext(JSP 中实际上application内置对象就是ServletContext 的实例)隐含对象。即可获取:servletContext、session、request、response、page、out、exception隐含对象。

(2)、servletContext、session、request、response、page、out、exception隐含对象。

(3)、pageScope、requestScope、sessionScope、applicationScope隐含对象。使用这些对象后,将系统将不再按照默认的顺序(page、request、session、application)查找相应的标识符。实例化一个bean 时是可以通过scope属性指定其存在范围的。


6、EL 访问环境信息的隐含对象

共6个:

param对象:获取请求参数的值,如获取name属性为user的input 的值:${param.user};

paramValues对象:如果表单中同一个name对应多个值,则使用此对象而非param对象;

header对象:获取HTTP 请求的一个具体的header值;

headerValues对象:类比param与paramValues对象;

initParam对象:获取应用的初始化参数(通过context-param标签定义的参数);

cookie 对象:可以访问在客户端设置的cookie对象(通过response的addCookie设置cookie),语法:${cookie.cookie名.cookie值}


7、定义和使用EL 函数

具体看 定义和使用标签库 篇。

注:以上整理于《Java Web 入门经典》——王国辉 陈英等



二、实例解析EL 中各种运用


原文:http://www.jb51.net/article/82406.htm

内容:

这篇文章主要介绍了JSP中EL表达式的各种运用,比如用EL处理数学运算、内置对象以及数据的存取等,代码示例都相当实用,需要的朋友可以参考下

EL运算符:

<%@pagelanguage="java"contentType="text/html;charset=gb2312"%>
<%@pageimport="java.sql.*"%>
<!DOCTYPE html>
<html>
  <head>
    <title>El算数运算符</title>
  </head>
  <body>
    <table border=1>
      <tr>
        <td>算数运算符</td>
        <td>结果</td>
      </tr>
      <tr>
        <td>加法运算符\${1+ 1}</td>
        <td>结果${1+1}</td>
      </tr>
      <tr>
        <td>减法运算符\${1- 1}</td>
        <td>结果${1-1}</td>
      </tr>
      <tr>
        <td>乘法运算符\${1* 2}</td>
        <td>结果${1* 1}</td>
      </tr>
      <tr>
        <td>除法运算符\${3/ 2}</td>
        <td>结果${3/ 2}</td>
      </tr>
      <tr>
        <td>求余运算符\${3% 2}</td>
        <td>结果${3% 2}</td>
      </tr>
    </table>
    <table border=1>
      <tr>
        <td>关系运算符</td>
        <td>结果</td>
      </tr>
      <tr>
        <td>等于运算符\${1== 1}</td>
        <td>结果${1==1}</td>
      </tr>
      <tr>
        <td>不等于运算符\${1!= 1}</td>
        <td>结果${1!=1}</td>
      </tr>
      <tr>
        <td>小于运算符\${1< 2}</td>
        <td>结果${1< 2}</td>
      </tr>
      <tr>
        <td>大于运算符\${3> 2}</td>
        <td>结果${3> 2}</td>
      </tr>
      <tr>
        <td>小于等于运算符\${1<= 2}</td>
        <td>结果${1<= 2}</td>
      </tr>
      <tr>
        <td>大于等于运算符\${3>= 2}</td>
        <td>结果${3>= 2}</td>
      </tr>
    </table>
    <table border=1>
      <tr>
        <td>逻辑运算符</td>
        <td>结果</td>
      </tr>
      <tr>
        <td colspan="2">逻辑运算符&&</td>
      </tr>
      <tr>
        <td>\${true&& true}</td>
        <td>结果${true&& true}</td>
      </tr>
      <tr>
        <td>\${true&& false}</td>
        <td>结果${true&& false}</td>
      </tr>
      <tr>
        <td>\${false&& false}</td>
        <td>结果${false&& false}</td>
      </tr>
      <tr>
        <td colspan="2">逻辑运算符||</td>
      </tr>
      <tr>
        <td>\${true|| true}</td>
        <td>结果${true|| true}</td>
      </tr><tr>
        <td>\${true|| false}</td>
        <td>结果${true|| false}</td>
      </tr><tr>
        <td>\${false|| false}</td>
        <td>结果${false|| false}</td>
      </tr>
      <tr>
        <td colspan="2">逻辑运算符!</td>
      </tr>
      <tr>
        <td>\${!true}</td>
        <td>结果${!true}</td>
      </tr><tr>
        <td>\${!false}</td>
        <td>结果${!false}</td>
      </tr>
    </table>
    <table border=1>
      <tr>
        <td>条件运算符</td>
        <td>结果</td>
      </tr>
      <tr>
        <td>\${2>1?"Yes":"No"}</td>
        <td>结果${2>1?"Yes":"No"}</td>
      </tr>
      <tr>
        <td>\${2<1?"Yes":"No"}</td>
        <td>结果${2<1?"Yes":"No"}</td>
      </tr>
    </table>
    <table border=1>
      <tr>
        <td>验证运算符</td>
        <td>结果</td>
      </tr>
      <tr>
        <td>\${empty param.username}</td>
        <td>结果${empty param.username}</td>
      </tr>
      <tr>
        <td>\${empty param.password}</td>
        <td>结果${empty param.password}</td>
      </tr>
    </table>
    <table border=1>
      <tr>
        <td>括号运算符及运算符的优先级</td>
        <td>结果</td>
      </tr>
    </table>
  </body>
</html>

EL处理内置对象:

“.”和"[]"符号是用来存取数据的

${applicationScope.user.username}
${applicationScope.user[0].username}
${applicationScope.user["user-name"]}

通过变量来传值就必须使用[]

${applicationScope.user["data"]}

与存储有关的内置对象

?
<!DOCTYPE html>
<html>
  <head>
    <title>与存储有关的内置对象</title>
  </head>
  <body>
    <%
      //application范围设置属性name,值为application_name
      application.setAttribute("name","application_name");
      //session范围设置属性name,值为session_name
      session.setAttribute("name","session_name");
      //request范围设置属性name,值为request_name
      request.setAttribute("name","request_name");
      //page范围设置属性name,值为page_name
      pageContext.setAttribute("name","page_name");
    %>
    <%--获取page范围内的name属性--%>
    page范围内的那么属性的值为:${pageScope.name}<br />
    <%--获取request范围内的name的属性--%>
    request范围内的那么属性的值为:${requestScope.name}<br />
    <%--获取session范围内的name的属性--%>
    session范围内的那么属性的值为:${sessionScope.name}<br />
    <%--获取application范围内的name属性--%>
    application范围内的那么属性的值为:${applicationScope.name}<br />
  </body>
</html>

与输入有关的内置对象

<!DOCTYPE html>
<html>
  <head>
    <title>用户表单</title>
  </head>
  <body>
    <form action="UserDemo.jsp"method="post">
      用户名:<input type="text"name="username"/><br />
      密码:<input type="password"name="password"/><br />
      姓名:<input type="text"name="name"/><br />
      性别:<input type="radio"name="sex"value="男">男<input type="radio"name="sex"value="女">女<br />
      爱好:<br />
      <input type="checkbox"name="interest"value="打篮球">打篮球<br />
      <input type="checkbox"name="interest"value="看书">看书<br />
      <input type="checkbox"name="interest"value="旅行">旅行<br />
      <input type="checkbox"name="interest"value="编程">编程<br />
      <input type="submit"value="提交">
      <input type="reset"value="重置">
    </form>
  </body>
</html>

<!DOCTYPE html>
<html>
  <head>
    <title>接收用户参数</title>
  </head>
  <body>
    <%
      //设置页面编码格式
      request.setCharacterEncoding("gb2312");
    %>
    <%--接收用户参数--%>
    用户名:${<span style="color:#003399;">param</span>.username}<br />
    密码:${<span style="color:#003399;">param</span>.password}<br />
    姓名:${<span style="color:#003399;">param</span>.name}<br />
    性别:${<span style="color:#003399;">param</span>.sex}<br />
    爱好:${<span style="color:#003399;">paramValues</span>.interest[0]}
        ${<span style="color:#003399;">paramValues</span>.interest[1]}
  </body>
</html>

cookie内置对象

<!DOCTYPE html>
<html>
  <head>
    <title>设置cookie的值</title>
  </head>
  <body>
    <%
      //设置cookie的值
      Cookie c = newCookie("username","root");
      //添加cookie到客户端
      response.addCookie(c);
    %>
    <a href="getCookieDemo.jsp">显示cookie的值</a>
  </body>
</html>
 
<span style="color:#000000;"><%@pagelanguage="java"contentType="text/html;charset=gb2312"%>
<!DOCTYPE html>
<html>
  <head>
    <title>取得cookie的值</title>
  </head>
  <body>
    cookie中的username的值为:${cookie.username.value}
  </body>
</html>

?

header内置对象

?
<body>
    ${header["host"]}<br />
    ${header["user-agent"]}<br />
  </body>

initParam内置对象:获取web站点中设置的环境变量

<%@pagelanguage="java"contentType="text/html;charset=gb2312"%>
<!DOCTYPE html>
<html>
  <head>
    <title>获得环境参数</title>
  </head>
  <body>
    username参数值:${initParam.username}<br />
  </body>
</html>
 
<?xml version="1.0"encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  version="2.5">
  <context-param>
    <param-name>username</param-name>
    <param-value>Zhangdapeng</param-value>
  </context-param>
</web-app>

?

pageContex内置对象
用来取得有关用户请求和页面的详细信息

<body>
    <table border="1">
      <tr>
        <td>取得请求的参数的字符串</td>
        <td>${pageContext.request.queryString}</td>
      </tr><tr>
        <td>取得请求URL</td>
        <td>${pageContext.request.requestURL}</td>
      </tr><tr>
        <td>取得web应用名称</td>
        <td>${pageContext.request.contextPath}</td>
      </tr><tr>
        <td>取得HTTP请求方式(POST/GET)</td>
        <td>${pageContext.request.method}</td>
      </tr><tr>
        <td>取得使用的协议</td>
        <td>${pageContext.request.protocol}</td>
      </tr><tr>
        <td>取得用户IP地址</td>
        <td>${pageContext.request.remoteAddr}</td>
      </tr><tr>
        <td>判断session是否为新</td>
        <td>${pageContext.session.new}</td>
      </tr><tr>
        <td>取得session的id</td>
        <td>${pageContext.session.id}</td>
      </tr>
    </table>
  </body>

?

EL存取器:
使用存取器读取JavaBean中的数据

package com.javaweb.ch08;
import java.util.*;
//一个简单的JavaBean示例
public class Person{

  privateStringname;
  private int age;
  privateStringsex;
  private ArrayList friends;
  public Person(){
  }
  public Person(Stringname,int age,Stringsex){
    this.name = name;
    this.age = age;
    this.sex = sex;
  }
  publicStringgetName(){
    return name;
  }
  public int getAge(){
    return age;
  }
  publicStringgetSex(){
    return sex;
  }
  public void setName(Stringname){
    this.name = name;
  }
  public void setAge(int age){
    this.age = age;
  }
  public void setSex(Stringsex){
    this.sex = sex;
  }
  public void setFriends(ArrayList friends){
    this.friends = friends;
  }
  public ArrayList getFriends(){
    return friends;
  }
}

?
?

<%@pagelanguage="java"contentType="text/html;charset=gb2312"%>
<%@pageimport="java.util.*,com.javaweb.ch08.*"%>
<!DOCTYPE html>
<html>
  <head>
    <title>设置JavaBean中的属性</title>
  </head>
  <body>
    <%
    //实例化一个Person
    Person person = newPerson("zhangdapeng",24,"男");
    //创建一个friends实例
    ArrayList friends = newArrayList();
    //添加值
    friends.add("wang wu");
    friends.add("li si");
    person.setFriends(friends);
    //存储在session范围内
    session.setAttribute("person",person);
      
    %>
    <a href="GetJavaBean.jsp">跳转到GetJavaBean.jsp</a>
  </body>
</html>
 
<%@pagelanguage="java"contentType="text/html;charset=gb2312"%>
<!DOCTYPE html>
<html>
  <head>
    <title>取得JavaBean中的属性值</title>
  </head>
  <body>
    姓名:${sessionScope.person.name}<br />
    年龄:${sessionScope.person.age}<br />
    性别:${sessionScope.person.sex}<br />
    朋友:${sessionScope.person.friends[0]},${sessionScope.person.friends[1]}<br />
  </body>
</html>

使用存储器读取Map中的数据

?

<%@pagelanguage="java"contentType="text/html;charset=gb2312"%>
<%@pageimport="java.util.*,com.javaweb.ch08.*"%>
<!DOCTYPE html>
<html>
  <head>
    <title>设置Map页面</title>
  </head>
  <body>
    <%
      //新建一个HashMap
      HashMap userInfo = newHashMap();
      //在HashMap中设置值
      userInfo.put("username","zhangdapeng");
      userInfo.put("password","zhnagda123");
      //将值存储到session范围中
      session.setAttribute("userInfo",userInfo);
        
    %>
    <a href="GetMapDemo.jsp">跳转到GetMapDemo.jsp</a>
  </body>
</html>
 
<%@pagelanguage="java"contentType="text/html;charset=gb2312"%>
<!DOCTYPE html>
<html>
  <head>
    <title>使用存储器读取map中的数据</title>
  </head>
  <body>
    用户名:${sessionScope.userInfo.username}<br />
    密码:${sessionScope.userInfo.password}<br />
  </body>
</html>

使用存储器读取数组中的数据

<%@pagelanguage="java"contentType="text/html;charset=gb2312"%>
<%@pageimport="java.util.*,com.javaweb.ch08.*"%>
<!DOCTYPE html>
<html>
  <head>
    <title>设置Array页面</title>
  </head>
  <body>
    <%
      String[] names = {"zhangda1","zhangda2","zhangda3"};
      //将值存储到session范围中
      session.setAttribute("names",names);
        
    %>
    <a href="GetMapDemo.jsp">跳转到GetArrayDemo.jsp</a>
  </body>
</html>
 
<%@pagelanguage="java"contentType="text/html;charset=gb2312"%>
<!DOCTYPE html>
<html>
  <head>
    <title>使用存储器读取map中的数据</title>
  </head>
  <body>
    用户名1:${sessionScope.names[0]}<br />
    用户名2:${sessionScope.names[1]}<br />
  </body>
</html>

?

存储器的复杂应用

<%@pagelanguage="java"contentType="text/html;charset=gb2312"%>
<%@pageimport="java.util.*,com.javaweb.ch08.*"%>
<!DOCTYPE html>
<html>
  <head>
    <title>设置Array页面</title>
  </head>
  <body>
    <%
      ArrayList<Person> persons = newArrayList<Person>();
        
      Person person1 = newPerson("wang wu",24,"男");
      Person person2 = newPerson("wang liu",24,"女");
        
      persons.add(person1);
      persons.add(person2);
        
      session.setAttribute("persons",persons);
        
    %>
    <a href="GetMapDemo.jsp">跳转到GetArrayDemo.jsp</a>
  </body>
</html>
 
<%@pagelanguage="java"contentType="text/html;charset=gb2312"%>
<!DOCTYPE html>
<html>
  <head>
    <title>使用存储器读取map中的数据</title>
  </head>
  <body>
    用户名1:${sessionScope.persons[0].name},${sessionScope.persons[0].age},${sessionScope.persons[0].sex}<br />
    用户名2:${sessionScope.persons[1].name},${sessionScope.persons[1].age},${sessionScope.persons[1].sex}<br />
  </body>
</html>


?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JSP(JavaServer Pages)是一种服务器端的动态网页开发技术,它可以将 Java 代码嵌入 HTML 页面中,从而实现动态网页的生成。 JSP 的基本原理是将 JSP 页面翻译成 Servlet,在服务器端执行 Servlet 代码,再将执行结果返回给客户端。因此,我们在使用 JSP 开发网页时,需要先了解 Servlet 的相关知识。 JSP 的语法基本上就是 HTML 标签加上 Java 代码。以下是一些基本的 JSP 标签: 1. <% ... %>:嵌入 Java 代码,可以用于定义变量、写循环、判断语句等。 2. <%= ... %>:输出 Java 代码的执行结果。 3. <%-- ... --%>:注释,不会被翻译成 Servlet。 4. <jsp:include ... />:包含其他 JSP 页面或 HTML 页面。 5. <jsp:forward ... />:将请求转发到其他资源(JSP 页面、Servlet 或 HTML 页面)。 6. <jsp:useBean ... />:创建 JavaBean 对象。 7. <jsp:setProperty ... />:为 JavaBean 对象设置属性。 8. <jsp:getProperty ... />:取得 JavaBean 对象的属性值。 在 JSP 页面中,我们还可以使用 EL 表达式和 JSTL 标签库来简化代码编写,提高开发效率。 EL(Expression Language)表达式是一种简化的表达式语言,可以用于取值、赋值、计算等操作。例如,${name} 表示取得名为 name 的变量的值。 JSTL(JavaServer Pages Standard Tag Library)是一套标签库,提供了循环、条件判断、格式化、国际化等常用功能的标签。例如,<c:forEach> 标签可以用于循环遍历集合,<c:if> 标签可以用于条件判断。 除了以上标签库,JSP 还支持自定义标签库。我们可以通过编写标签处理器来扩展 JSP 的功能。 JSP 的优点是可以将 Java 代码嵌入 HTML 页面中,使得网页的开发更加灵活和方便。但是,由于 JSP 页面需要翻译成 Servlet,因此会增加服务器的负担和响应时间。此外,JSP 页面中夹杂着 Java 代码,也不利于代码的维护和调试。因此,在开发大型网站时,建议使用 MVC 设计模式,将业务逻辑和视图分离,使得代码更加清晰和易于维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值